Diese Idee stammt von Veer.com und deren Umgang mit Dropdowns für Dinge wie T-Shirt-Größen. Vielen Dank an Dennis Sa.
HTML
Wir werden ein reguläres Texteingabefeld in ein <div> einbetten, das auch eine ungeordnete Liste enthält, die die Werte für das Popup-Menü darstellt.
<div class="size">
<input type="text" name="test" value="choose your size" class="field" readonly="readonly" />
<ul class="list">
<li>Male - M</li>
<li>Female - M</li>
<li>Male - S</li>
<li>Female - S</li>
</ul>
</div>
CSS
Die Listen werden standardmäßig ausgeblendet, sind aber trotzdem komplett gestylt und bereit, wenn ein Klick sie zum Anzeigen auslöst.
.size { position:relative }
.size .field {
width:300px; background:#EC6603; color:#fff; padding:5px; border:none; cursor:pointer;
font-family:'lucida sans unicode',sans-serif; font-size:1em;
border:solid 1px #EC6603;
-webkit-transition: all .4s ease-in-out;
transition: all .4s ease-in-out;
}
.size .field:hover {
border:solid 1px #fff;
-moz-box-shadow:0 0 5px #999; -webkit-box-shadow:0 0 5px #999; box-shadow:0 0 5px #999
}
.size>ul.list { display:none;
position:absolute; left:30px; top:-30px; z-index:999;
width:300px;
margin:0; padding:10px; list-style:none;
background:#fff; color:#333;
-moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;
-moz-box-shadow:0 0 5px #999; -webkit-box-shadow:0 0 5px #999; box-shadow:0 0 5px #999
}
.size>ul.list li {
padding:10px;
border-bottom: solid 1px #ccc;
}
.size>ul.list li:hover {
background:#EC6603; color:#fff;
}
.size>ul.list li:last-child { border:none }
jQuery
Wir werden ein schnelles Plugin zusammenstellen, damit diese Funktionalität für jede div-Hülle aufgerufen werden kann, die dieselbe HTML-Struktur enthält.
(function($){
$.fn.styleddropdown = function(){
return this.each(function(){
var obj = $(this)
obj.find('.field').click(function() { //onclick event, 'list' fadein
obj.find('.list').fadeIn(400);
$(document).keyup(function(event) { //keypress event, fadeout on 'escape'
if(event.keyCode == 27) {
obj.find('.list').fadeOut(400);
}
});
obj.find('.list').hover(function(){ },
function(){
$(this).fadeOut(400);
});
});
obj.find('.list li').click(function() { //onclick event, change field value with selected 'list' item and fadeout 'list'
obj.find('.field')
.val($(this).html())
.css({
'background':'#fff',
'color':'#333'
});
obj.find('.list').fadeOut(400);
});
});
};
})(jQuery);
Verwendung
Dann rufen wir das Plugin auf, wenn der DOM fertig geladen ist, versteht sich.
$(function(){
$('.size').styleddropdown();
});
Das ist ein wirklich schönes Plugin. Ich frage mich nur, ob es eine Möglichkeit gibt, dies mit einem select-Element zu tun.
Dann verwende jQuery, um das select-Element in die obige Markierung umzuwandeln. Ist das möglich?
Man könnte es wahrscheinlich auch mit dem select-Element machen. Es würde jedoch einige zusätzliche Besonderheiten erfordern. Anstelle eines Inputs, wie es jetzt der Fall ist, müsste es einfach ein div oder etwas Ähnliches sein. Wenn JavaScript geladen wird, würde es eine UL aus dem select-Element erstellen, aber sowohl das select als auch die UL versteckt halten. Dann würde beim Klicken auf das div die UL wie jetzt angezeigt werden, und beim Klicken auf ein Listenelement würde der Text des divs auf die Auswahl gesetzt UND der Wert des versteckten select-Elements geändert. Etwas komplizierter, aber machbar und wahrscheinlich eine bessere Wahl in Fallback-Szenarien.
Die Demo ist aufgrund eines Tippfehlers im schließenden Titel-Tag defekt.
Das klingt wirklich interessant, ich werde versuchen, es in mein nächstes Design zu integrieren.
nur ein kleiner
===
var obj = $(this)
===
anstelle von
obj = $(this)
ermöglicht es Ihnen, mehrere Elemente zu haben...
kr, tara
funktioniert natürlich nicht in IE6...
(codieren die Leute immer noch für IE6?)
Nein.
yap
vielen Dank für das Teilen eines so informativen Beitrags. Alles, was ich aus Ihrem Code gelernt habe, ist die Behandlung von keyup- und keydown-Ereignissen. Danke
Danke Chris, dass du den Ausschnitt vorgestellt hast.
@John Valis, ich dachte irgendwie, dass Key-Events nützlich sein könnten :)
Wunderbarer Effekt, ich dachte immer, ich müsste ein Optionsfeld anpassen, um diese Formatierung zu erreichen. Auf mobilen Websites sollte dies eine wertvolle UX-Ergänzung sein. Auf der anderen Seite würde ich empfehlen, die Eigenschaft unselectable="on" zum Eingabefeld hinzuzufügen.
Wenn Sie dies unter IE 7/8 testen, sehen Sie den blinkenden Cursor selbst unter der Liste, und das Hinzufügen dieser Eigenschaft stellt sicher, dass er verschwindet.
Danke!
Ich versuche, mehrere Selectboxen hinzuzufügen, aber es funktioniert einfach nicht richtig.
nur ein kleiner
===
var obj = $(this)
anstelle von
obj = $(this)
Schönes Ding, aber es wäre viel cooler, wenn es Tastaturunterstützung hätte :-) wie das Mac-Style-Popup, weiter so
Bin ich der Einzige, oder bricht das, wenn man der Klasse .size einen Namen mit einem Bindestrich gibt? Wenn ich alle Referenzen von .size zu z.B. .tool-tip ändere, funktioniert nichts mehr.
Habe dies zum Laufen gebracht und auf der Toolbar in Magento 1.5.1.0 (mit jq 1.4.2) verwendet...
Wurde sowohl für die Paginierung "sortieren nach" als auch für "pro Seite anzeigen" verwendet.
Für zwei Instanzen fügen Sie dies mit No Conflict zu jQuery hinzu (möglicherweise müssen Sie den Selektor jQuery() zu $() ändern)
jQuery hinzugefügt/geändert, sodass ein Preloader vorhanden ist, wenn ein Link geklickt wurde (verwendet den Magento-Checkout-Preloader!)
(fügen Sie dies zur Datei template/page/html/head.phtml hinzu)
dies zu den CSS hinzugefügt (verwendet, um einen Fehler in der zweiten Instanz zu beheben)
Sobald jQuery und CSS erfolgreich geladen sind, sind sie vorhanden
... Ich habe dann template/catalog/product/list/toolbar.phtml mit... bearbeitet
Zeilen 53 bis 65 auskommentiert mitund fügen Sie diesen Code zwischen der div-Klasse "sort-by" ein...
(alles basierend auf der "sort"-Konfiguration (zu finden unter System->Konfiguration->Katalog) wird im Adminbereich festgelegt – also Parameter einstellen/abgleichen, wie sie im Adminbereich gespeichert sind)
und auch in den Zeilen 70 bis 77 auskommentieren über <!– –>
und in der div-Klasse "limiter" diesen Code einfügen....
(alles basierend auf der "sort"-Konfiguration (zu finden unter System->Konfiguration->Katalog) wird im Adminbereich festgelegt – also Parameter einstellen/abgleichen, wie sie im Adminbereich gespeichert sind)
funktioniert so, wie ich es wollte
Haben Sie schon einmal gehört, dass man in PHP auch Schleifen (wie 'for' und 'while') verwenden kann?
Also anstatt diesem
<a href="getCurrentUrl() ?>?limit=5">5
<a href="getCurrentUrl() ?>?limit=10">10
<a href="getCurrentUrl() ?>?limit=15">15
<a href="getCurrentUrl() ?>?limit=20">20
<a href="getCurrentUrl() ?>?limit=25">25
<a href="getCurrentUrl() ?>?limit=all">Alle
man könnte so etwas schreiben
<?php printf("%s", $this->getCurrentUrl(), $limit, ucfirst("$limit")) ?>
Wie weist man Aktionen zu, wenn eine Option ausgewählt wird?
Ich habe ein Problem damit in iOS Safari. Das Problem ist, dass es keine Möglichkeit gibt, das Menü zu schließen, sobald es geöffnet ist. Gibt es eine Lösung dafür? Danke!
Ich kann auf derselben Seite nicht zwei gleichzeitige Styledropdowns mit unterschiedlichen Wertesätzen erstellen.
Könnten Sie mir bitte ein funktionierendes Beispiel dafür zur Verfügung stellen?
Auch der Code für die beiden oben in den Kommentaren erwähnten Styledropdowns funktioniert nicht
Vielen Dank,
Umang
Großartig!