Die Website Five Simple Steps hat ein responsives Design mit einer schicken Funktion. Wenn das Browserfenster schmal ist, wandelt sich das Menü oben rechts von einer normalen Link-Reihe in ein Dropdown-Menü.

Wenn Sie sich auf einem kleinen Bildschirm (hier ein iPhone) befinden und auf das Dropdown klicken, erhalten Sie eine Oberfläche zur Auswahl einer Option, wobei jede Option schön groß und einfach auszuwählen ist.

Das macht die Auswahl eines Ziels einfacher als ein winziger Link. Ja, es sind zwei Taps statt einem, aber das ist diskutabel, da Sie wahrscheinlich ohnehin hineinzoomen müssten, um den richtigen Link zu treffen.
Das HTML
Das HTML für diese beiden Menüs ist unterschiedlich. Soweit ich weiß, können Sie <select> und <option> Elemente nicht so gestalten, dass sie wie <a>s aussehen und sich so verhalten oder umgekehrt. Wir brauchen also beides. Sie könnten beides einfach in das Markup einfügen. Das macht Five Simple Steps auch so.
<nav>
<ul>
<li><a href="/" class="active">Home</a></li>
<li><a href="/collections/all">Books</a></li>
<li><a href="/blogs/five-simple-steps-blog">Blog</a></li>
<li><a href="/pages/about-us">About Us</a></li>
<li><a href="/pages/support">Support</a></li>
</ul>
<select>
<option value="" selected="selected">Select</option>
<option value="/">Home</option>
<option value="/collections/all">Books</option>
<option value="/blogs/five-simple-steps-blog">Blog</option>
<option value="/pages/about-us">About Us</option>
<option value="/pages/support">Support</option>
</select>
</nav>
Bleiben wir vorerst dabei.
Das CSS
Standardmäßig verstecken wir das Select-Menü mit display: none;. Das ist tatsächlich gut für die Zugänglichkeit, da es das redundante Menü für Screenreader versteckt.
nav select {
display: none;
}
Dann verwenden wir Media Queries, um bei einer bestimmten Breite den Wechsel vorzunehmen. Das können Sie selbst bestimmen (hier gibt es einige Standard-Breakpoints).
@media (max-width: 960px) {
nav ul { display: none; }
nav select { display: inline-block; }
}
Aber jetzt müssen Sie zwei Menüs pflegen?
Ja, das ist ein Bedenken. Vielleicht werden Ihre Menüs dynamisch erstellt und Sie können die Ausgabe nicht einfach steuern. Vielleicht erstellen Sie Menüs von Hand, möchten aber sicherstellen, dass Sie Ihre Menüs nicht versehentlich aus dem Takt bringen. Eine Möglichkeit, dem entgegenzuwirken, besteht darin, das Dropdown-Menü dynamisch aus dem Original zu erstellen.
Mit jQuery können wir das mit nur wenigen Codezeilen erledigen.
// Create the dropdown base
$("<select />").appendTo("nav");
// Create default option "Go to..."
$("<option />", {
"selected": "selected",
"value" : "",
"text" : "Go to..."
}).appendTo("nav select");
// Populate dropdown with menu items
$("nav a").each(function() {
var el = $(this);
$("<option />", {
"value" : el.attr("href"),
"text" : el.text()
}).appendTo("nav select");
});
Damit das Dropdown-Menü tatsächlich funktioniert…
$("nav select").change(function() {
window.location = $(this).find("option:selected").val();
});
Aber sind Dropdown-Menüs nicht irgendwie aufdringlich?
Ein bisschen. Die meisten kleinen Bildschirme sind heutzutage mobil, und die meisten mobilen Geräte sind JavaScript-freundlich, also keine große Sorge. Aber wenn Sie sicherstellen wollen, dass dies mit oder ohne JavaScript funktioniert habe ich einen Artikel darüber.
Demo & Download
Demo ansehen Dateien herunterladen
Video
Schnelles Video-Beispiel, falls Sie dies von einem Ort aus lesen, an dem Sie die Browsergröße nicht anpassen und damit spielen können, um zu sehen, worüber wir hier reden.
Varianten
- Eine Variante des gleichen Konzepts, bei der es verschachtelte Menüs gibt und aus den Eltern-Kind-Beziehungen Optgroups im Select erstellt werden.
- Untermenüs mit einem Strich von Daryn St. Pierre
Das bringt mich zum Lachen. Ich habe gerade heute Morgen eine Stunde damit verbracht, nach der Lösung für dieses Problem zu googeln. Sie sind Spitze, mein Herr.
Ich persönlich hasse Dropdown-Menüs für Links. Aber das könnte in manchen Situationen nützlich sein (wie auf der Beispiel-Website, die Sie gefunden haben).
Außerdem hasse ich die Redundanz. Die Verwendung von jQuery, um das zu beheben, ist meiner Meinung nach nicht viel besser.
Das ist cool. Eine gute Option für große Navigationsmenüs. Ich glaube nicht, dass ich es für kleine Menüs verwenden würde.
JQuery ist hier wirklich redundant. Sie können dasselbe leicht mit DOM und sogar ES5-Methoden machen. Aktuelle mobile Browser-Engines sind modern genug, sodass Sie sich keine Sorgen um alte und eingeschränkte Engines wie IE machen müssen.
Jedes einzelne Ding, das jQuery tun kann, ist redundant, weil es nur JavaScript ist und stattdessen so geschrieben werden könnte. Ich benutze es hier, weil es den Code, den ich schreibe und präsentiere, auf wenige Zeilen reduziert. Aber verdammt, Mann, schreibe den Mist in dem, was auch immer du für dein Projekt am besten hältst.
Chris, du hast 'in' zweimal geschrieben (zwischen sh*t und whatever).
Ja, aber was ist mit Windows Phone 7?
Aaron, korrigierst du ihn gerade, weil er „in“ zweimal in einem Kommentar geschrieben hat??? Komm schon, Mann... hast du nichts Besseres zu tun?
Adam, ich habe gerade einen Rechtschreibfehler entdeckt. Ich wollte Chris nur informieren. Wenn es unhöflich klang, dann bitte ich um Entschuldigung.
Ich habe display:none für viele Dinge bei der Verwendung von Media Queries verwendet, aber es fühlt sich an, als würde ich schummeln.
Ich würde mir darüber keine Sorgen machen, am Ende des Tages müssen Sie tun, was für Ihre Benutzer am besten ist, und die Verwendung von display: none verbirgt die zusätzliche Navigation vor Screenreadern, sodass es keine Zugänglichkeitsprobleme zu geben scheint.
Oder meinten Sie, dass display:block sich anfühlt, als würden Sie bei display: inline-block schummeln? Ich fühle mich manchmal ein bisschen näher an bestimmten CSS-Selektoren, als ich es sollte.
Die Demo scheint auf meinem iPhone nicht zu funktionieren. Sie wird als Menü angezeigt, nicht als Dropdown.
Dasselbe hier! funktionierte nicht auf meinem iPhone 4. Ich werde mir den Code ansehen und sehen, was passiert ist.
Die Demo-Seite ist keine mobilefreundliche Seite. In Ihrer Implementierung würden Sie das Meta-Tag verwenden, um die Ansicht auf die Gerätebreite einzustellen, und dann würde die Media Query wie erwartet funktionieren.
Ich mag es. Ich hätte nie daran gedacht, ein Select als Navigationselement zu verwenden ... aber es scheint für mobile Geräte sinnvoll zu sein.
Ich muss sagen, das war eine interessante Lösung.
Muss es bald auf einer Website ausprobieren =)
Sauberer kleiner Trick, das muss ich sagen.
Sehr gut, aber ich denke, wenn das Fenster zu klein ist, sollte die Navigation vertikal werden, anstatt sich in ein Select zu verwandeln.
Semantisch gesehen wird ein Select verwendet, um Optionen in einem Formular auszuwählen, in Fällen, in denen eine Freitext-Eingabe nicht erlaubt sein sollte (Wählen Sie Ihr Geschlecht: [Männlich] [Weiblich] usw.).
Dieses Argument ist ähnlich dem Argument, Links nicht als JavaScript-Subjekte zu verwenden (href=#), sondern stattdessen Buttons zu verwenden, da dies ihr Zweck ist (eine Aktion auf der Seite ausführen).
Kurz gesagt, <select>-Elemente sollten nicht in der Navigation verwendet werden, sondern als Formularelement. Deshalb ist die <ul> da.
Ich stimme Ihrem Argument teilweise zu, dass ein nicht semantisch korrekt ist, aber ich denke, bei der Gestaltung für Mobilgeräte kann die Semantik manchmal zugunsten der Funktionalität beiseite gelegt werden, da Mobilgeräte noch in den Kinderschuhen stecken und sich noch viel entwickeln müssen.
Und, nur als Nebenbemerkung, das Geschlechtsbeispiel ist auch nicht korrekt, dafür sollten Radioknöpfe verwendet werden.
Ich stimme Pieter zu.... wir wollen definitiv semantisch geeignete Elemente so weit wie möglich verwenden, aber nicht auf Kosten des Benutzererlebnisses, ich denke, der Kompromiss lohnt sich hier.
Wow… ich mag diesen Trick.. wo ist dann der +1 Button ?? :)
Fantastischer Trick, werde ich implementieren
Ich würde gerne wissen, wie Sie Ihre Website so angepasst haben, dass sie auf so viele verschiedene Browsergrößen passt.
Ich verwende genau dieselbe Methode auf meiner Website! Ich habe sie auf der Website von Yaron Schoen gesehen. Wenn Sie ein dynamisches Dropdown aus Ihren WordPress-Seiten generieren möchten, verwenden Sie einfach diese Funktion: wp_list_pages()
Sehr sauberer kleiner Trick, danke Chris!
Ja, schön!
Wirklich schön, ich würde auch einen „Springe zu:“ Text davor erscheinen lassen.
Genial. Schon wieder. Danke fürs Teilen.
Das ist sehr nützlich zu wissen, besonders da heutzutage so viele Leute mit mobilen Geräten im Internet surfen. Danke nochmals für einen weiteren erstaunlichen Artikel, Chris!!
Sehr nützliches Tutorial. Danke fürs Teilen, Chris!
Es ist wirklich schön... :)
Es ist ein schöner Effekt, aber das fivesimplesteps.com-Menü wird bei etwa 767px zu einem Dropdown, scheint das nicht zu groß zu sein? Mit anderen Worten, ist das Fenster nicht *wirklich* klein, um ein Dropdown zu rechtfertigen?
Sehr schöner Trick, Chris... du bist einer meiner 5 am Tag!
Nur ein kleiner Tipp, wenn Sie wie ich sind und sich das Leben leichter machen und die Aktualisierung beschleunigen möchten, könnten Sie ein PHP-Array verwenden oder das Menü dynamisch aus einer Datenbank beziehen, sodass Sie die Menüdaten nur einmal bearbeiten/hinzufügen/entfernen müssen, dann verwenden Sie eine Schleife für den Select und den ul-Teil.
Select
Ich sage es ganz offen, dass dies Eigenwerbung ist, aber es ist die Art, bei der ich kein Geld verdiene, also hoffe ich, dass das in Ordnung ist, es hier zu posten.
Ich habe gerade ein WordPress-Plugin veröffentlicht, das ein Menü, das Sie im Admin-Bereich erstellen, als Dropdown generiert. Sie könnten es nach einem Aufruf von
wp_nav_menu()in einem Theme verwenden, um genau das zu tun, was dieser Artikel zeigt, aber mit der vollständigen Steuerung über das Menü-Admin.Link
http://wordpress.org/extend/plugins/dropdown-menus/
Codebeispiel
Großartig, Chris! Werde das definitiv in meinen Projekten verwenden. Danke!
Hallo Chris! Gute Idee und exzellente Umsetzung. Danke fürs Teilen!
Chris, das ist einfach eine großartige Idee. Responsive Webdesign wird jeden Tag beliebter.
Hallo Chris, ich habe kürzlich versucht, etwas Ähnliches zu bauen, aber ich wollte verschachtelte ULs in Optgroups umwandeln (denken Sie daran, ein Dropdown-Nav in ein Select-Nav umzuwandeln). Ich habe es nicht ganz so hinbekommen, wie ich wollte, also habe ich die Frage auf Stackoverflow gepostet und 'Enki' hat zwei großartige Lösungen geliefert; schaut es euch an!
http://stackoverflow.com/questions/6797684/convert-ul-to-select-w-optgroups
// Dropdown aus dem Menü erstellen
var markUp = [“”], $li, $a;
$(“#menu > li”).each(function(){
$li = $(this);
if($li.find(“ul > li”).length){
markUp.push(“a”).text()+”‘>”);
$li.find(“ul > li”).each(function(){
$a = $(this).find(“a”);
markUp.push(“”+$a.text()+””)
});
markUp.push(“”);
}
else{
$a = $li.find(“a”);
markUp.push(“”+$a.text()+””)
}
});
markUp.push(“”);
$(“#menu”).append(markUp.join(”));
$(“#menu select”).change(function(){ window.location = $(this).val(); });
Schön, aber ich mag es nicht, dass Sie entweder ungenutzte Tags in Ihrem HTML haben oder auf JavaScript angewiesen sind. Keines von beiden ist die beste Lösung.
Hallo Chris.
Ich hoffe, es ist Ihnen nichts ausmacht. Ihr Artikel hat mich zum Nachdenken gebracht. Hier ist, was herauskam: http://www.itmitica.com/en/articles/css3/s-menu/
Kurz gesagt, das Container-Element für die Menülinks sollte sich entsprechend verhalten und scrollbare Mittel und einen begrenzten Raum bieten, um das Menü für kleine Bildschirme benutzerfreundlicher zu gestalten.
Ich persönlich denke, dieses Beispiel ist ein Rückschritt. Ich meine, ich besuche Ihre Website auf meinem Mobilgerät und muss einen zusätzlichen Schritt unternehmen, um zu finden, was ich brauche? Wirklich? Es ist nicht so, dass das Beispiel, das Sie zeigen, eine riesige Navigation hat, oder? Sie könnten den Home-Link weglassen (und das FSS-Logo mit index.html verknüpfen), damit die Navigation in eine Zeile passt. Der einzige Weg, wie ich Dropdowns funktionieren sehe, ist auf einer Website mit von Natur aus riesiger Navigation und Unter-Navigation. Die ESPN-Mobile-Website macht das meiner Meinung nach gut. Einen zusätzlichen Schritt hinzuzufügen, anstatt Ihre kleine Navigation zu überdenken, ist nicht zufriedenstellend.
CSS-Tricks ist wirklich großartig, ich bin über Google hierher gekommen... und jetzt, da ich CSS-Tricks erkundet habe, habe ich festgestellt, dass es ein großartiger Ort für alle Designer ist...
Großartige Arbeit, Leute... und danke für ein so nützliches Tutorial.
@Chris Coyier
Man könnte ganz einfach Markup für das Dropdown-Menü ausliefern, ohne jemals JavaScript zu berühren.
Zumindest ist das die Idee, ich habe es zum Laufen gebracht und kann ein paar nette Beispiele liefern, wie man solches Markup mit Media Queries bereitstellen kann...
Es gibt ein paar Nachteile, aber wenn Sie interessiert sind, schicken Sie mir eine E-Mail und ich schicke Ihnen die Beispiele.
Bedingtes Ausliefern von Markup basierend auf Bildschirmgröße ohne JavaScript? Wie testen Sie die Bildschirmgröße ohne das? Eine Art UA-Sniffing? Ist es geheim? Würde gerne Beispiele sehen, posten Sie JS-Fiddles =)
Hallo! Diese Lösung ist super! Danke, wie viele Leute oben, habe ich viel bei Google gesucht, aber niemand vor Ihnen hat mir vollständige Lösungen gegeben.
Soll ich die Lösung für das Auflösungsproblem für meine Website haben? Denn mein Inhalt rutscht unter das Menü, wenn die Auflösung kleiner als 1280*1024 ist.
Geben Sie mir die richtige Lösung für meine Probleme.
Erwartungsvoll mit freundlichen Grüßen,
Narendran,
Tweeten Sie mich unter @MyNaren89,
9487693560.
Sieht gut aus, Mann! Aber wir haben ein Problem mit dem HTML-Select-Element als Anker. Es ist wichtig, daneben einen „Los“-Button hinzuzufügen, damit der Benutzer erst dann weitergeleitet wird, wenn er klickt. Das ist für die Benutzerfreundlichkeit.
Gut gemacht, Mann. Danke für die Skripte.
Es funktioniert nicht auf einem iPhone, weil die iPhone-Auflösung 960 ist, die display:none-Eigenschaft des Dropdowns wird deaktiviert, wenn die Auflösung kleiner als 960 ist...
Wirklich coole Sache... Danke fürs Teilen.
Sehr gut, ich würde auch einen „Springe zu:“ Text davor erscheinen lassen.
Danke für den Code. Das hat super funktioniert. Ich habe mir eine kleine Ergänzung ausgedacht: Wenn Ihr ursprüngliches Menü Untermenüs hat, wäre es schön, wenn dies im Select-Menü reflektiert würde. Hier ist eine Ergänzung dazu.
Für ein Menü mit dieser Art von Markup
<nav id="main-nav"><ul id="menu">
<li id="item-1">
<a href="/">Home</a>
</li>
<ul class="sub-menu">
<li id="item-2">
<a href="#">Beispiel</a>
</li>
</ul>
</ul>
</nav>
Neues JavaScript
// Dropdown mit Menüelementen füllen$("nav a").each(function() {
var el = $(this);
var da = '';
if($(this).parents('.sub-menu').length){
da = '- ';
}
$("<option />", {
"value" : el.attr("href"),
"text" : da + el.text()
}).appendTo("nav select");
});
Danke – funktioniert super!
Wenn Sie mehr Menüebenen wünschen
Und so weiter…
Danke! Das war wirklich hilfreich.
Hallo.
Ist es möglich, nur die Eltern der Ebenen fett zu machen?
Vielen Dank.
Hallo Chris,
Hier ist eine einfache Alternative zu Dropdown-Navigationen bei kleineren Bildschirmgrößen: Verschieben Sie die Navigation von einem der ersten Elemente, die auf der Seite erscheinen, zu einem der letzten Elemente. Am oberen Rand der Seite platzieren Sie ein Bild eines Listen-Icons, das zur neu verschobenen Navigation verlinkt ist. Ein sanftes Scrollen der Seite ist ein Muss, damit dies funktioniert. Das war's.
Hier ist, warum ich diese Lösung mag
(1) Sie ist für einen unerfahrenen Designer/Coder einfach in ein Projekt zu implementieren; (2) Es gibt mehr Platz für Inhalte, die sofort sichtbar sind; (3) Einige Leute (typischerweise ältere) wissen nicht, dass das kleine Listen-Icon-Bild Menü bedeutet. Diese Besucher werden weiter nach unten scrollen, um die Navigation am Ende zu finden.
Aber ich bin sicher, diese „Lösung“ ist nichts Neues.
Danke, das hat super funktioniert!
Hallo, ich habe ein Dropdown-Menü verwendet, bei dem ich ein Hintergrundbild hinzugefügt habe, um auf ein Menü zu klicken. Auf dem Desktop funktioniert das Hovern mit dem Bild gut. Auf dem iPhone oder iPad funktioniert das Hovern mit dem Hintergrundbild nicht richtig.
Hallo, ich habe Ihren Code verwendet und beim Verkleinern des Bildschirms erscheinen 2 „Gehe zu“-Boxen. Was habe ich falsch gemacht? Irgendwelche Vorschläge?
Danke
Dieses Muster ist keine gute Lösung, da Sie zusätzliches Markup nur für ein alternatives Navigationselement erstellen. Ich nenne das einen Hack. Die beste Lösung ist, nur ein Navigationselement zu verwenden und es anzuordnen.
Funktioniert bei mir gut, aber in der mobilen Version wird das Check-Icon immer angezeigt, als ob ich auf der „Gehe zu...“-Seite wäre, erkennt nicht, wann ich mich in anderen Abschnitten befinde.
Das Entfernen von # aus dem Link verursachte dies.
Gibt es eine Lösung dafür? Danke.