(Bessere) Tabs mit abgerundeten Außenrändern

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Der folgende Beitrag wurde von Menno van Slooten verfasst. Sie bemerken vielleicht, dass wir uns bereits einmal damit beschäftigt haben, aber mir gefällt Mennos Ansatz hier sehr gut. Das Endergebnis zeigt, dass man mit dem Design etwas ausgefallener sein kann als ich es ursprünglich getan habe, mit Rändern, Verläufen und Schatten, und das Ganze mit weniger Elementen.

Eine gut aussehende Tab-Steuerung hat normalerweise eine Funktion, die ich bisher immer nur mit Bildern reproduzieren konnte: Ränder, die sich unten an jedem Tab nach *außen* biegen. In diesem Artikel möchte ich zeigen, wie Sie die CSS-Pseudo-Elemente :before und :after verwenden können, um diesen Effekt ohne Bilder zu erzielen. Beginnen wir zunächst mit einem einfachen Markup.

Das Markup

<ul class="tabrow">
   <li>Lorem</li>
   <li>Ipsum</li>
   <li class="selected">Sit amet</li>
   <li>Consectetur adipisicing</li>
</ul>

Das ist so ziemlich das Grundlegendste, was man haben kann. Nicht viele Elemente, mit denen man arbeiten kann, aber es wird genügen.

Erste Schritte

Um zu beginnen, entfernen wir zunächst das Standard-Styling von <ul> und <li> und bringen diese Elemente in eine Reihe.

  • Lorem
  • Ipsum
  • Sit amet
  • Consectetur adipisicing
.tabrow {
  text-align: center;
  list-style: none;
  margin: 0;
  padding: 0;
  line-height: 24px;
}
.tabrow li {
  margin: 0 10px;
  padding: 0 10px;
  border: 1px solid #AAA;
  background: #ECECEC;
  display: inline-block;
}

Tab auswählen

Der ausgewählte Tab sollte natürlich deutlich sichtbar sein.

  • Lorem
  • Ipsum
  • Sit amet
  • Consectetur adipisicing
.tabrow li.selected {
  background: #FFF;
  color: #000;
}

Zum Grundlegenden kommen

Jede Tab-Steuerung benötigt eine klar definierte untere Kante. Sie wird jetzt nicht viel bewirken, aber später hilft sie, den Effekt desselected Tabs, der oben liegt, zu betonen.

  • Lorem
  • Ipsum
  • Sit amet
  • Consectetur adipisicing
.tabrow {
  position: relative;
}
.tabrow:after {
  position: absolute;
  content: "";
  width: 100%;
  bottom: 0;
  left: 0;
  border-bottom: 1px solid #AAA;
  z-index: 1;
}

Hier haben wir unser erstes :after Pseudo-Element eingeführt. Grundsätzlich fügt :after ein weiteres Kindelement zu einem Element hinzu. Es ist nicht im DOM (deshalb wird es als *Pseudo*-Element bezeichnet), also kein echtes Kindelement, aber es ist vollständig gestaltbar, solange man etwas content hinzufügt, in diesem Fall ein einzelnes Leerzeichen.

Meiner Meinung nach sind die Begriffe :before und :after etwas verwirrend, da die Pseudoelemente nicht tatsächlich vor oder nach dem Element hinzugefügt werden, auf das sie angewendet werden, sondern als Kindelemente eingefügt werden. Deshalb können Sie :before und :after auch nicht auf Elemente anwenden, die keine Kindelemente enthalten können ("no content"-Elemente) wie z. B. <input>.

In diesem Fall verwenden wir das Pseudoelement, um einen unteren Rand zu erstellen, der die Positionierung der Tabs nicht beeinflusst. Wir hätten einfach einen unteren Rand auf das <ul> setzen können, aber das hätte den nächsten Schritt etwas kniffliger gemacht.

Darüber hinaus

Nun ist ein wesentlicher Teil einer überzeugend aussehenden Tab-Steuerung, dass der ausgewählte Tab *vor* dem Rand liegt, während die anderen hinter dem Rand verschwinden. Um dies zu erreichen, ändern wir seinen unteren Rand und verwenden etwas z-index-Magie.

  • Lorem
  • Ipsum
  • Sit amet
  • Consectetur adipisicing
