Tabs sind ein einfaches Designmuster, bei dem eine Reihe von Links offensichtlich klickbare Navigation sind und beim Klicken auf einen Link neue Inhalte angezeigt werden. Natürlich gibt es viele Variationen, aber es ist eines der allgegenwärtigsten Navigationsdesignmuster. Wenn sie in einer horizontalen Reihe angeordnet sind, sind sie auch eines der am wenigsten bildschirmfreundlichen Designmuster.
Wir können es aber zum Laufen bringen.
Ohne etwas zu tun, um Tabs auf einem kleinen Bildschirm zu helfen, werden Sie auf irgendein Problem stoßen
- Sie lassen die Seite "herauszoomen" und die Tabs sind winzige Berührungsziele
- Sie lassen die Seite auf die Gerätebreite und...
- Es ist kein Platz für die Tabs, also werden sie abgeschnitten.
- Die Tabs brechen um, sehen komisch aus und nehmen zu viel Platz ein.

Grundsätzlich: Wir müssen hier etwas tun, um Tabs für kleine Bildschirme besser zu machen.
Das wurde schon einmal gemacht
Beliebte Lösungen sind
- Brad Frosts Toggle Navigation
- „Off Canvas“ Navigationsoption wie diese.
- Die Tabs in ein Dropdown konvertieren.
Ich möchte es mit einigen spezifischen Zielen wieder tun.
Ziele
Hier ist der Plan
- Normaler „Tabs“-Look, wenn Platz vorhanden ist, Dropdown, wenn nicht.
- „Aktiver“ Tab immer sichtbar und offensichtlich.
- Funktioniert mit #hash-Tabs, bei denen der gesamte Inhalt auf der Seite ist und Inhaltspanels ausgeblendet/angezeigt werden.
- Funktioniert mit verknüpften Tabs, bei denen die Tabs auf eine andere URL verweisen.
- Das HTML ist semantisch.
- Es gibt eine Version des HTML, die sich nicht ändert.
- Es gibt eine Version des JavaScript, die sich nicht ändert.
- Sie können auf einen bestimmten Tab verlinken.
Wir gehen also nicht nur das Design, sondern auch die Funktionalität an.
Muster wie der „Off Canvas“-Stil werden hier nicht funktionieren, da wir versuchen, den aktuellen Tab anzuzeigen und nicht zu verbergen. Die Konvertierung in ein <select>-Dropdown funktioniert nicht, da dies anderes HTML und anderes JavaScript ist.
Das HTML
Tabs sind Navigation, also <nav>. Die role sollte durch das Tag impliziert werden, aber man kann sich nicht immer darauf verlassen, daher fügen wir die role hinzu. Wir verwenden eine Klasse für das CSS am äußersten Element (dem <nav>). Die Navigationspunkte selbst sind in einer Liste weil das am besten ist. Jeder Link hat entweder ein #hash-Ziel oder eine gültige URL.
<nav role='navigation' class="transformer-tabs">
<ul>
<li><a href="#tab-1">Important Tab</a></li>
<li><a href="#tab-2" class="active">Smurfvision</a></li>
<li><a href="#tab-3">Monster Truck Rally</a></li>
<li><a href="http://google.com">Go To Google →</a></li>
</ul>
</nav>
Nichts Überflüssiges.
Das CSS für die Tab-Ansicht
Es gibt eine Reihe von spezifischen CSS für die Tabs in jedem „Zustand“ (Tabs oder Dropdown). Sie können „mobile first“ beginnen, indem Sie das Dropdown stylen, und dann eine Media Query mit min-width verwenden, um es als Tab umzugestalten, oder Sie können „desktop first“ beginnen, indem Sie zuerst die Tabs stylen und dann eine Media Query mit max-width verwenden, um es in ein Dropdown umzugestalten. Sie sind so unterschiedlich, dass ich keinen großen Vorteil in der einen oder anderen Richtung sehe, aber ich würde das an Ihre bereits auf der Website verwendeten Methoden anpassen.
Desktop-first und SCSS für diese Demo.
.transformer-tabs {
ul {
list-style: none;
padding: 0;
margin: 0;
border-bottom: 3px solid white;
}
li {
display: inline-block;
padding: 0;
vertical-align: bottom;
}
a {
display: inline-block;
color: white;
text-decoration: none;
padding: 0.5rem;
&.active {
border-bottom: 3px solid black;
position: relative;
bottom: -3px;
}
}
}
Nur eine Reihe von Links mit einer Linie darunter. Der Ankerlink mit einer „aktiven“ Klasse erhält einen andersfarbigen Rand, der den Rand von Kante zu Kante überlappt. vertical-align hält sie alle auf derselben Grundlinie, wenn der aktive Link den Rand erhält, den die anderen nicht haben.
Das CSS für die Dropdown-Ansicht
Wir müssen eine Ansichtsbreite finden, bei der das Tab-Aussehen zusammenbricht, und dort eine Media-Query einfügen. 700px für diese Demo.
.transformer-tabs {
...
@media (max-width: 700px) {
ul {
border-bottom: 0;
overflow: hidden;
position: relative;
background: linear-gradient(#666, #222);
&::after {
content: "☰"; /* "Three Line Menu Navicon" shows up */
position: absolute;
top: 8px;
right: 15px;
z-index: 2;
pointer-events: none;
}
}
li {
display: block; /* One link per "row" */
}
a {
position: absolute; /* Stack links on top of each other */
top: 0;
left: 0;
width: 100%;
height: 100%;
&.active {
border: 0;
z-index: 1; /* Active tab is on top */
background: linear-gradient(#666, #222);
}
}
}
}
Wenn die Media-Query greift, gelangen wir hierher

Der aktive Tab ist immer noch offensichtlich (er ist der einzige angezeigte) und ein Drei-Linien-Menü-Navicon wird angezeigt, was universell als Symbol zum Aufrufen weiterer Navigation verstanden wird.
Die JavaScript-Struktur
Die benötigte Funktionalität
- Wenn es ein #hash-Link ist, enthüllt die Auswahl des Links das Panel mit dieser ID und blendet das aktuell angezeigte aus.
- Ändern Sie die URL, um diesen #hash anzuzeigen, aber ohne die Historie zu beeinflussen (keine Rückwärts-Button-Ärgernisse).
- Visuelle Anzeige des nun aktiven Tabs (Togglen von Klassen entsprechend).
- Wenn es sich um einen verknüpften Tab handelt, lassen Sie diesen Link funktionieren.
- Wenn die Seite mit einem Hash geladen wird, der einem Tab entspricht, wechseln Sie zu diesem Tab.
- Im Dropdown-Zustand für kleine Bildschirme erlauben Sie dem Dropdown, sich beim Auswählen zu öffnen/schließen.
Einige Struktur basierend auf diesen Anforderungen
var Tabs = {
init: function() {
this.bindUIfunctions();
this.pageLoadCorrectTab();
},
bindUIfunctions: function() {
},
changeTab: function(hash) {
},
pageLoadCorrectTab: function() {
},
toggleMobileMenu: function(event, el) {
}
}
Tabs.init();
Tabs beim Auswählen ändern
Die einzige Zeit, in der wir einen Tab beim Auswählen ändern müssen, ist, wenn der ausgewählte Tab ein #hash-Link ist. Andernfalls ist es ein verknüpfter Tab und er sollte einfach diesem Link folgen. (Und mit „Auswählen“ meine ich Klicken, Tippen, Tabben und Aktivieren oder was auch immer.) Daher kann unsere changeTab-Funktion einfach diesen Hash-Wert akzeptieren und verwenden.
changeTab: function(hash) {
// find the link based on that hash
var anchor = $("[href=" + hash + "]");
// find the related content panel
var div = $(hash);
// activate correct anchor (visually)
anchor.addClass("active").parent().siblings().find("a").removeClass("active");
// activate correct div (visually)
div.addClass("active").siblings().removeClass("active");
// update URL, no history addition
window.history.replaceState("", "", hash);
// Close menu, in case in dropdown state
anchor.closest("ul").removeClass("open");
},
Tab-Klicks behandeln
Wir verwenden Standard-Event-Delegation, nur um effizient zu sein. Jeder „Klick“ (der für Taps gut funktioniert), vorausgesetzt, es ist nicht der bereits aktive Tab und es ist ein #hash-Link, wird diesen Hash einfach an die changeTab-Funktion weitergeben.
// Delegation
$(document)
.on("click", ".transformer-tabs a[href^='#']:not('.active')", function(event) {
Tabs.changeTab(this.hash);
event.preventDefault();
})
... und preventDefault(), damit die Seite nicht ungeschickt nach unten springt.
Das Dropdown umschalten
Wenn die Media-Query aktiv ist und die Tabs somit in ihrem Dropdown-Zustand sind, können wir das Dropdown umschalten, wenn der .active Tab angeklickt wird. Aufgrund unseres Stylings wissen wir, dass der aktive Tab den gesamten klickbaren Bereich abdeckt.
$(document)
// ... first click handler, chaining for efficiency
.on("click", ".transformer-tabs a.active", function(event) {
Tabs.toggleMobileMenu(event, this);
event.preventDefault();
});
Die Funktion toggleMobileMenu ist sehr einfach. Aber ich mag es trotzdem, dass wir sie in eine eigene Funktion abstrahiert haben, falls sie eines Tages mehr tun muss, damit wir nicht alles zerhacken.
toggleMobileMenu: function(event, el) {
$(el).closest("ul").toggleClass("open");
}
Die .open-Klasse öffnet das Menü visuell durch einige CSS-Änderungen.
.transformer-tabs {
...
@media (max-width: 700px) {
ul {
...
&.open {
a {
position: relative;
display: block;
}
}
}
}
...
}
Das Entfernen der absoluten Positionierung dieser Tabs und das Umwandeln in Block-Elemente lässt das Menü nach unten aufklappen und den darunter liegenden Inhalt ebenfalls nach unten schieben. Dies ist das, was es zu einem Dropdown macht.

Lade den richtigen Tab, wenn die Seite mit einem #Hash geladen wird
Es stellt sich heraus, dass das sehr einfach ist. Schauen Sie einfach auf den Hash in der URL und übergeben Sie ihn an die changeTab-Funktion.
pageLoadCorrectTab: function() {
this.changeTab(document.location.hash);
},
Deshalb abstrahieren wir Funktionalitäten in wiederverwendbare Funktionen statt in Spaghetti-Code.
Das ist nicht nur theoretisch
Ich schreibe das, nachdem ich die Tabs auf CodePen repariert habe, wo die Tabs bis dahin ziemlich schlecht waren. Wir haben sowohl #hash-Link-Tabs als auch echte verknüpfte Tabs auf CodePen, daher die Anforderungen.
Möchten Sie es besser machen?
Vielleicht eine Version, bei der das Menü den Inhalt darunter nicht nach unten schiebt, sondern das erweiterte Dropdown einfach über dem Inhalt liegt, wäre cool. Vielleicht eines, das eine Menge Links (mehr als für einen kleinen Bildschirm nötig) mit einer Art Scrolling oder Paginierung bewältigen könnte. Vielleicht eines mit Animationen/Übergängen.
Ein Problem mit der exakten Demo, die wir hier erstellt haben, ist, dass Sie das Dropdown nicht schließen können, es sei denn, Sie wählen einen Tab aus. Sie können den aktuellen Tab auswählen, um ihn zu schließen, ohne etwas zu tun, aber Sie können nicht einfach auf das Drei-Linien-Menü klicken, um es zu schließen. Das liegt daran, dass Sie (soweit ich weiß) keine Klick-Events an ein Pseudo-Element binden können. Auf CodePen habe ich für das Drei-Linien-Menü einfach ein <span> verwendet, damit Sie es auf diese Weise umschalten können, aber das bedeutet zusätzlichen Markup.
Demo
Hinweis: „Go To Google →“ ist ein verknüpfter Tab, nur um ihn zu testen. Er funktioniert hier auf CodePen wegen des sandboxed iFrames nicht. Er würde unter normalen Umständen funktionieren.
Sehen Sie den Pen Transformer Tabs von Chris Coyier (@chriscoyier) auf CodePen
Musste letzte Woche genau dieses Problem lösen. Habe ein paar Beispiele gefunden, wo Leute versucht haben, es vorher zu lösen.
http://foundation.zurb.com/docs/components/section.html
http://jquerytools.org/demos/tabs/accordion.html
Für Tabs auf kleinen Bildschirmen bin ich ein Fan der oben genannten Akkordeon-Methode. Es ist erwähnenswert, dass jQuery Mobile das Akkordeon-Konzept verwendet und es wirklich gut macht.
Ich mag, was Chris gemacht hat, es ist beeindruckend, aber etwas daran fühlt sich leicht umständlich an: Ich muss drücken, um die Navigation anzuzeigen, dann drücken, um meinen Tab zu wählen, und dann landet mein neuer Tab irgendwie oben... es scheint ein wenig unerwartet, um es milde auszudrücken.
Schauen Sie sich die jQuery Mobile-Lösung an, wenn Sie es noch nicht getan haben
http://jquerymobile.com/demos/1.3.0-rc.1/docs/content/content-collapsible-set.html
( **Scrollen Sie ganz nach unten** auf der Seite und schauen Sie sich die Beispiele am Ende an)
Es gibt viel Zuneigung für den Akkordeon-Ansatz. Ich bin nicht dagegen, aber ich denke, es hängt stark von der Situation ab. In der CodePen-Situation, wenn ich Akkordeon-mäßig vorgegangen wäre, hätte es unbedingt ein „vollständig geschlossenes“ Akkordeon sein müssen, damit Sie zumindest einen Blick auf alle verfügbaren Optionen erhalten. Ich wäre nicht damit einverstanden, dass die Navigation am Ende der Seite versteckt ist, nach der Sie wischen müssen, um sie überhaupt zu entdecken. Dann haben Sie in der vollständig geschlossenen Situation überhaupt keinen Inhalt angezeigt, was in Fällen wie der CodePen-Homepage sicherlich nicht funktionieren würde. Also... ich mag den Dropdown-Ansatz irgendwie.
Ich könnte mir vorstellen, dass die Akkordeon-Methode funktioniert, wenn jeder Tab nur sehr wenig Inhalt hat.
Wenn der Benutzer ohnehin scrollen müsste, um das Menü zu finden, könnte ein Link oben/unten des Tabs, der den Benutzer zu den anderen Menüpunkten bringt, ausreichen.
Mache bessere Transform-Tabs (Desktop) zu Akkordeon (Mobile)... weil das Ausblenden nicht sehr intuitiv ist.
Wusste nicht, dass man das Drei-Linien-Navigationssymbol so erreichen kann, danke!
Außerdem, entschuldigen Sie das Haarspalten, aber Sie haben vergessen, den Kommentar in Ihrem zweiten SCSS-Snippet zu schließen, und Sie haben "[...] CodePen, where the kinda sucked" unter This Isn’t Just Theoretical geschrieben.
Danke für die Korrekturen!
Hier ist, wie ich es gemacht habe
Es ist nicht perfekt, aber es funktioniert irgendwie. Je mehr Tabs Sie haben, desto unhandlicher wird es, wenn sie übereinander gestapelt sind. Mit nur 6 Tabs oder weniger finde ich, dass es gut funktioniert.
Mir gefällt die Idee des Dropdowns. Vor ein paar Monaten habe ich eine andere Version davon für mein Team entwickelt. Mein Ziel war Tabs auf großen Displays, Akkordeons auf kleinen Displays:.
Ich muss Ihren Code etwas genauer betrachten, wenn ich von der Arbeit nach Hause komme.
Großartig! Sie sind der Erste, der die Navigation nicht extra platziert. Mir gefällt der Ansatz von Dirk Ginaders „Accessible Tabs“, bei dem die Navigation per JS aus den Überschriften erstellt wird. Alle anderen Skripte machen es meiner Meinung nach falsch.
Wie denken die Leute über den Metro... äh... Modern UI-Ansatz? Im Wesentlichen zeigt dieser Ansatz, wie viele Tabs horizontal passen und macht dann eine Ellipse als letzten Tab, der ein Dropdown mit den restlichen Tab-Optionen ist, die nicht passen würden.
Ich bin der Erste, der zugibt, dass es nach viel theoretischer JavaScript-Arbeit klingt, aber mein Hauptjob ging von voller Webentwicklung zu SharePoint Evangelist, daher ist es meine Pflicht, diese Option aufzuzeigen.
Hallo Chris,
Was halten Sie von dem Menüansatz, bei dem es am Ende der Seite platziert ist und es einen großen Link von oben dazu gibt?
Normalerweise würde ich mich für ein Dropdown entscheiden, aber einer meiner Kunden wünscht sich eine responsiv gestaltete Website, aber ein immer erweitertes Menü.
Danke!
Hallo Chris,
Ich mag Ihren Ansatz. Aber meistens würde ich die Tabs wahrscheinlich in ein Akkordeon umwandeln. Es ist eine bekannte UI und erfordert weniger Klicks als Ihr Ansatz.
Aber was mich immer wundert, wenn ich mir Tab-Skripte ansehe, ist, dass jeder die Navigation erstellt. Meiner Meinung nach wäre es besser, JS die Navigation erstellen zu lassen, da diese Tabs nur mit JS nutzbar sind. Mir gefällt der Ansatz von Dirk Ginaders „Accessible Tabs“, bei dem die Navigation per JS aus den Überschriften erstellt wird. Soweit ich sehen kann, ist dieses Skript in diesem Detail einzigartig. Und ich verstehe nicht, warum.
Ich habe meine Meinung zum Akkordeon-Ding in diesem Kommentar geschrieben.
Die beste (wagen wir zu sagen, semantische?) Markup für eine Situation wie diese, in der Sie die Navigation per Javascript erstellen, wäre eine
dlund jederdtwäre ein Navigationspunkt und derdtwäre der Tab-Inhalt. Ohne Javascript oder Stile wird der Inhalt immer noch lesbar und logisch mit demdtals Überschrift gruppiert dargestellt. Sie könnten leicht Accordion-Stile hinzufügen und JS verwenden, um die Navigation für ein Tab- oder Dropdown-Layout zu erstellen und einfach eine Option oder eine Klasse haben, die zwischen den Layouts umschaltet.Ich habe ähnliche Dinge in der Vergangenheit gemacht, aber nicht annähernd so sauber wie Chris' Code. Könnte es wert sein, es noch einmal zu überdenken.
Vielen Dank! Dies kommt auf meine Lesezeichenliste. Ich denke, ich werde das bald brauchen.
Sehe ich das als Einziger? http://puu.sh/5almw.png
Ich sehe dieses Problem auch, in Safari 6.0.5. Ansonsten sehr gute Arbeit, Chris!
Es gab keinen Fallback für die Gradienten. Ich habe einen für die Demo hinzugefügt.
Hallo Chris,
Ich mag diesen Ansatz sehr. Ich denke, es ist eine großartige Lösung für mobile Seiten. Ich habe diesen Code auf einer Seite verwendet, an der ich arbeite. Ich benutze ihn für eine Produktdetailseite mit vielen verschiedenen Informationen. Sie brauchen keinen Zustand "alle Tabs geschlossen", weil Sie dem Benutzer die Informationen so schnell wie möglich geben wollen.
Ihre Lösung hat jedoch ein Problem. Wenn Sie mehr als eine Tabbox auf einer Seite verwenden, lösen die Tab-Steuerelemente nur die Inhaltsdivs der ersten Tabbox aus. Ich habe Ihren Pen gegabelt und den JS-Teil bearbeitet http://codepen.io/maxkarkowski/pen/wJmcH
Wenn ich die Tabs öffne und sie schließen möchte, bin ich gezwungen, zu "Important Tabs" zu gehen.
Oder wählen Sie den Tab aus, auf dem Sie sich gerade befinden.
Um das zu beheben, benötigen Sie ein zusätzliches Element (wahrscheinlich für das Drei-Linien-Symbol) und binden das Umschalten des Menüs daran. Ein akzeptabler Kompromiss.
Ich würde gerne ein Beispiel dafür sehen, wie man http://jqueryui.com/tabs/ responsiv macht.
Insbesondere da sie so weit verbreitet sind.
Ich musste mich mit einem ähnlichen Problem befassen, bei dem ich die Benutzeroberfläche auf kleineren Bildschirmen ändern musste. Damals konnte ich keine gute Lösung finden, also habe ich meine eigene entwickelt.
https://github.com/dmmendez/content-switcher/
Diese Lösung hat die Möglichkeit, zwischen Tabs/Dropdowns/Akkordeons zu wechseln, alles mit einfacher Abschnittsmarkierung. Zugegeben, ich bin kein großer Fan von Akkordeons, aber es ist da, wenn es gebraucht wird.
Mein Ansatz verwendet eher einen abschnittsorientierten Ansatz als einen Navigationsansatz, der in diesem Artikel gezeigt wird. Damals habe ich den abschnittsorientierten Ansatz gewählt, weil ich die Notwendigkeit hatte, in Akkordeons statt in Dropdowns zu transformieren, und Abschnitte mir etwas mehr Flexibilität dafür gaben.
Danke für den Artikel.
Bezüglich Ainos Kommentar
Ich habe einen anderen Ansatz als Chris vorgeschlagen und er funktioniert meiner Meinung nach ziemlich gut.
Sie können ihn unter Codepen überprüfen
Auf einem aktuellen Projekt haben wir die Tab-Buttons auf kleinen Bildschirmen schön groß und übereinander gestapelt, einen Abwärtspfeil und Scroll-to-Tab-Content bei Klick hinzugefügt. Bisher scheinen die Benutzer gut darauf zu reagieren.
Hinweis1: Die Seite ist auf Norwegisch, lesen Sie sie wie Lorem Ipsum?
Hinweis2: Scrollen bei Klick ist auf dem Desktop nervig, aber wer surft schon auf <768px auf dem Desktop?
Hinweis3: Die Seite verwendet Weebly, daher ist das Markup weit von perfekt entfernt.
Ich ziehe es vor, es in reinem CSS zu machen. Es ist einfach, wenn Sie eine weitere Kopie Ihrer oberen Navigation in Ihrem Footer haben, was oft der Fall ist.
Verwenden Sie Media Queries, um Ihre Top-Navigation auszublenden und sie durch einen Hyperlink zum Footer-Menü (mit dem Dropdown-Menü-Symbol) zu ersetzen, wenn Sie sie auf kleineren Bildschirmen anzeigen. Stylen Sie das Footer-Menü so, dass es wie ein schönes, mobilfreundliches Menü aussieht.
Sehen Sie es in Aktion auf der Website, an der ich gerade arbeite. http://net-evidence.com
Ich bin es gewohnt, CSS zu verwenden, aber dies ist etwas, das ich definitiv heute Abend ausprobieren werde, ich suche nach etwas anderem für mein nächstes Projekt. Danke
Ich verwende dies in Verbindung mit Foundation und alles funktioniert, außer dem MobileToggle. Irgendwelche Vorschläge?