Das werden wir in diesem Tutorial erstellen

Der Basistext für HTML
Wir verwenden eine einfache unsortierte Liste1 innerhalb eines <nav>-Tags, um unsere Buttons zu erstellen.
<nav>
<ul class="nav">
<li><a href="#" class="icon-home"></a></li>
<li><a href="#" class="icon-cog"></a></li>
<li><a href="#" class="icon-cw"></a></li>
<li><a href="#" class="icon-location"></a></li>
</ul>
</nav>
Einige Ressourcen
- Diese Icons in den Buttons stammen von der Fontello Icon-Schriftart und Webanwendung.
- Der texturierte Hintergrund stammt von Subtle Patterns.
CSS für die Icon-Schriftart
Es gibt mehrere Möglichkeiten, dies zu tun, aber wir werden diese hier verwenden
@font-face {
font-family: 'fontello';
src: url('../fonts/fontello.eot');
src: url('../fonts/fontello.eot?#iefix') format('embedded-opentype'),
url('../fonts/fontello.woff') format('woff'),
url('../fonts/fontello.ttf') format('truetype'),
url('../fonts/fontello.svg#fontello') format('svg');
font-weight: normal; font-style: normal;
}
[class*=" icon-"] {
font-family: 'fontello';
font-style: normal;
font-size: 3em;
speak: none;
}
.icon-home:after { content: "\2302"; }
.icon-cog:after { content: "\2699"; }
.icon-cw:after { content: "\27f3"; }
.icon-location:after { content: "\e724"; }
CSS für die Buttons
Die Buttons werden horizontal angeordnet, indem die Listenelemente inline-block gemacht werden. Wir lassen sie mit einem kleinen negativen Margin aneinanderstoßen (oder siehe diese anderen Techniken).
.nav {
list-style: none;
text-align: center;
}
.nav li {
position: relative;
display: inline-block;
margin-right: -4px;
}
Die schöne Dreidimensionalität der Buttons ergibt sich aus einem dezenten Farbverlauf und einer Ver-/Entgratungs-Effekt durch ein Paar box-shadows, eines normal und eines inset. Die Breite und Höhe der Buttons sind identisch, wodurch ein Quadrat entsteht, das mit border-radius zu einem Kreis wird. Die line-height entspricht der Höhe und text-align ist auf zentriert gesetzt, sodass die Icons sowohl horizontal als auch vertikal zentriert sind.
.nav a {
display: block;
background-color: #f7f7f7;
background-image: -webkit-gradient(linear, left top, left bottom, from(#f7f7f7), to(#e7e7e7));
background-image: -webkit-linear-gradient(top, #f7f7f7, #e7e7e7);
background-image: -moz-linear-gradient(top, #f7f7f7, #e7e7e7);
background-image: -ms-linear-gradient(top, #f7f7f7, #e7e7e7);
background-image: -o-linear-gradient(top, #f7f7f7, #e7e7e7);
color: #a7a7a7;
margin: 36px;
width: 144px;
height: 144px;
position: relative;
text-align: center;
line-height: 144px;
border-radius: 50%;
box-shadow: 0px 3px 8px #aaa, inset 0px 2px 3px #fff;
}
Wir können die Buttons bei :hover etwas abflachen, um einen gedrückten Look zu erzeugen. Sie könnten dies für :active aufheben und etwas anderes für :hover tun, aber das überlassen wir Ihnen.
.nav a:hover{
text-decoration: none;
color: #555;
background: #f5f5f5;
}
An diesem Punkt sollten unsere Buttons so aussehen

Nicht schlecht, aber wir haben noch einen Weg vor uns.
Nun zum unterhaltsamen Teil, wir werden Pseudo-Elemente verwenden, um zusätzliche Elemente zu erhalten, mit denen wir die restlichen Effekte erzielen können. Um die horizontale „Rille“ zu erzeugen, die Sie zwischen jedem Button sehen, werden wir den Pseudo-Selektor :before zu unseren Listenelementen hinzufügen. Mit einem negativen z-index halten wir ihn unter allem. Die doppelten border verleihen ihm den Innenansicht-Look. Die negativen Margins, die wir zuvor bei den Listenelementen verwendet haben, ermöglichen es dieser Rille, kontinuierlich auszusehen. Wir nutzen die absolute Positionierung, um die Linie zu zentrieren.
.nav li:before {
content: "";
display: block;
border-top: 1px solid #ddd;
border-bottom: 1px solid #fff;
width: 100%;
height: 1px;
position: absolute;
top: 50%;
z-index: -1;
}
Für diese zusätzliche Dreidimensionalität erstellen wir einen „Schacht“ um jeden Anker, in dem die Buttons sitzen. Dies können wir wieder ohne zusätzlichen HTML mit einem Pseudo-Element erstellen.
.nav a:before {
content: "";
display: block;
background: #fff;
border-top: 2px solid #ddd;
position: absolute;
top: -18px;
left: -18px;
bottom: -18px;
right: -18px;
z-index: -1;
border-radius: 50%;
box-shadow: inset 0px 8px 48px #ddd;
}
Die Größe des Schachts (etwas größer als der Button selbst) ergibt sich aus der absoluten Positionierung hinter dem Button und der Streckung durch negative Positionierungswerte (oben/unten/links/rechts). Der 3D-Look ergibt sich diesmal aus einem oberen border und einem inset box-shadow, der einen inneren Schatten erzeugt.
Und wir sind fertig!
Das war gar nicht so schlimm, oder?

Browser-Unterstützung
Diese Buttons verwenden viel CSS3 und einige Pseudo-Elemente, die zu CSS 2.1 gehören. Nichts allzu Progressives. Jede Version von Safari, Chrome, Opera oder Firefox der letzten Jahre wird damit keine Probleme haben. IE 8 kann kein CSS3, daher fällt es auf dies zurück

IE 7 ist ähnlich, nur ohne die „Rillen“-Linie, da es keine Pseudo-Elemente kann. Auch kein großes Ding.
1 Unsortierte Listen sind möglicherweise nicht ideal für die Navigation. Wir haben sie hier trotzdem verwendet, da wir das zusätzliche Element benötigten.
Sehr clevere und schöne Buttons!
Ich mache schon eine Weile 3D-Buttons wie diese, aber dieser Schacht macht es noch besser!
Finde ich super…. wie könnten wir diese responsiv machen? Können wir Prozentgrößen verwenden? Oder lohnt es sich überhaupt… Ich höre schon ein Fiddle kommen….
Sanft… aber ich will sie einfach drücken! :)
Ich frage mich, warum der
active-Zustand fehlt, ich denke, das wäre eine großartige Ergänzung.Fontello ist ein großartiges Open-Source-Software-Tool. :)
Re: Fontello. Ich wünschte, ich könnte auf ihre Website zugreifen. Lädt gerade nicht (13. Juni, 9 Uhr): fontello.com. Bin froh, dass ich gerade kein zeitkritisches Projekt habe.
Schön, aber nicht zugänglich!
Nicht für Crawler, noch für Benutzer, die CSS deaktiviert haben,
die einen Textbrowser oder einen Screenreader verwenden.
Zustimmung! Leere a-Tags sind schrecklich für Benutzerfreundlichkeit und SEO. Setzen Sie Linktext in einen Span, der etwas wie die HTML5-Boilerplate-Klasse „visuallyhidden“ hat, um sowohl Zugänglichkeit als auch optische Attraktivität zu erhalten.
Nun, Sie können immer noch einen Titel für das „a“-Element einfügen oder normalen Text zwischen „“ und „“ einfügen und einfach text-indent: -9999px oder was auch immer einstellen. Ich sehe kein Problem für SEO. Diese Buttons sind genauso gut wie Buttons mit Bildern.
Diese sind großartig! Aber ihnen fehlt SEHR der aktive Zustand!!!!
In meinem IE8 kommen nicht nur die Effekte nicht durch, sondern auch die Glyphen sind anders!
Bill,
Chris hat bereits in seinem Artikel erwähnt, dass die Browserunterstützung in IE8 nicht funktioniert. Es gibt jedoch Möglichkeiten, verwenden Sie einfach ein separates Stylesheet für alles unterhalb von IE9. Ehrlich gesagt sollten Sie wirklich auf IE9 aktualisieren, oder einfach einen besseren Browser verwenden, wie: Safari oder Chrome.
Rob.
Ehrlich gesagt sollten Sie wirklich auf IE9 aktualisieren oder einfach einen besseren Browser verwenden, wie: Safari oder Chrome.
Komm schon, hast du darüber nachgedacht, dass Bill vielleicht schon einen absolut fähigen Browser benutzt? Er ist schließlich sowieso auf dieser Website. Ich würde annehmen, dass er seine Kunden im Auge behält, wenn er ältere Browser testet.
Es erinnert mich an einen Vorfall vom letzten Wochenende auf der FrontEnd Design Konferenz in St. Pete; Ein Redner, der sich mehr auf „State-of-the-Art“-Browsernutzung spezialisiert hatte, wurde gefragt, was er Entwicklern/Designern vorschlagen würde, die ältere Browser unterstützen müssen. Seine Antwort war, dass diese Benutzer upgraden sollen. Nicht sehr praktisch für eine E-Commerce-Seite (wo ich möchte, dass sie konvertieren und es mir egal ist, welchen Browser sie benutzen) oder für die meisten anderen Websites, die ein großes Publikum ansprechen wollen. Leider vergessen einige Leute, dass wir dieses „Web“ für mehr als nur Designer/Entwickler bauen, wir müssen auch andere im Auge behalten, die vielleicht nicht 8+ Stunden am Tag hinter einem Computer sitzen.
Tommy,
Ich verstehe Ihre Sichtweise und Ihr Punkt ist gut. Vielleicht habe ich meine Worte falsch gewählt, ich habe nicht angedeutet, dass wir unsere Arbeit stümpern und hoffen sollten, dass die Leute bessere Browser benutzen. Ich denke, jede Website muss in allen Browsern funktionieren, daher schlage ich ein separates Stylesheet für Benutzer einer älteren IE-Generation vor.
Der kleine Kommentar am Ende meines Punktes sollte nicht sagen, dass Entwickler die Probleme der Browserunterstützung nicht berücksichtigen sollten, es war nur ein persönlicher Vorschlag an Bill. Er hat wahrscheinlich schon einen absolut fähigen Browser und es war wahrscheinlich dumm zu sagen, dass er upgraden muss; meine Absicht war jedoch nicht, die Bedeutung der Browserunterstützung herabzusetzen.
Ja, ich habe einen großartigen
:active-Zustand erwartet.Habe das Gleiche gedacht – Entfesselt die Großartigkeit!!!
Sind Sie sicher wegen des IE-Screenshots? Die Demo-Buttons scheinen in IE7 gar nicht gerendert zu werden (Test in Adobe Browser Lab und Skytap Virtual Machine).
@Scott
Das ist normal, IE7 unterstützt :before und :after Pseudo-Elemente nicht.
Auch ich verwende diesen Button-Stil schon seit einiger Zeit, zuvor habe ich sie als Bilder von den ursprünglichen Photoshop-Designs ausgeliefert…
Toller Beitrag wie immer, Chris. Wundervolle Arbeit.
Habe den ursprünglichen Beitrag gerade nochmal gelesen, ich sollte wohl neuCredits vergeben! Tolle Arbeit von Brandon :)
Ich mag das, sehr einfach. Aber für bessere Zugänglichkeit mit Screenreadern wäre es nicht besser, den Text für die Navigation dort zu haben, mit text-indent:-9999? :)
Wird das in IE mit <a href=”http://selectivizr.com”> selectivizr</a> funktionieren?
Vielleicht gefallen Ihnen einige dieser Eye-Candy-Codebeispiele
https://code.google.com/p/css3-graphics/
https://code.google.com/p/css-shaders-graphics/
https://code.google.com/p/jquery-css3-graphics/
Gute Arbeit, Brandon.
Hier ist ein Fiddle mit einem einfachen :active-Zustand, nach dem einige fragen
http://jsfiddle.net/kTnMJ/
Und nach meinen Tests funktionieren die Icons in IE8 gut und die Buttons sind quadratisch, wie im Screenshot im Artikel gezeigt, aber IE7 funktioniert nicht. Ich denke, das liegt daran, dass IE7 inline-block nicht richtig unterstützt (aber ich habe es wirklich nicht viel untersucht).
Danke, Louis!
Ich habe das genommen, es auf CodePen übertragen und die von vielen Leuten erwähnten Zugänglichkeitsprobleme behoben.
http://codepen.io/chriscoyier/pen/46/3
ala https://css-tricks.de/html-for-icon-font-usage/
Ich denke, das Hinzufügen eines Randes zum Button im aktiven Zustand bringt nicht viel für die Benutzeroberfläche. Meiner Meinung nach, wenn das Element Schatten erhält, ist der Look, der zum aktiven Zustand passt, die Anwendung desselben Schattens wie im normalen Zustand, aber invertiert.
http://codepen.io/JCMais/pen/1/4
@chris
Ich konnte nicht anders, als darüber zu lachen, dass Sie Ihren eigenen Kommentar mit einem Sternchen versehen haben. :)
@jonathan
Ich bin nicht überzeugt, dass der Schatten so invertiert sein sollte. Er sieht okay aus, aber es sieht fast so aus, als ob der Button zu weit nach unten gedrückt wird. Ich glaube, ich bevorzuge meine, aber vielleicht wäre ein Kompromiss zwischen den beiden (mit nicht so einem großen Schatten im aktiven Zustand) am besten.
Ja, das mache ich normalerweise nicht, aber ich wollte extra, dass Leute es sehen, weil es ein Zugänglichkeitsproblem anspricht, das viele Leute erwähnt haben.
Ich denke auch, es sollte eine Art Effekt bei Hover geben – vielleicht kann er in einen „gedrückten“ Zustand übergehen.
Sie sehen großartig aus, und sie sehen auch in IE9 gut aus, außer dem Farbverlauf, was aber kein großes Problem ist. In älteren IE-Versionen sehen sie nicht gut aus, aber wen kümmert's?
DUDE! Diese sind NICEEE… Ich werde sehen, ob ich das Gegenteil für schwarze Buttons machen kann! SWAG!
Wow, sehr beeindruckend, definitiv nützlich für zukünftige Websites. Das einzige Problem, das ich sehe, ist, dass einige der Icons etwas deplatziert wirken, aber das ist leicht zu beheben. Danke fürs Teilen.
Sehr schön, auch wenn IE7 keine :before und :after Pseudo-Elemente unterstützt. Außerdem ist IE7 laut w3schools.com so gut wie tot… http://www.w3schools.com/browsers/browsers_explorer.asp
Versuchen Sie mal, echten Kunden zu sagen, dass IE7 tot ist. Warum sollten Sie davon ausgehen, dass Ihre Kundenbasis ein ähnliches Browserprofil hat wie die Besucher von W3schools?
Wenn Sie wirklich IE 7-Unterstützung benötigen, verwenden Sie einfach kein :before, sondern setzen Sie das Icon in die Markup. Oder verwenden Sie etwas JavaScript (nicht ideal, IE 7 ist schon langsam), um das Data-Attribut zu lesen und es in das Markup einzufügen.
Ich verstehe, wie Pseudo-Elemente funktionieren, aber ich habe sie noch nicht viel verwendet. Das ist eine großartige Demonstration dafür. Was ich etwas mehr Erklärung wünschen würde, ist, was genau der Aufbau und Effekt dieses Elements ist
Danke! :-)
Ich glaube, das ist ein CSS3-Attributselektor, der verwendet wird, um jede Klasse zu identifizieren, die das Präfix/Attribut „icon-“ enthält.
Das bestätigt meine Annahme. Ich meine, das ist es, was ich dachte, dass es tut, basierend auf den nachfolgenden Klassen. Ich liebe solche Dinge, die das Codieren reduzieren. Ich muss mich nur daran erinnern und mich daran gewöhnen, sie zu implementieren. :-)
Ich verwende dies etwas für das Namespacing von Komponenten in meinem CSS, anstatt mehrere Klassen zu haben, z.B. „icon icon-home“ .. Das „icon-“-Beispiel, das Sie hier bereits sehen, aber auch für Elemente wie „list-“, „btn-“ oder „pod-“ usw.
Ich lege meine Basisstile in der Deklaration [class*=”btn-“] fest und schreibe dann meine Überschreibungen oder Erweiterungen in den nachfolgenden Deklarationen, z.B. „btn-primary“.
Es gibt jedoch einige Überlegungen. Sie müssen sicherstellen, dass keine anderen Klassen das Schlüsselwort enthalten, für das Sie den „*=“-Selektor verwenden. Auch der „*=“-Selektor ist wahrscheinlich einer der am wenigsten performanten CSS-Selektoren. Aber fairerweise gesagt, wenn Sie sich Sorgen um die Leistung machen, sollten Sie Ihre Bemühungen besser woanders konzentrieren, z.B. Gzip, Minifizieren oder Optimieren von Bildern, da die Optimierung von CSS-Selektoren eher eine Mikrooptimierung ist.
Die Pseudo-Elemente sagen Ihnen, dass die Elemente mit der genannten Klasse mit icon- beginnen
Es funktioniert nicht in IE 7-8, haben wir einen Fallback-Code für IE?
Pseudo-Elemente wie :before und :after und sogar :nth-child(1) funktionieren in IE7, wenn Sie Selectivizr verwenden.
:nth-child, ja, :before/:after, nein
Ups, Sie haben Recht. Ich habe vergessen, dass ich das Layout ein wenig geändert habe, um es anzupassen.
Übrigens, wollte ich nur Danke sagen. Ich habe vor einiger Zeit einen Ihrer Screencasts gesehen, bei dem Sie die Website eines Freundes, ich glaube, eines Trompeters, überarbeitet haben, was mich zu WP (bevor es alles CI war) gebracht hat. Ich wurde ein regelmäßiger Besucher Ihrer Website, habe Ihr Buch gekauft, Ihr Video auf Lynda.com tausendmal angesehen und jetzt droht aus einem Teilzeitjob (den ich eher aus Spaß denn ernsthaft gemacht habe) ein Vollzeitjob zu werden. Ich habe im Moment vier Websites in der Pipeline!
Das ist wirklich ein erstaunlicher Stil, basierend auf reinem CSS.
Und heutzutage stoße ich auf viele Fälle bezüglich IE (IE sucks wirklich, IMHO). Das ist kein großes Ding, lol
DUDE! Diese sind NICEEE…
Das ist großartig!
Nebenbemerkung: display:block ist nicht notwendig, wenn absolute Positionierung verwendet wird. Das Element ist nicht mehr Teil des Seitenflusses.
Könnte helfen, ein paar CSS-Zeilen zu sparen ;)
Gut gemacht, Sie, ich habe eine Frage, der Code „.
nav a:before {
position: absolute;
top: -18px;
left: -18px;
bottom: -18px;
right: -18px;
} Es scheint, dass die vier Positionierungsparameter eine Breite und Höhe ergeben, die beide durch das a-Element plus den Margin für das nav a:before Pseudo-Element berechnet wurden.
Habe ich also Recht?
Ich habe eine Frage zu diesem Beispielcode
.icon-home:after { content: “\2302”; }
.icon-cog:after { content: “\2699”; }
.icon-cw:after { content: “\d7c60”; }
.icon-location:after { content: “\e724”; }
Ich sehe, wie die Icons mit dem spezifischen „{ content: „\2302“; }“ (wie oben) generiert werden. Dies wären zum Beispiel die Icons auf den Buttons selbst.
Wie ersetze ich die Icons von http://www.fontello.com? Geben sie mir die numerische Inhalts-ID # nach dem Download oder wie funktioniert das?
Ich wäre Ihnen für Ihre Hilfe in dieser Angelegenheit dankbar.