Es lohnt sich immer zu wiederholen: Alle interaktiven Elemente sollten einen Fokusstil haben. So kann ein Tastaturnutzer erkennen, wenn er den Fokus auf dieses Element verschoben hat.
Aber wenn Sie :focus allein dafür verwenden, hat es einen Nebeneffekt, den viele Leute nicht mögen. Das bedeutet, dass, wenn Sie (mit der Maus) auf ein interaktives Element klicken, Sie den Fokusstil sehen. Vermutlich brauchen Sie diese Rückmeldung als Maussutzer nicht, da Sie Ihren Cursor gerade dorthin bewegt und geklickt haben. Was auch immer Sie davon halten, es hat über die Jahre so viele Leute verärgert, dass sie Fokusstile komplett entfernen, was ein übler Nettoverlust für die Barrierefreiheit im Web ist.
Was wäre, wenn wir Fokusstile nur dann anwenden könnten, wenn die Tastatur zum Fokussieren von etwas verwendet wird, nicht die Maus? Lea Verou hat dies vor ein paar Jahren angesprochen.
Das war eine Reaktion darauf, dass Chrome die Funktion hinter einem Flag versteckt hat. Schlau, schlau.
Ein paar Jahre später veröffentlicht Chrome es ohne Flag. Sie sind von Leas Idee überzeugt.
Durch die Kombination von
:focus-visiblemit:focuskönnen Sie noch einen Schritt weiter gehen und unterschiedliche Fokusstile anbieten, je nach Eingabegerät des Benutzers. Dies kann hilfreich sein, wenn Sie möchten, dass die Fokusanzeige von der Präzision des Eingabegeräts abhängt.
/* Focusing the button with a keyboard will show a dashed black line. */
button:focus-visible {
outline: 4px dashed black;
}
/* Focusing the button with a mouse, touch, or stylus will show a subtle drop shadow. */
button:focus:not(:focus-visible) {
outline: none;
box-shadow: 1px 1px 5px rgba(1, 1, 0, .7);
}
Ich würde vorschlagen, diese Selektoren ohne button auszuprobieren und sie global anzuwenden!
Es gibt noch mehr zu entdecken, daher verlinke ich hier noch einiges mehr.
- Der Chromium Blogbeitrag behandelt die Heuristiken des Selektors. Es ist knifflig. Es ist, als gäbe es einen Algorithmus, der bestimmt, ob
:focus-visibleübereinstimmen wird oder nicht, dem man weitgehend vertrauen muss. Er behandelt auch die Idee, dass Firefox schon lange:-moz-focusringhat, aber das Verhalten ist unterschiedlich genug, dass sie die Verwendung nicht empfehlen, wenn man konsistentes Verhalten anstrebt. - Matthias Ott hat darüber mit einigen guten Informationen gebloggt, z. B. über die Verwendung des offiziellen Polyfills und wie man die Stile in DevTools richtig betrachtet (es gibt eine neue Checkbox dafür).
- Wir haben das schon einmal behandelt. Dabei haben wir Leas Tweet notiert, dass sie dachte, die Nutzung würde explodieren, wenn es wirklich veröffentlicht wird. Mal sehen (und hoffen)!
- Unser Almanacheintrag enthält viele Details.
Nur zur Anmerkung: Denken Sie nicht, dass Mausklicks keinen offensichtlichen Fokusstil verdienen. Ich öffne oft Links in neuen Tabs, und nach dem Schließen des Tabs ist die Fokusanzeige sehr hilfreich, um zu sehen, wo ich in einer Liste von Links aufgehört habe, zum Beispiel.
Das wird bei meinem nächsten Projekt nützlich sein. Danke fürs Teilen.
Ich stimme zu 100% zu. Eine Website ist viel beeindruckender, wenn sie einen Fokusstatus entworfen hat, der nahtlos mit dem Rest des Designs funktioniert, als wenn eine Website den Fokusstatus einfach versteckt.
Ein legitimer CSS-Trick.
Ich bin es gewohnt, Fokus und Hover mit einem Komma zu stylen
.el:hover, .el:focus {}.Passen Sie nur auf. Das Umschalten auf
.el:hover, .el:focus-visible {}kann in Browsern ohne Fokus-visible-Unterstützung nach hinten losgehen, da sie den gesamten Selektor verwerfen.Dieser ":focus-visible" Pseudoselektor ist großartig... Das Fehlen der Safari-Unterstützung ist ein Dämpfer... Oder hat sich das geändert?
Was ich für diese Situation mache, in der man den Fokusring für Tastaturnutzer und nicht für Maus- und Touch-Nutzer möchte, ist einfach ein bisschen JS...
“`
yourButtonElement.addEventListener(‘mousedown’, function(e){
e.preventDefault();
});
Dies verhindert, dass der Fokusring bei mousedown auf Desktops oder Touch auf Mobilgeräten erscheint...
Wenn Sie einen benutzerdefinierten Stil wünschen, wenn der Benutzer Ihren Button "klickt" oder "berührt", können Sie Klassen einfach mit JavaScript hinzufügen und entfernen... über Event-Handler.
Zugegebenermaßen wäre eine reine CSS-Lösung einfacher... Also wünschte ich mir nur, dass Safari ":focus-visible" unterstützen würde.
Ich denke, das Ausblenden des Fokusrings beim Klicken ist als progressive Verbesserung ziemlich angemessen, und als solche wäre dieser CSS-Code auch mit minimaler Unterstützung eine gute Lösung. Wenn
:focus-visibleunterstützt wird, dann großartig, aber wenn nicht, ist das Vorhandensein des Fokusrings bei einem Button nicht das Ende der Welt.Meine frühere JS-Lösung bestand darin, ein festes Div zu platzieren, das den Bildschirm abdeckte, und wenn es ein mousemove-Ereignis empfing, verschwand das Div und eine Klasse für
no-focusringwurde zur body-Klasse hinzugefügt.Dann wurde bei jeder Tastatureingabe das Div wieder angezeigt und die no-focusring-Klasse wurde vom Body entfernt.
Im Wesentlichen wurde der Fokusring nur dann deaktiviert, wenn die Maus bewegt wurde und der Benutzer JS aktiviert hatte.
Dies ist ein nützliches Feature, das einen verwirrenden Namen hat. Indem es focus-visible genannt wird, wird impliziert, dass der normale Fokusstil unsichtbar ist, was tatsächlich der Fall sein kann oder auch nicht.
Bitte beachten Sie, dass dies bei Textfeldern ein völlig kontraintuitives Verhalten aufweist. Wenn Sie auf einen Button klicken, werden keine :focus-visible-Stile angezeigt. Wenn Sie jedoch auf ein Textfeld klicken, werden :focus-visible-Stile angezeigt, und gemäß der Spezifikation ist das leider zu erwarten.