Weltweit sind Mediensteuerungssymbole eine der universell verständlichsten visuellen Sprachen in jeder Art von Benutzeroberfläche. Ein Designer kann einfach davon ausgehen, dass jeder Benutzer nicht nur weiß, dass ▶️ = Play bedeutet, sondern dass Benutzer auch nach dem Symbol suchen, um Videos oder Animationen anzusehen.
Berichten zufolge in den 1960er Jahren vom schwedischen Ingenieur Philip Olsson eingeführt, wurde der Play-Pfeil erstmals entwickelt, um die Richtung anzuzeigen, in die das Band beim Lesen auf Reel-to-Reel-Bandgeräten lief. Seitdem haben wir von Kassetten zu CDs, vom iPod zu Spotify gewechselt, aber die Symbole für die Mediensteuerung sind gleich geblieben.
Das Play ▶️ Symbol ist ein Standard-Symbol (mit eigenem Unicode) zum Starten von Audio-/Videomedien, zusammen mit anderen Symbolen wie Stopp, Pause, Vorspulen, Zurückspulen und anderen.
Es gibt Unicode- und Emoji-Optionen für Play-Button-Symbole, aber wenn Sie etwas Benutzerdefiniertes wünschen, könnten Sie zu einer Icon-Schriftart oder einer benutzerdefinierten Ressource greifen. Aber was, wenn Sie zwischen den Symbolen wechseln möchten? Kann diese Änderung reibungslos erfolgen? Eine Lösung könnte die Verwendung von SVG sein. Aber was, wenn es mit 10 Zeilen CSS möglich wäre? Wie raffiniert ist das denn‽
In diesem Artikel bauen wir sowohl einen Play- als auch einen Pause-Button mit CSS und untersuchen dann, wie wir CSS-Übergänge verwenden können, um zwischen ihnen zu animieren.
Play-Button
Schritt eins
Wir wollen ein nach rechts zeigendes Dreieck erzielen. Beginnen wir damit, eine Box mit einem dicken Rahmen zu erstellen. Derzeit sind Boxen die bevorzugte Basismethode zur Erstellung von Dreiecken. Wir beginnen mit einem dicken Rahmen und hellen Farben, um unsere Änderungen zu sehen.
<button class='button play'></button>
.button.play {
width: 74px;
height: 74px;
border-style: solid;
border-width: 37px;
border-color: #202020;
}

Schritt zwei
Das Rendern eines einfarbigen Rahmens ergibt das obige Ergebnis. Versteckt hinter der Farbe des Rahmens verbirgt sich ein kleiner Trick. Wie wird der Rahmen genau gerendert? Ändern wir die Rahmenfarben, eine für jede Seite, das hilft uns zu sehen, wie der Rahmen gerendert wird.
.button.play {
...
border-width: 37px 37px 37px 37px;
border-color: red blue green yellow;
}

Schritt drei
An der Schnittstelle jedes Rahmens werden Sie feststellen, dass sich ein 45-Grad-Winkel bildet. Dies ist eine interessante Art, wie Browser Rahmen rendern, und eröffnet daher die Möglichkeit für verschiedene Formen, wie Dreiecke. Wie wir unten sehen werden, wenn wir `border-left` breit genug machen, scheint es, als ob wir ein Dreieck erreichen könnten!
.button.play {
...
border-width: 37px 0px 37px 74px;
border-color: red blue green yellow;
}

Schritt vier
Nun, das hat nicht wie erwartet funktioniert. Es ist, als ob die innere Box (der eigentliche Div) darauf bestand, ihre Breite zu behalten. Der Grund dafür liegt in der Eigenschaft box-sizing, die standardmäßig den Wert content-box hat. Der Wert content-box weist den Div an, jeden Rahmen *außerhalb* zu platzieren, wodurch sich die Breite oder Höhe erhöht.
Wenn wir diesen Wert auf border-box ändern, wird der Rahmen *innerhalb* der Box hinzugefügt.
.button.play {
...
box-sizing: border-box;
width: 74px;
height: 74px;
border-width: 37px 0px 37px 74px;
}

