mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Do 25.04.2024 03:22 Benutzername: Passwort: Auto-Login

Thema: [solved] Wie skinne ich ein <form> <select> drop down? vom 09.05.2008


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Allgemeines - Nonprint -> [solved] Wie skinne ich ein <form> <select> drop down?
Autor Nachricht
Kai.S
Threadersteller

Dabei seit: 20.12.2005
Ort: München
Alter: 41
Geschlecht: Männlich
Verfasst Fr 09.05.2008 11:05
Titel

[solved] Wie skinne ich ein <form> <select> drop

Antworten mit Zitat Zum Seitenanfang

Hey Leute,

gibt es eine Möglichkeit ein "<form> <select> <option>"-Gebilde komplett zu skinnen?

Also Pfeile, Laufbar etc. alles mit Grafiken zu versehen? Mit CSS-only ist ja nicht viel drin *Schnief*

Gerne kann das auch eine JavaScript-Nachbau-Variante sein, falls ihr sowas habt oder wisst wos das gibt, Google hat nix ausgespuckt, tu mich aber mit Keywords auch schwer.

Danke

Kai

EDIT:
OK so gehts:
http://mediavrog.net/development/mootools/customFormElements/1.8b/
http://www.cult-f.net/2007/12/14/elselect/


Zuletzt bearbeitet von Kai.S am Fr 09.05.2008 11:25, insgesamt 2-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
m
Moderator

Dabei seit: 18.11.2004
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Fr 09.05.2008 11:26
Titel

Antworten mit Zitat Zum Seitenanfang

Zum Beispiel: http://blog.davglass.com/files/yui/dhtmlforms/

Oder einfach mal die Suche benutzen das Thema gab es schon häufig.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 09.05.2008 11:27
Titel

Antworten mit Zitat Zum Seitenanfang

Ich hab sowas, basiert auf prototype (prototypejs.org) Aber damit musste dann selbst klarkommen, ist aber eigentlich nicht sooo schwer, allerdings ein wenig css-fummelei.

1. prototype.js (1.6.0) einbinden
2. MyNamespace.xyz durch DeinNamespace.xyz ersetzen.
3. Initialisierungsfunktionen anpassen
4. window.onload => DeinNamespace.initMagicDropdowns( collectionOfSelectElements) aufrufen.
5. Das Zeug mit css durchstylen.

Code:

MyNamespace.initMagicDropdowns = function ( selectList )
{
   selectList.each ( function (select)
   {
      var options = {};
      if ( select.hasClassName ('noFullText'))
      {
         options.fulltext = false;
      }
      new MyNamespace.MagicDropdown ( select,options );
   });
}

MyNamespace.removeMagicDropdowns = function ( node )
{
   node.select ( 'div.magicDropdown' ).each ( function ( div ) 
   {
      div.remove();
   });
}

