Wenn Sie an „Tabs“ denken, kommt Ihnen vielleicht sofort JavaScript in den Sinn. Auf einen Klick auf einen Tab warten, alle Panels ausblenden, dasjenige anzeigen, das zum gerade angeklickten Tab gehört. Alle großen JavaScript-Bibliotheken behandeln Tabs auf irgendeine Weise. Aber es gibt eine Möglichkeit, dieselbe Idee mit „reinem CSS“ zu erreichen. Genau wie wir es mit dem CSS-Bildwechsler getan haben, nehmen wir dieses traditionell JavaScript-basierte Projekt nur mit CSS in Angriff.

:target Pseudoklassen-Selektor
Das wichtigste befähigende Konzept hier ist der CSS-Pseudoklassen-Selektor :target. :target wird in Verbindung mit ID-Selektoren verwendet. Der Selektor stimmt überein, wenn die aktuelle URL einen Hash-Tag dieser exakten ID enthält. Wenn die aktuelle URL also lautet
https://css-tricks.de/#big-bam-boom
Und es gab ein Element mit dieser ID auf der Seite
<h1 id="big-bam-boom">Kaplow!</h1>
Dann wird dieser Selektor übereinstimmen
#big-bam-boom:target { color: red; }
Wie gelangt man zu einer URL mit einem solchen Hash-Tag? Sie haben Links, die sie aktivieren
<a href="#big-bam-boom">Mission Control, we're a little parched up here.</a>
Browser-Unterstützung / CSS3
Normalerweise würde ich ein Tutorial wie dieses mit einem kleinen Abschnitt zur Browserunterstützung abschließen. Aber es ist in diesem Fall ziemlich wichtig, also legen wir es jetzt beiseite. :target gilt als CSS3. Es hat breite Unterstützung in allen wichtigen aktuellen Browsern. Natürlich bin ich ganz dafür, die Unterstützung für IE 6 einzustellen, also wen kümmert es, wenn es darin nicht funktioniert (tut es nicht), aber :target wird auch in IE 7 oder 8 nicht unterstützt. Diese Browser sind immer noch sehr relevant, was dieses gesamte Tutorial in eine unterhaltsame/lehrreiche Kategorie einordnet, anstatt in eine Kategorie für die Verwendung in der Live-Produktion.
Wenn Sie es natürlich in der Produktion verwenden möchten, wäre eine Option die Verwendung von bedingten Kommentaren, um JavaScript hinzuzufügen, damit sie funktionieren. Das werden wir hier nicht speziell behandeln.
Sauberes HTML
Beginnen wir gleich mit einer schönen und sauberen HTML-Struktur für unseren baldigen Registerbereich
<div class="tabbed-area">
<ul class="tabs group">
<li><a href="#box-one">Tab 1</a></li>
<li><a href="#box-two">Tab 2</a></li>
<li><a href="#box-three">Tab 3</a></li>
</ul>
<div class="box-wrap">
<div id="box-one">
<!-- box two content -->
</div>
<div id="box-two">
<!-- box two content -->
</div>
<div id="box-three">
<!-- box two content -->
</div>
</div>
</div>
Ich würde das als perfekt sauber bezeichnen. Selbst wenn CSS deaktiviert ist, sehen Sie eine Liste von Links, die jeweils zur entsprechenden Inhalts-Div auf der Seite springen.
CSS
Die Tabs selbst werden wir als horizontale Reihe von Links einrichten.
.tabs { list-style: none; }
.tabs li { display: inline; }
.tabs li a { color: black; float: left; display: block; padding: 4px 10px; margin-left: -1px; position: relative; left: 1px; background: white; text-decoration: none; }
.tabs li a:hover { background: #ccc; }
Wenn Sie alle Links so nebeneinander schieben, wird das übergeordnete Element kollabieren. Lassen Sie uns also die alte clearfix-Klasse hinzufügen, damit wir sie auf dem übergeordneten Element verwenden könnenuldamit es eine natürliche Höhe hat. Keine Notwendigkeit für IE 6- und 7-Hacks hier, da keiner von beiden diese Technik sowieso unterstützt.
.group:after { visibility: hidden; display: block; font-size: 0; content: " "; clear: both; height: 0; }
Lassen Sie uns nun die grundlegende Formatierung für die Panels einrichten. Es gibt eine umgebende Div für alle Panels. Der Zweck davon ist, einen relativen Positionskontext zu setzen, damit wir Panels darin absolut positionieren können. Alle Panels werden die gleiche Höhe und Breite haben und genau übereinander positioniert sein. Sowohl Panels als auch Tabs teilen sich denselben 1px-Rand.
.box-wrap { position: relative; min-height: 250px; }
.tabbed-area div div { background: white; padding: 20px; min-height: 250px; position: absolute; top: -1px; left: 0; width: 100%; }
.tabbed-area div div, .tabs li a { border: 1px solid #ccc; }
Der magische Teil, der es zum Laufen bringt, ist so einfach wie die Anpassung des z-Index der Panels, wenn sie „targetet“ werden.
#box-one:target, #box-two:target, #box-three:target {
z-index: 1;
}
Ach du Schreck… Was ist mit der Hervorhebung des aktuellen Tabs?
Was wir bisher haben, ist ein voll funktionsfähiger Registerbereich. Sie klicken auf den Tab, der entsprechende Inhalt in diesem Tab wird geladen. Funktional, aber nicht die hilfreichste Benutzeroberfläche. Es gibt überhaupt keine Rückmeldung, welcher Tab gerade angezeigt wird, weder beim Laden der Seite noch wenn Sie zu einem anderen Tab wechseln.
Das ist eine ziemlich große Hürde. Ich finde einen Weg, es zu lösen, und wir werden das hier durchgehen, aber es ist schmutzig. Die Wurzel des Problems ist, dass wir nicht „nach oben“ im Elementbaum zurückselektieren können. Wenn wir also IDs für die Panels benötigen, können wir in CSS nur Nachfahren dieses Divs beeinflussen, wenn es sich im :target-Zustand befindet. Zum Beispiel
#box-four:target a[href="#box-four"] { color: red; }
Das wäre eine coole Möglichkeit, nur diesen bestimmten Link auszuwählen, wenn dieses Panel aktiv ist, aber bis jetzt können wir das nicht tun, weil dieser Link kein Nachfahre des Panels ist.
Der einzige Weg, den ich bisher gefunden habe, dies zu lösen, ist, die Navigation tatsächlich zu Nachfahren der Panels zu machen. Das ist eine Enttäuschung, denn das bedeutet, dass jedes Panel die Tabs wiederholen muss….
<div class="box-wrap">
<div id="box-four">
<!-- content for panel -->
<ul class="tabs group">
<li class="cur"><a href="#box-four">Tab 4</a></li>
<li><a href="#box-five">Tab 5</a></li>
<li><a href="#box-six">Tab 6</a></li>
</ul>
</div>
<div id="box-five">
<!-- content for panel -->
<ul class="tabs group">
<li><a href="#box-four">Tab 4</a></li>
<li class="cur"><a href="#box-five">Tab 5</a></li>
<li><a href="#box-six">Tab 6</a></li>
</ul>
</div>
<div id="box-six">
<!-- content for panel -->
<ul class="tabs group">
<li><a href="#box-four">Tab 4</a></li>
<li><a href="#box-five">Tab 5</a></li>
<li class="cur"><a href="#box-six">Tab 6</a></li>
</ul>
</div>
</div>
Sehr ideal, ich weiß. Aber jetzt, da die Listen innerhalb der Panels sind, können wir einfach eine „current“-Klasse auf dem Listenelement verwenden, das der richtige entsprechende Link ist, und das formatieren. Und wir werden sicherstellen, dass die Tab-Navigation des aktuellen Panels über den Panels positioniert ist und „oben“ liegt, wenn es das Panel ist.
.cur-nav-fix .tabs { position: absolute; bottom: 100%; left: -1px; }
.cur-nav-fix .tabs li a {
background: -webkit-linear-gradient(top, white, #eee);
background: -moz-linear-gradient(top, white, #eee);
background: -ms-linear-gradient(top, white, #eee);
background: -o-linear-gradient(top, white, #eee);
}
#box-four { z-index: 1; }
#box-four:target .tabs, #box-five:target .tabs, #box-six:target .tabs { z-index: 3; }
.cur-nav-fix .tabs li.cur a { border-bottom: 1px solid white; background: white; }

Jetzt mit Hervorhebung des aktuellen Tabs!
Update
Der obige Code ist, wie erwähnt, definitiv keine gute Vorgehensweise. Ich habe mit dieser Idee noch viel mehr herumgespielt, und die unten verlinkte Demo enthält eine ganze Reihe verschiedener Ideen dafür, einschließlich einiger brauchbarer Lösungen.
Demo und Download
Verwenden Sie es nach Belieben, aber seien Sie sich des IE 7-Problems bewusst. Alle HTML- und CSS-Dateien sind auf einer Seite, also wenn Sie sie „herunterladen“ möchten, kopieren Sie einfach den Code in eine HTML-Datei und speichern Sie ihn.
Hash it out
Sie werden in der Demo bemerken, dass, wenn Sie einen Tab im linken Bereich anklicken und dann auf einen Tab im rechten Bereich klicken, der linke Bereich zu seinem ursprünglichen Zustand zurückkehrt, anstatt seine aktuelle Ansicht beizubehalten. Das liegt alles am :target und seiner Beziehung zum Hash in der URL. Dagegen gibt es wirklich keinen Weg, ohne JavaScript, also wenn das für Sie nicht in Frage kommt, sollten Sie wahrscheinlich gleich zu JavaScript greifen.
Außerdem springen Hash-Tag-Links beim Anklicken „nach unten auf der Seite“, also beachten Sie auch, dass Ihr Browserfenster nach unten springt, um diesen Tab zum obersten Element zu machen (wenn genügend Platz zum Scrollen auf der Seite vorhanden ist), wenn Sie auf einen Tab klicken. Auch dagegen kann ich nach meinem Wissen nichts ohne JavaScript tun.
Weitere Ressourcen
- Stay on Target – Großartiger Artikel von Think Vitamin, leider fehlen die Demos. Er behandelt jedoch einige überaus clevere Techniken.
- W3C-Spezifikation zu :target
haha großartiger Artikel mit Ihrem typischen Humor!
Wieder einmal greift IE ein
Wieder greift IE ein, um sicherzustellen, dass wir dies nicht für Kunden verwenden können*
Fragen Sie nicht, wie ich das falsch geschrieben habe.
Lustiger Artikel, aber ich werde pedantisch sein. Vermischt dies nicht Layout mit Verhalten? Es ist eine clevere Technik; leider – nicht unterstützt vom Zweck und Mechanismus von CSS. Deshalb hat es einige Mängel, wie im Artikel aufgezeigt.
Ja, aber das ist doch sicher ein „CSS-Trick“, nicht wahr? :)
ein guter Trick, # ruiniert es
:hover ist auch technisch gesehen Verhalten, aber wir müssen pragmatisch sein.
Es gibt sogar ein Beispiel auf der offiziellen W3C-Website zur Verwendung von :target für Registerkarten-Navigation.
Sie könnten alles in 3 Divs wrappen (IDs box-one, box-two, box-three) und diese targeten. Dann wrappen Sie den eigentlichen Inhalt in eine weitere Div und machen etwas wie
#box-one:target #box-one-content {z-index: 1;
}
#box-one:target a[href="#box-one"] {
color: red;
}
Könnte natürlich noch sauberer mit einigen fortgeschrittenen CSS3-Selektoren gemacht werden.
Der Grund dafür wäre, nur ein Set von Tabs zu benötigen. Netter Artikel übrigens :)
Ja, ich denke, das hat Potenzial! Mehr zusätzlicher Markup, aber nur Wrapper, kein wiederholter Inhalt, was viel besser ist.
Für eine unterhaltsame/lehrreiche Demonstration – gut gemacht.
Ich glaube nicht, dass dies ein guter Artikel ist. Implementieren Sie einfach, wie CSS3 funktioniert. Selbst die Lösung (Hervorhebung des aktuellen Tabs) ist so schmutzig. Ich denke, das wird in keiner Webanwendung angewendet werden.
Ich habe Bedenken dazu. Bei Multi-Tab-Inhalten wie diesem würde der Benutzer wahrscheinlich von Tab zu Tab hin und her wechseln. Aber wenn er jetzt auf „Zurück“ klickt, um zur vorherigen Seite vor der Seite mit den Tab-Inhalten zu gelangen, bringt er ihn nur zum zuletzt ausgewählten Tab zurück, also wahrscheinlich nicht das Beste für den Hauptinhalt.
Interessanter Artikel. Ich würde ihn niemals für irgendetwas verwenden, aber es ist interessant zu sehen, wie flexibel CSS3 sein kann, auch für Dinge, für die es nicht gedacht war. Also für die Nörgler, nein, es ist nicht für den produktiven Einsatz gedacht, sondern nur ein interessanter Trick mit CSS.
Es ist schön, :target zur Hervorhebung von Inhalten zu verwenden; wie bei diesen langen FAQ-Listen, wenn Sie zum Antworten nach unten springen. Sie können den Zielbereich eine andere Hintergrundfarbe geben, um die Augen auf die richtige Stelle auf der Seite zu lenken.
Ich würde sagen, es ist in Ordnung, es für so etwas in der Produktion zu verwenden.
Absolut, da dies eine progressive Verbesserung wäre und das in meinen Augen für die Produktion immer in Ordnung ist.
IE8 unterstützt die :target-Pseudo-Klasse nicht, daher funktioniert dies in keiner IE-Version
http://msdn.microsoft.com/en-us/library/cc351024(VS.85).aspx
Ich erinnere mich nicht, dass sich jemand darum gekümmert hat.
Es ist sowieso ein cooler Trick. Wenn wir aufhören würden, Dinge zu tun, nur weil IE sie nicht kann, würden wir immer noch Blink-Tags verwenden.
Mein Kommentar wies auf einen kleinen Fehler im Artikelinhalt hin. Es scheint, dass der Artikel jetzt aktualisiert wurde, um dies widerzuspiegeln, daher ist mein Kommentar jetzt wahrscheinlich nicht mehr sinnvoll.
Ich nehme an, Herr Coyier hat sich darum gekümmert.
Woher kommen all diese tollen Ideen?
Sie können das Problem der wiederholten Navigation beheben, indem Sie sie zuletzt platzieren, nach den Boxen, und „~“ verwenden, um Geschwister anzusprechen. Es ist nicht ideal, aber etwas weniger haarig.
http://n-son.com/misc/csstabs.html#box-one
Diese Demo funktioniert nur in Firefox, aus irgendeinem Grund aktualisiert Webkit die Tabs nicht, es sei denn, Sie drücken nach dem Anklicken auf Aktualisieren.
Das ist großartig! Muss mehr über Geschwisterselektoren lernen. Funktioniert übrigens auch in Opera.
Es ist schade, dass :target nicht durchgängig in IE unterstützt wird, es kann ein nützlicher kleiner Trick zur Hervorhebung von Ankerlinks usw. sein. Aber ich sehe nicht, dass es für das von Ihnen gezeigte Tab-System verwendet wird, es ist großartig, das will ich nicht bestreiten, aber ich denke, es ist der falsche Weg.
Für den Moment ist JavaScript einfach zu verwenden und nur ein kleiner zusätzlicher Code ist erforderlich, um ziemlich coole Registerkartenbereiche zu erstellen, die es Ihnen ermöglichen, problemlos hin und her zu gehen, mit Fade-Effekten usw.
Ich bin sicher, dass wir bald in der Lage sein werden, vollständige CSS/XHML-Websites ohne externen Code zu erstellen und einfachere Möglichkeiten zur Erstellung von Tabs mit Effekten auf mehreren Plattformen zu nutzen.
Das ist großartig, es gibt nur ein Problem.
Nehmen wir an, der erste Tab ist 900 Pixel hoch (mit dem Text, den er hat) und die anderen sind etwa 400 Pixel. Wenn Sie von diesem Tab zurück zu den anderen wechseln, ist dieser immer noch da, unter den anderen.
Außerdem wird die Seite nach unten verschoben, wenn das Browserfenster zu klein ist.
Ich habe versucht, eine Methode ähnlich (und etwas einfacher) zu dieser auf einer Website zu verwenden, auf der ich nur CSS und HTML als Beschreibung verwenden konnte, und obwohl es funktionierte (es funktioniert immer noch), ist es meiner Meinung nach einfach besser, JS für solche Dinge zu verwenden.
Der :target-Selektor kann hier für mehr als nur den z-Index verwendet werden.
Denken Sie an Höhe, Überlauf und (vielleicht) Position!
Das löst Ihre Probleme.
Hallo Chris,
Können wir auch Webkit-Gradients haben? ;-)
Tolles Tutorial. Danke für diese Teilen!
Danke Chris!
Ich kann mir schon einige praktische Anwendungen dafür vorstellen (tatsächlich habe ich mir schon überlegt, wie ich den Bildwechsler nehmen und die gleichen Techniken verwenden kann, um Tabs zu erstellen)
Mein Freund sagte, diese seien scheiße.
Ich denke, es hätte besser gemacht werden können. Mehr Zeit und Mühe investiert. Du kannst besseres Chris, komm schon.
Mein Freund sagt, du musst diese Seite nicht lesen, wenn sie dir nicht gefällt.
In den Worten von Jemaine Clement: „Könnten Sie konstruktiver mit Ihrer Kritik umgehen?“
Diese Art von Dingen ist einfach eine Möglichkeit, ein Proof of Concept zu erstellen. Chris hat sogar gesagt, dass dies eher für Informations-/Bildungszwecke als für eine Produktionsumgebung gedacht ist.
Jared, komm schon.
Mich interessiert, wie wir mit JavaScript oder jQuery ein :target-Selektor-Äquivalent erreichen können?
Sie können den Wert des Hash mit z.B. abrufen
var hash = window.location.hash;Und dann einen Selektor schreiben, um den Link zu finden (jQuery)
$("a[href='"+hash+"']").whatever();oder einfach das Element mit dieser ID… Ich denke, das sollte funktionieren…
$(hash).whatever();Eigentlich funktioniert der jQuery-Ankerselektor nicht, da die Variable ‚hash‘ gleich #(variable) sein wird.
$("a"+hash).whatever();Dieser Code sollte jedoch in Ordnung sein..
Ja, aber #variable ist genau das, was Sie wollen, da das Hash-Symbol ein ID-Selektor in jQuery ist. Also wie http://www.site.com#header, window.location.hash = „#header“, was ein perfekter jQuery-Selektor ist. Richtig?
Jawohl, genau das habe ich gesucht. Vielen Dank, ich wollte nur darauf hinweisen, dass der von Ihnen gepostete Ankerselektor aus diesem Grund nicht funktionieren würde.
Der Grund, warum ich den href nicht auf etwas wie #variable setzen kann, ist, dass die jQuery-Variable bereits gesetzt ist und das Anklicken eines Links mit einem Hash-Tag die Seite nicht neu lädt. Ich musste zu einer Seite verlinken, um zur Seite mit dem richtigen Hash-Tag weiterzuleiten.
Das :target hat eine ziemlich gute Unterstützung auf breiter Front, außer wie Sie erwähnten, IE. Es gibt auch einen Fehler in Opera, der schon seit einiger Zeit besteht, bei dem das Klicken auf die Zurück-Taste keine Änderungen an der :target-Pseudoklasse auslöst.
Ich habe mit target selbst ausgiebig in meiner CSS3-Akkordeon-Demo und der Erstellung eines CSS-Lightbox-Effekts gespielt, hat ziemlich mächtige Fähigkeiten.
Lassen Sie mich versuchen, das noch einmal einzufügen. Das Forum schien es konvertiert zu haben.
Ich bin mir nicht zu 100 % sicher, ob die oben von mir gepostete Methode in IE fehlerfrei funktioniert, aber ich habe sie definitiv schon perfekt zum Laufen gebracht. Leider finde ich diese Dateien nicht.
Derzeit konnte ich IE über Winebottler auf meinem Mac nicht zum Laufen bringen, aber ich habe erfolgreich einen Windows-Computer (den ich nicht mehr habe) mit mehreren IEs verwendet, um es zum Laufen zu bringen.
Nachdem ich die Kommentare durchgelesen habe, wie viele Leute oben sagten, würde ich mich nie wohl fühlen, die :target- oder Hack-Tab-Methode mit den meisten Kunden-Websites zu verwenden. Nur in seltenen Fällen könnte sie als hilfreich oder geeignet angesehen werden.
@Chris: Die Demo ist jetzt total durcheinander. Abgesehen davon, dass 2+ Registerkartenbereiche auf 1 Seite nicht funktionieren, aufgrund der Seitenlänge, verschwinden die Tabs, wenn man darauf klickt.
Beispiel: Ich klicke auf Tab 3, das Fenster springt zu dieser Box und die Tab-Leiste verschwindet. Das ist nicht nur ein Nachteil, sondern ich denke, etwas, das den Kern des Registerkartenbereichs herausfordert, um zu anderen Tabs zu wechseln.
Das ist ein nie akzeptabler Verlust an Benutzerfreundlichkeit.
Nur Beispiel 3 und 6 haben das nicht, und der Rest ist meiner Meinung nach nicht einmal eine Option, basta!
:)
Nein, ich stimme total zu, dieser „Jump Down“-Effekt ist ein großer Teil davon, und diejenigen, die nach unten zur Ansicht springen und die Tabs selbst abschneiden, beeinträchtigen die Benutzerfreundlichkeit wirklich. Aber genau das ist wichtig, um in der Demo zu sehen.
Wie immer, großartige Arbeit!
Sweet ;)
Das ist meine Version http://www.webstuffshare.com/2010/01/updated-pure-css-tab-menu/
Danke Chris, eine weitere unschätzbare Ressource für jeden angehenden Webdesigner. Ich bin kürzlich auf Ihre Website gestoßen und besuche sie seitdem täglich, da es so viele Snippets und Tutorials gibt, die mich noch eine Weile lernen lassen werden. Nochmals vielen Dank
„Wenn Sie alle Links so nebeneinander schieben, wird das übergeordnete Element kollabieren, also fügen wir den alten clearfix hinzu…“
Wissen Sie, was CSS3 wirklich braucht?
Eine sinnvolle, offiziell sanktionierte, definierte und unterstützte Möglichkeit, Floats zu löschen!
Ich schlage overflow:envelop oder overflow:contain-content vor
Chris, danke für die Aktualisierung der Beispielseite. Ich habe Ihre Beispiele zum Testen der nächsten Version von ie-css3 verwendet und kann berichten, dass sie in IE8 (aber nicht in 5.5 – 7) wie erwartet funktionieren.
Natürlich basiert die IE8-Unterstützung für :target auf der Prämisse, dass Entwickler bereit sind, eine JavaScript-Lösung für dieses Problem zu akzeptieren.
Versteckte Idee. Ich denke, das ist keine gute Zeit für diese Art von Lösung :).
Wie kann ich das herunterladen