Letzter Schritt
Jetzt haben wir ein richtiges Dreieck. Als nächstes müssen wir den oberen und unteren Teil (rot und grün) entfernen. Dies tun wir, indem wir die border-color dieser Seiten auf transparent setzen. Die Breite gibt uns auch Kontrolle über die Form und Größe des Dreiecks.
.button.play {
...
border-color: transparent transparent transparent #202020;
}

Hier ist eine Animation, die das erklärt, wenn das hilfreich ist.
Pause-Button
Schritt eins
Wir fahren mit der Erstellung unseres Pausesymbols fort, indem wir mit einer weiteren Box mit dickem Rahmen beginnen, da die vorherige so gut funktioniert hat.
<button class='button pause'></button>
.button.pause {
width: 74px;
height: 74px;
border-style: solid;
border-width: 37px;
border-color: #202020;
}

Schritt zwei
Dieses Mal verwenden wir eine weitere CSS-Eigenschaft, um das gewünschte Ergebnis von zwei parallelen Linien zu erzielen. Wir ändern den border-style auf double. Die doppelte Eigenschaft bei `border-style` ist ziemlich einfach: Sie verdoppelt den Rahmen, indem sie einen transparenten Strich dazwischen hinzufügt. Der Strich oder die leere Lücke beträgt 33 % der angegebenen Rahmenbreite.
.button.pause {
...
border-style: double;
border-width: 0px 37px 0px 37px;
}

Letzter Schritt
Eigenschaft `border-width`. Die Verwendung von `border-width` ist es, die den Übergang im nächsten Schritt reibungslos macht..button.pause{
...
border-width: 0px 0px 0px 37px;
border-color: #202020;
}