MyNamespace.MagicDropdown = Class.create();
MyNamespace.MagicDropdown.activeLists = [];
MyNamespace.MagicDropdown.addMethods
({
   initialize : function ( select, options )
   {
      this.select = $(select);
      select._magicDropdown = this;
      this.aliasList = {};
      this.linkCollection = [];
      this.currentSelectedLink = null; // Der Momentan ausgewählte Link
      
      this.textField = null;
      this.overallWrapper = {};
      this.freeText = null;
      
      this.aliasListIsOpen = false;
      
      this.activeLink = null;         // Der Link, der oben über der Liste steht
      this.activeParagraph = null;    // <p>aktiver Eintrag</p><ul>...
      
      this.disabled=false;
      
      this.options = {
         'fulltext'   : true,         // Mit Volltext-Feld?
         'matchColor': '#000',      // Farbe der Einträge
         'missColor'   : '#999',      // Farbe, wenn Eingabe nicht mit Inhalt übereinstimmg
         'offsetTop'   : -1,          // Abstand des Popups zum Formularfeld
         'disabledColor': '#ccc',
         'zIndex'      : 1000      // zIndex
      }
      
      if ( options )
      {
         for ( var i in options )
         {
            this.options[i] = options[i];
         }
      }
      
      // mach et!
      this.transform();
   },
   transform:function()
   {
      this.getHTML();
      this.bindEvents();
      this.styleIt();
      
   },
   styleIt: function()
   {
      this.select.setStyle({
         display:'none'
      })
      
      this.aliasList.setStyle({'position':'absolute'});
      
      this.aliasList.setStyle({
         display:'none',
         zIndex : this.zIndex
      },this);
      
      if ( this.disabled )
      {
         this.overallWrapper.setStyle({
            backgroundColor:this.options.disabledColor
         });
      }
   },
   positionIt:function()
   {
      var pos = this.overallWrapper.cumulativeOffset();
      var width = this.overallWrapper.down('p').getWidth();
      this.aliasList.setStyle({
         left:pos[0] + "px",
         top:pos[1] + this.overallWrapper.getHeight() + this.options.offsetTop + "px",
         'minWidth':width + "px"
      });
   },
   toggleAliasList: function ()
   {
      if ( this.aliasListIsOpen )
      {
         this.activeParagraph.removeClassName( 'active' );
         this.activeLink.removeClassName('active');
         
         this.aliasList.setStyle({
            display:'none'
         });
         delete MyNamespace.MagicDropdown.activeLists[ MyNamespace.MagicDropdown.activeLists.indexOf ( this ) ];
      }
      else
      {
         this.positionIt();       // neu positionieren
         
         this.activeParagraph.addClassName ( 'active' );
         this.activeLink.addClassName('active');
         this.aliasList.setStyle({display:'block'}); // liste ein- und ausklappen
         
         if ( MyNamespace.MagicDropdown.activeLists.length > 0)
         {
            MyNamespace.MagicDropdown.activeLists.each ( function ( list )
            {
               list.toggleAliasList();
            },this);
         }
         
         MyNamespace.MagicDropdown.activeLists.push ( this );
      }
      this.aliasListIsOpen = ! this.aliasListIsOpen ;
   },
   bindEvents : function()
   {
      if ( this.disabled ) return;
      
      // Toggle link überwachen
      this.activeLink.observe('click', function (ev)
      {
         Event.stop(ev);
         this.toggleAliasList();
         
      }.bindAsEventListener(this));
      
      // Links in der Liste überwachen
      this.linkCollection.each ( function ( optionLink )
      {
         optionLink.observe('click', function(ev)
         {
            Event.stop ( ev );
            
            this.select.disabled = false;
            
            if ( this.freeText )
            {
               this.freeText.disabled = true;
            }
            
            // alte active-klasse markieren
            if ( this.currentSelectedLink )
            {
               this.currentSelectedLink.removeClassName('active');
            }
            this.activeLink.update ( optionLink.innerHTML ); // fake-liste
            optionLink.addClassName('active');
            this.currentSelectedLink = optionLink;
            
            // reicht das? mal sehen...
            this.select.setValue ( this.getOptionValue ( optionLink._option ));
            optionLink._option.selected = true;
            
            this.toggleAliasList(); // Liste nach Auswahl wieder zuklappen
            
         }.bindAsEventListener(this));
      },this);
      
      // Frei-Textfeld Kann abgeschaltet werden (options-objekt)
      if ( this.textField )
      {
         this.textField.observe('focus', function(ev)
         {
            this.textField.activate();
         }.bindAsEventListener(this));
         
         this.textField.observe('keyup',function(ev)
         {
            Event.stop(ev);
            
            // checken, obs eine entsprechung gibt.
            this.linkCollection.each ( function ( optionLink )
            {
               var expr = '/^.*' + this.textField.getValue() + '.*$/i';
               var test;
               eval ( "test=optionLink.innerHTML.search ( " + expr + ")"); // Kacke...
               
               optionLink.setStyle({
                  color:this.options.matchColor
               })
               
               if ( test === -1 )
               {
                  optionLink.setStyle({
                     color:this.options.missColor
                  });
               }
            },this);
            
            if ( ev.keyCode == Event.KEY_RETURN )
            {
               Event.element(ev).blur();
               
               if ( this.textField.getValue() != '')
               {
                  if (this.currentSelectedLink)
                  {
                     this.currentSelectedLink.removeClassName('active');
                     this.currentSelectedLink = null;
                  }
                  
                  if ( this.freeText )
                  {
                     this.freeText.disabled    = false;
                  }
                  this.select.disabled    = true;
                  
                  var value = this.textField.getValue();
                  this.activeLink.update(value);
                  this.freeText.setValue ( value );
                  this.select.disabled = true;
               }
               this.toggleAliasList();
            }
            
         }.bindAsEventListener(this));
      }
      document.observe('VDA:tabswitch', function ( ev )
      {
         if ( this.aliasListIsOpen )
         {
            this.toggleAliasList();
         }
      }.bindAsEventListener(this));
   },
   getHTML: function ()
   {
      if ( this.select.disabled )
         this.disabled = true;
      var overallWrapper = $(document.createElement ('div')); // der wrapper fürs formular, im form-tag verankert.
         overallWrapper.addClassName (this.select.className );
      
      var listWrapper = $(document.createElement('ul')); // die liste mit den auswahlmöglichkeiten, am body verankert.
         listWrapper.addClassName('magicDropdown');
      
      // Toggle-Link erzeugen
      var activeWrapper = $(document.createElement ( 'p' ));
      
      var activeLink    = $(document.createElement ( 'a' ));
         activeLink.title = 'Bitte auswählen';
         activeLink.update ('Bitte auswählen');
      
         activeWrapper.appendChild ( activeLink );
      
      if ( this.disabled )
         activeWrapper.addClassName('disabled');
      
      // listenelemente erzeugen
      this.select.select('option').each ( function ( option )
      {
         var listItem = $(document.createElement ( 'li' ));
         var optionLink = $(document.createElement('a'));
            optionLink.update(option.text);
            optionLink.href='javascript:void(0)';
            // backreferences for easy access
            optionLink._option = option;
            option._optionLink = optionLink;
         
         if ( option.selected === true )
         {
            activeLink.rel=option.value;
            
            if ( ! this.disabled )
            activeLink.href=option.value;
            activeLink.title = option.text;
            activeLink.update(option.text);
            activeLink.addClassName('active');
            
            this.currentSelectedLink = option._optionLink;
            option._optionLink.addClassName('active');
         }
         
         this.linkCollection.push ( optionLink );
         
         listItem.appendChild ( optionLink );
         listWrapper.appendChild ( listItem );
         
      },this);
      
      if ( this.options.fulltext )
      {
         // Input Feld erzeugen
         var inputWrapper = $(document.createElement ('li'));
         var inputField = $(document.createElement ('input'));
            inputField.type = 'text';
            //inputField.name = this.select.name;
            inputField.setValue();
            inputWrapper.appendChild ( inputField );
         listWrapper.appendChild ( inputWrapper ); // input-element dran hängen

         // Freie option für select
         var freeText       = $(document.createElement ( 'input' ));
            freeText.type   = 'hidden';
            freeText.name    = this.select.name;
         
         this.textField    = inputField;
         this.freeText = freeText;
         this.freeText.disabled = true;
         overallWrapper.appendChild ( this.freeText );
      }
      
      overallWrapper.appendChild  ( activeWrapper );// ist das p
      //overallWrapper.appendChild ( listWrapper );
      
      // Liste als Eigenschaft zuweisen
      this.overallWrapper      = overallWrapper;
      this.aliasList          = listWrapper;
      this.activeLink       = activeLink;
      this.activeParagraph    = activeWrapper;
      
      // ins dom reinmachen
      this.select.parentNode.insertBefore(overallWrapper,this.select);
      document.body.appendChild (listWrapper);
   },
   getOptionValue : function (option)
   {
      return option.value ? option.value : option.innerHTML;
   }
});
  View user's profile Private Nachricht senden