.tabrow:before {
  z-index: 1;
}
.tabrow li {
    position: relative;
  z-index: 0;
}
.tabrow li.selected {
  z-index: 2;
  border-bottom-color: #FFF;
}

Um die Biegungen herum

Jetzt ist es an der Zeit, den schwer fassbaren nach außen gebogenen Rand hinzuzufügen, und dafür verwenden wir :before und :after. Nehmen wir diesen Schritt Schritt für Schritt und positionieren zunächst einfach alles.

  • Lorem
  • Ipsum
  • Sit amet
  • Consectetur adipisicing
.tabrow li:before,
.tabrow li:after {
  position: absolute;
  bottom: -1px;
  width: 6px;
  height: 6px;
  content: " ";
}
.tabrow li:before {
  left: -6px;
}
.tabrow li:after {
  right: -6px;
}
.tabrow li:after, .tabrow li:before {
  border: 1px solid #AAA;
}

Sei nicht so ein Quadrat

Sie sehen wahrscheinlich, worauf das hinausläuft. Entfernen wir die unerwünschten Ränder und fügen einige abgerundete Ecken hinzu.

  • Lorem
  • Ipsum
  • Sit amet
  • Consectetur adipisicing
.tabrow li {
  border-top-left-radius: 6px;
  border-top-right-radius: 6px;
}
.tabrow li:before {
  border-bottom-right-radius: 6px;
  border-width: 0 1px 1px 0;
}
.tabrow li:after {
  border-bottom-left-radius: 6px;
  border-width: 0 0 1px 1px;
}

Ecken abschneiden

Irgendetwas stimmt mit diesem Ergebnis nicht ganz. Sehen wir es uns genau an. Wie Sie sehen, sind sowohl die ursprüngliche gerade Ecke als auch die abgerundete Ecke sichtbar. Wir müssen die gerade Ecke irgendwie loswerden. Dazu decken wir sie mit einem Schatten ab. Um zu veranschaulichen, was passiert, lassen wir den Schatten etwas hervorstechen.

  • Lorem
  • Ipsum
  • Sit amet
  • Consectetur adipisicing
.tabrow li:before {
  box-shadow: 2px 2px 0 red;
}
.tabrow li:after {
  box-shadow: -2px 2px 0 red;
}

Fast fertig

Wie Sie sehen, verdecken die roten Schatten vollständig die quadratischen Ecken, die wir ausblenden möchten. Wenn wir dem Schatten die richtigen Farben geben, ist die Illusion perfekt.

  • Lorem
  • Ipsum
  • Sit amet
  • Consectetur adipisicing
.tabrow li:before {
  box-shadow: 2px 2px 0 #ECECEC;
}
.tabrow li:after {
  box-shadow: -2px 2px 0 #ECECEC;
}
.tabrow li.selected:before {
  box-shadow: 2px 2px 0 #FFF;
}
.tabrow li.selected:after {
  box-shadow: -2px 2px 0 #FFF;
}

Stilvolle Details

Alles, was jetzt noch zu tun ist, ist, ein paar Verläufe und Schatten hinzuzufügen, um das Ganze noch etwas aufzupeppen.

  • Lorem
  • Ipsum
  • Sit amet
  • Consectetur adipisicing