Animation des Übergangs
Bei den beiden oben erstellten Buttons fällt auf, dass es viele Ähnlichkeiten gibt, aber zwei Unterschiede: border-width und border-style. Wenn wir CSS-Übergänge verwenden, können wir zwischen den beiden Symbolen wechseln. Es gibt keinen Übergangseffekt für border-style, aber border-width funktioniert hervorragend.
Ein Toggle mit der Klasse pause animiert nun zwischen dem Play- und Pause-Zustand.
Hier ist der finale Stil in SCSS
.button {
box-sizing: border-box;
height: 74px;
border-color: transparent transparent transparent #202020;
transition: 100ms all ease;
will-change: border-width;
cursor: pointer;
// play state
border-style: solid;
border-width: 37px 0 37px 60px;
// paused state
&.pause {
border-style: double;
border-width: 0px 0 0px 60px;
}
}
Demo
Sieh dir den Pen Button Transition with Borders von Chris Coyier (@chriscoyier) auf CodePen an.
Umschalten ohne JavaScript
Bei einem realen Play/Pause-Button werden Sie mit ziemlicher Sicherheit JavaScript verwenden, um den Zustand des Buttons umzuschalten. Aber es ist interessant zu wissen, dass es einen CSS-Weg gibt, dies zu tun, indem ein Input-Element und ein Label verwendet werden: der Checkbox-Hack.
<div class="play-pause">
<input type="checkbox" value="" id="playPauseCheckbox" name="playPauseCheckbox" />
<label for="playPauseCheckbox"></label>
</div>
.playpause {
label {
display: block;
box-sizing: border-box;
width: 0;
height: 74px;
cursor: pointer;
border-color: transparent transparent transparent #202020;
transition: 100ms all ease;
will-change: border-width;
// paused state
border-style: double;
border-width: 0px 0 0px 60px;
}
input[type='checkbox'] {
visibility: hidden;
&:checked + label {
// play state
border-style: solid;
border-width: 37px 0 37px 60px;
}
}
}
Demo
Sieh dir den Pen Toggle Button with Checkbox von Chris Coyier (@chriscoyier) auf CodePen an.
Ich freue mich auf Ihre Gedanken und Ihr Feedback. Bitte fügen Sie sie unten in die Kommentare ein.
Was ist falsch daran, U+25B6 zu verwenden??
Außerdem bitte nicht versuchen, Steuerelemente ohne JavaScript als etwas Gutes anzusehen. JavaScript erhöht die Zugänglichkeit. Ohne JavaScript können Sie beispielsweise keine Zugriffsschlüssel (Tastenkombinationen) zuweisen, die es Tastaturnutzern ermöglichen, andere Aspekte des Players zu steuern, wenn Play (oder was auch immer der Button ist) den Fokus hat. Diese Benutzer sind gezwungen, sequenziell zu dem benötigten Button zu tabulieren, wenn kein `keyup`-Ereignis-Handler an den Play-Button angehängt ist, um die Aufgaben der anderen Buttons zu erfüllen.
Hast du den Artikel nicht gelesen?
Tatsächlich gibt es das Attribut `accesskey`, das in HTML5 jedem Element hinzugefügt werden kann. Das ist also immer noch für Benutzer verfügbar.
Nichts! Obwohl viele Unicode-Symbole in verschiedenen Browsern unterschiedlich gerendert werden, verwende ich sie persönlich nicht sehr oft. Ich weiß, dass Webseiten nicht in jedem Browser gleich aussehen müssen, aber bei Unicode-Symbolen gibt es oft Ausrichtungsunterschiede zwischen Browser A und Browser B und manchmal sogar in Browser C, was Ihre Benutzeroberfläche durcheinander bringen kann.
Dieser Beitrag erinnert mich tatsächlich an die frühen Tage von CSS Tricks. Chris selbst hat damals viele dieser Beiträge geschrieben. Es heißt ja schließlich CSS Tricks. Sind diese Art von Tricks nützlich? Vielleicht! Sind sie praktisch? Manchmal!
Es geht nur darum, Spaß mit CSS zu haben!
Es ist nicht animierbar.
Als JavaScript-Entwickler plädiere ich dafür, so wenig JavaScript wie möglich zu schreiben.
Es ist nicht grundsätzlich gegen JavaScript, sondern Code selbst kann eine Fehlerquelle sein. Das gilt natürlich für jede Sprache, auch für CSS, aber mit reinem CSS kann Ihre Anwendung nicht kaputtgehen.
Dafür gibt es das globale Attribut
accesskey.Ich sage nicht, dass Sie JavaScript *nicht* verwenden sollten, sondern es für Dinge verwenden sollten, die tatsächlich nützlich sind. Wenn Sie zum Beispiel möchten, dass die Leertaste den Wiedergabestatus umschaltet, ist das in Ordnung – für alles muss es eine Begründung geben.
Hallo! Danke für Ihre Kommentare.
Es ist nichts falsch daran, das Unicode-Zeichen zu verwenden oder JavaScript nicht für den obigen Code zu verwenden. Es gibt Fälle, in denen sie verwendet werden können.
Warum habe ich kein Unicode verwendet? Die Form war etwas anders als von Designern gewünscht. Man kann (soweit ich weiß) nicht zwischen anderen Zeichen (wie dem Pause-Zeichen) wechseln.
Warum kein JavaScript? Natürlich ja zu JavaScript! Der Zustand (Play/Pause) kann an die Checkbox gebunden werden, Zugriffsschlüssel wie Sie sagten, aber Sie müssen sich keine Sorgen um das Aussehen des Buttons machen, da CSS das `checked`-Attribut prüft und seine Sache macht, ohne dass JavaScript eine CSS-Klasse umschaltet.
Was dieser Artikel zu zeigen versucht, ist die Macht von CSS.
Daniel
Und umgekehrt, wenn Sie sich auf JavaScript verlassen und es nicht geladen wird (oder nicht geladen werden darf), geht die Funktionalität verloren. Sie können sich auf den Checkbox-Hack konzentrieren, da es sich um einen Input im DOM handelt. Denken Sie daran, es gab eine Zeit, in der Formulare ohne JavaScript funktionieren mussten und die Zugänglichkeit damals ziemlich gut integriert war.
„Ohne JavaScript können Sie keine Zugriffsschlüssel zuweisen“…
Haben Sie noch nie vom HTML-Attribut `accesskey` gehört?
Keine schlechte Idee, wenn man Animationen braucht, ansonsten reicht Unicode.
Hier ist meine Version
Ich stimme auch Alice Wonder Miscreations zu, es ist nicht immer gut, CSS für Zustandsänderungen zu verwenden.
Ich habe eine Variation davon erstellt, die Pseudoelemente verwendet (die gleiche Border-Technik), sodass sich das Play-Symbol beim Animieren halbiert.
Schöner Artikel… Ich schätze deine detaillierte Aufschlüsselung zur Erstellung eines Dreiecks sehr… ich liebe diese Demo-Animation, wie geschickt du die Sprechblase für Play wieder in die Demo integriert hast. Großer Fan, seit ich mit dem CSS-Lernen begonnen habe.
Ich würde immer noch lieber SVGs anstelle von Border-Shapes verwenden, da play.svg auf einen Blick leichter zu verstehen und zu modifizieren ist als `border-color: transparent transparent transparent #202020;`
Abgesehen von der Debatte zwischen CSS und JavaScript wurde dieser Artikel sehr gut geschrieben und die Erklärungen des Codes waren vorbildlich. Ihre Art, das CSS aufzuschlüsseln, war leicht verständlich und nicht hochnäsig. Mehr Leute müssen diese Dinge verstehen. Ich wäre direkt zu einer SVG oder Icon-Schriftart gegangen. Danke.
Es macht mich traurig zu sehen, wie Border-Hacks und reine CSS-Lösungen wichtiger erachtet werden als gute zugängliche Benutzeroberflächen. Dieser „Button“ ist in beiden Fällen nicht per Tastatur zugänglich. Stellen Sie sich auch vor, Sie schalten Play/Pause mit einer Checkbox um, ohne dass CSS angewendet wird. Klingt doch lächerlich, oder? Warum sollten Sie einem Screenreader-Nutzer diese verwirrende Checkbox-Metapher geben? Nun, ich weiß warum: damit es CSS-only ist. Aber wen zum Teufel interessiert es, ob Ihr JS-Player von einem CSS-only-Button umgeschaltet wird?
Das habe ich mit Pseudoelementen gemacht, nachdem YouTube seinen Button geändert hat, um eine Animation zu haben. Dieser animiert beim Hovern, könnte aber leicht mit dem Checkbox-Hack gemacht werden.
https://codepen.io/fauxserious/details/XbvMrM/
Das ist nett.
Es ist ein cleverer und einfacher visueller CSS-Hack. Ich mag ihn. Irgendwann können wir alle animierbare `clip-path` dafür verwenden, oder eines Tages vielleicht eine SVG, die die Zustände und Animationen selbst handhabt, aber das funktioniert jetzt und ist ziemlich einfach.
Für A11y können Sie `role=button`, `aria-label=“play/pause“` und `tabindex=0` zum Label hinzufügen und vielleicht einen `keypress`-Handler, und Sie sind ziemlich gut aufgestellt.
Die gesamte von Ihnen gegebene Empfehlung (abgesehen von `aria-label`) könnte durch die Verwendung eines richtigen `
gute Arbeit. Aber können Sie ein Lied hinzufügen, das mit Ihrem Button funktioniert?
Danke für den inspirierenden Artikel. Ich habe die `border-styling`-Eigenschaft mit einigen Player-Buttons hier erkundet: https://codepen.io/o-k-s-a-n-a/pen/YraoJV.
Ich liebe es – mein Verstand explodiert, wenn ich darüber nachdenke, wie Menschen all diese tollen Formen in CSS erstellen können, und die Animation ist schön – das ist wirklich ein CSS-Trick
Schöne Interrobang-Verwendung! Man sieht sie nicht wirklich.
Und jetzt versuchen Sie, ihn mit einer Tastatur zu aktivieren:).
Schön
Ich habe vor einiger Zeit etwas Ähnliches gemacht
Mit dem Pfeil, der sich halbiert, um sich in die Balken des Pausenzeichens zu verwandeln, wie beim YouTube-Button
Lassen Sie mich wissen, was Sie denken
Philip schrieb mit einer Version, die eine CSS-Benutzerdefinierte Eigenschaft verwendet, sodass die Größe angepasst werden konnte