rob

Dabei seit: 11.12.2003
Ort: ~/
Alter: 46
Geschlecht: Männlich
Verfasst Fr 09.05.2008 11:31
Titel

Antworten mit Zitat Zum Seitenanfang

Zitat:
gibt es eine Möglichkeit ein "<form> <select> <option>"-Gebilde komplett zu skinnen?

Dazu gibt es CSS.
Zitat:
Also Pfeile, Laufbar etc. alles mit Grafiken zu versehen?

Das sind Elemente des Browsers. Die kannst du nicht einfach austauschen und solltest das auch nicht versuchen.

Zitat:
Gerne kann das auch eine JavaScript-Nachbau-Variante sein

Das wäre dann auch deine einzige Möglichkeit, wenn du kein Flash nimmst. Dann mußt du aber verdammt viel beachten. Deine Scrollbars müßten dann beispielsweise auch mit dem Mausrad zu bedienen sein, usw..
Laß einfach die Finger von den Browser-eigenen Elementen. Das ist das Beste, was du machen kannst.
Nimm dem User nicht seine gewohnten Einstellungen.
  View user's profile Private Nachricht senden
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 09.05.2008 12:27
Titel

Antworten mit Zitat Zum Seitenanfang

Da is was dran. Trotzdem kann das in Einzelfällen (!) sinnvoll sein, vorausgesetzt, man bietet entspr. Fallbacklösungen an. Ich bin immer dafür, Javascript "draufzupappen" anstatt durch Javascript zu erzeugen (wie YUI das bspw. gern macht).
  View user's profile Private Nachricht senden