.tabrow li {
  background: linear-gradient(to bottom, #ECECEC 50%, #D1D1D1 100%);
  box-shadow: 0 3px 3px rgba(0, 0, 0, 0.4), inset 0 1px 0 #FFF;
  text-shadow: 0 1px #FFF;
  margin: 0 -5px;
  padding: 0 20px;
}

Wenn Sie sich fragen, wie es mit der Browserkompatibilität aussieht, ist es genau wie erwartet: alles außer IE. Es ist sehr gut möglich, dass es in IE10 funktioniert, aber ich hatte noch keine Gelegenheit, mit einer Vorschauversion zu testen. Da IE8 und IE9 :before und :after unterstützen, aber nicht border-radius, müssen Sie dafür ein separates Stylesheet erstellen, wenn Sie deren Nutzern ein schönes visuelles Erlebnis bieten möchten.

Demo ansehen   Dateien herunterladen

Anmerkung der Redaktion: Ich habe der Demo im Beispielanker-Links innerhalb der Tabs hinzugefügt, da ich denke, dass es am wahrscheinlichsten ist, dass Tab-Navigationen wie diese Ankerlinks haben. Wahrscheinlich hätten sie ein href-Attribut, das über id zum entsprechenden Inhalt verlinkt, und dieses Verhalten würde durch JavaScript gesteuert. Die Tatsache, dass dieses Tutorial die Ankerlinks für die zusätzlichen Pseudoelemente nicht benötigt, ist ein weiterer Beweis dafür, dass es besser ist als meine ursprüngliche Version.

Update: Allan Watkins hat mir eine Variante davon geschickt, die nach unten zeigt

Siehe den Pen Nach unten zeigende Rund-Außen-Tabs von Chris Coyier (@chriscoyier) auf CodePen.

  • Samir
    Permalink to comment#

    Chris, ich bin ein großer Fan Ihrer Arbeit und das ist einfach ein Meisterwerk. Ich wollte nur wissen, wo zum Teufel Sie auf die Idee gekommen sind, das mit CSS zu machen, jeder andere hätte es mit Bildern gemacht, aber Sie sind wirklich der CSS-Meister.

  • Johnny Simpson
    Permalink zum Kommentar#

    Das ist eine großartige Technik! Ich wäre nicht darauf gekommen.

  • Ben
    Permalink zum Kommentar#

    Das ist wirklich schön. Danke fürs Teilen.

    Zwei Klärungspunkte, allerdings. Wenn Sie sagen

    Meiner Meinung nach sind die Begriffe :before und :after etwas verwirrend, da die Pseudoelemente nicht tatsächlich vor oder nach dem Element, auf das sie angewendet werden, hinzugefügt werden, sondern als Kinder eingefügt werden.

    Ich denke, das ist tatsächlich irreführend. Das W3C sagt, sie gehen nach dem DOM-Baum, nicht als nachfolgende Kinder. Sehen Sie

    http://www.w3.org/TR/CSS2/generate.html

    Und dann sagen Sie, dass

    Das ist auch der Grund, warum Sie :before und :after nicht auf Elemente anwenden können, die keine Kinder enthalten können ("no content"-Elemente), wie z. B. .

    was einfach falsch ist. Probieren Sie es aus

    input:after {
    	content: "check me out Menno!";

    bei einem input type="radio" ...

  • MISSIRIA
    Permalink zum Kommentar#

    Aber es ist nicht kompatibel mit IE7 :) und haben Sie dafür eine JS-Bibliothek?

  • Simon
    Permalink zum Kommentar#

    Das ist sehr cool, so gut, dass Sie gezeigt haben, wie es auch nur mit CSS gemacht werden kann. Das wird es mir viel einfacher machen, es in einige CMS meiner Kunden zu integrieren.

    Ich werde jetzt damit anfangen zu spielen

  • Ira Hanson
    Permalink zum Kommentar#

    Wenn Sie <label>-Tags und eine Gruppe von Radio-Buttons verwenden, können Sie den Tab-Wechsel ganz ohne JavaScript durchführen.

    Demo mit jsFiddle

  • wobla
    Permalink zum Kommentar#

    Das ist großartig. Das einzige Problem ist das Zoomen – selbst eine leichte Änderung lässt den unteren Teil des Tabs schlecht aussehen. Gibt es dafür eine Lösung, abgesehen davon, den Benutzern zu sagen, sie sollen nicht zoomen?

  • cenco
    Permalink zum Kommentar#

    @stryju

    Das ist großartig! Vielen Dank für Ihre Hilfe, es funktioniert perfekt!

    Mit freundlichen Grüßen,

    cenco

  • Brad
    Permalink zum Kommentar#

    Wunderbares Aussehen, aber ich konnte es mit e.preventdefault nicht auf dem Localhost zum Laufen bringen. Habe das Skript auf dieser Seite und das, das mit dem Download kam, ausprobiert. Ansonsten super Idee!

  • Adam
    Permalink zum Kommentar#

    Wirklich nett, Chris! Jedes Mal, wenn ich eine schöne Navigationsleiste wie diese mit mehreren Zuständen haben wollte, habe ich die alte riesige Bild-Sprite-Apple-Technik verwendet, die gut funktioniert, aber mit fast keinen Bildern ziemlich gut heranzukommen ist eine Leistung! Gute Arbeit!

  • Robin Layfield
    Permalink zum Kommentar#

    Ich habe ein Dabblet für dieses Beispiel erstellt

    http://dabblet.com/gist/1633247

    damit Sie mit CSS im Browser spielen können

    Robin

  • Joss Crowcroft
    Permalink zum Kommentar#

    Großartige Sache!

    Ich empfehle border-bottom: 2px solid white; für den ausgewählten Tab. Der zusätzliche Randpixel überdeckt den unansehnlichen Rand unter dem Tab (zumindest bei mir in Chrome)

  • Adam
    Permalink zum Kommentar#

    Danke für den Tipp, hier gibt es einige großartige Artikel!

  • herbyderby
    Permalink zum Kommentar#

    Vielen Dank. Ziemlich erstaunliches "kleines" Tutorial dazu! Und der Schock: Funktioniert nicht in früheren Versionen von IE... ugh.

    Trotzdem nochmals vielen Dank!

  • Will Drotar
    Permalink zum Kommentar#

    Schön und einfach, danke!

  • Alec
    Permalink zum Kommentar#

    Danke für diesen großartigen Artikel. Ich muss sagen, Ihr Blog bietet viele nützliche Informationen. Ich denke, das war wirklich ein interessanter Artikel. Tatsächlich habe ich es genossen, diesen Artikel zu lesen. Teilen Sie weiterhin so faszinierende Blogs.

  • Kake
    Permalink zum Kommentar#

    Hallo

    Schöne Tabs.. Gibt es eine Möglichkeit, die Tabs linksbündig auszurichten? (Wenn ich versuche, text-align: left; für .tabrow zu manipulieren
    Der erste Tab verliert seine linke Seite..

  • Jack
    Permalink zum Kommentar#

    Vielen Dank sowohl an Chris Coyier als auch an Menno van Slooten für dieses wunderbare Werk. Chris, Ihre Seite ist hervorragend! Ich fange gerade erst an, die Kraft von CSS zu erkennen und zu nutzen, nachdem ich jahrelang mit Tabellen festgesteckt habe. Das größte Problem, das ich habe, ist die Ausrichtung, aber ich komme dank Websites wie dieser dorthin.

    Menno van Slooten, ich habe Ihre Website als Lesezeichen gespeichert und werde sie weiter erkunden, wenn ich meine Runden drehe, um weitere von mir gespeicherte Websites zu erkunden. :)

    Danke!

    Jack

  • MartinVr

    Hallo, das ist hervorragende Arbeit.

    Wie kann ich href zum Laufen bringen? Ich bin Anfänger in CSS und würde wirklich gerne wissen, was ich tun muss, damit die Tabs zu anderen HTML-Seiten verlinken?
    Danke

    Martin

  • Darin
    Permalink zum Kommentar#

    Ich habe zwei Fragen

    Testseite: http://www.employeeuniversity.com/videos/customer-service-viral.htm

    Wenn ich diese Testseite aufrufe, sind die Tabs nicht formatiert. Keine Form ist vorhanden und die Tab-Inhaltsboxen sind ebenfalls durcheinander. Es sieht gut aus in Chrome und IE8 (zumindest ist die Form vorhanden) und in IE10, aber in IE9 muss ich auf den COMPATIBILITY VIEW-Button klicken, damit die Tabs sich "formen" und funktionieren. Was könnte das verursachen?
    Was muss ich in das CSS eingeben, damit der aktive Tab (derjenige, der beim Laden der Seite angezeigt wird) als weißer Tab erscheint, so wie er aussieht, wenn man auf einen Tab geklickt hat?

    Vielen Dank im Voraus – das IE9-Problem ist von entscheidender Bedeutung

  • Lazza
    Permalink zum Kommentar#

    Die Tabs sehen bei mir leicht defekt aus, sowohl unter Firefox als auch unter Chromium. Wenn Sie statt "-6px" "-5px" für die Pseudoelemente setzen, sehen sie perfekt aus!

  • Bernd

    Nun, ich habe eine Version erstellt, die perfekt mit JQuery-Tabs funktioniert.

    Haben Sie einen Tipp für mich, wie ich sie von der Mitte nach links ausrichten kann, damit sie die Ränder auf der linken Seite nicht verliert (Padding oder Margin-Parameter)?

    Vielen Dank aus Deutschland

  • Dieser Kommentarbereich ist geschlossen. Wenn Sie wichtige Informationen teilen möchten, kontaktieren Sie uns bitte.