choise

Dabei seit: 01.02.2007
Ort: Würzburg
Alter: 35
Geschlecht: Männlich
Verfasst Fr 09.05.2008 12:30
Titel

Antworten mit Zitat Zum Seitenanfang

hab da auch was ganz nettes..

http://www.badboy.ro/articles/2005-07-23/niceforms_preview/
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
m
Moderator

Dabei seit: 18.11.2004
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Fr 09.05.2008 12:37
Titel

Antworten mit Zitat Zum Seitenanfang

choise hat geschrieben:
hab da auch was ganz nettes..

http://www.badboy.ro/articles/2005-07-23/niceforms_preview/


Das ist aber im Gegensatz zu anderen (moderneren) Lösungen einfach nichts, die Selectboxen sind ok, aber
die Input (checkbox, radio) replacements sind echt nichts.

Edit: da fällt mir noch ein, ext js: http://extjs.com/deploy/dev/examples/form/combos.html


Zuletzt bearbeitet von m am Fr 09.05.2008 12:59, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Kai.S
Threadersteller

Dabei seit: 20.12.2005
Ort: München
Alter: 41
Geschlecht: Männlich
Verfasst Fr 09.05.2008 12:58
Titel

Antworten mit Zitat Zum Seitenanfang

Danke für eure tollen Vorschläge

richtig, ich will das ja nur enhancen per JS mit Fallback das ist klar

http://mediavrog.net/development/mootools/customFormElements/1.8b/
http://www.cult-f.net/2007/12/14/elselect/

Sind eigentlich die beiden besten Lösungen imho
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ähnliche Themen Drop-Down bzw Select Box stylen - per Javascript
Select Form mit individuellen Mails pro Option
[SOLVED] Select & Input text kombinieren
PHP Form [Solved]
Problem mit <form> und höhe in ie --------solved
[solved]CSS Problem im IE bei form input und label
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Allgemeines - Nonprint


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.