Jeder Frontend-Entwickler hat dieses Szenario schon erlebt oder wird es erleben: Ihr Chef, Kunde oder Designer findet, dass der von Browsern auf fokussierten Elementen angewendete Umriss nicht zur Benutzeroberfläche passt, und bittet Sie, ihn zu entfernen. Oder Sie möchten ihn vielleicht selbst entfernen.
Sie recherchieren ein wenig und stellen fest, dass dies dringend abgeraten wird, da der Fokus-Umriss einen Grund hat: Er bietet visuelles Feedback für die Tastaturnavigation (mit der Tabulatortaste) und lässt Benutzer, die keine Maus bedienen können oder eine Sehstörung haben, wissen, wo sie sich auf dem Bildschirm befinden.

Das bedeutet jedoch nicht, dass Sie an diesen Umriss gebunden sind. Anstatt ihn zu entfernen, können Sie ihn einfach durch etwas anderes ersetzen. So behalten Sie die Barrierefreiheit Ihrer Benutzeroberfläche bei und erhalten mehr Flexibilität bei der Gestaltung, damit sie besser zu Ihrer Benutzeroberfläche passt.
Sie können damit beginnen, den Standard-Browserumriss zu entfernen, indem Sie den fokussierten Zustand des Elements auswählen und outline: none anwenden. Anschließend können Sie aus den folgenden Optionen wählen, um ihn zu ersetzen
Hintergrundfarbe ändern
Dies funktioniert am besten für Elemente, die gefüllt werden können, wie z. B. Schaltflächen. Wählen Sie den fokussierten Zustand des Elements aus und wenden Sie eine kontrastierende Hintergrundfarbe darauf an. Je höher der Kontrast, desto besser, da subtile Änderungen möglicherweise keine ausreichenden visuellen Hinweise liefern, insbesondere bei Farbenblindheit und Sehschwäche.
Im folgenden Beispiel ändern sich sowohl die Hintergrund- als auch die Randfarbe; Sie können entweder eine oder beide auswählen.
Klicken oder fokussieren Sie mit der Tabulatortaste, um zu sehen, wie dieser Zustand aussieht.
Siehe den Pen
Elemente, die den nativen Umrissfokus durch Hintergrundfarbe ersetzen von Lari (@larimaza)
auf CodePen.
Textfarbe ändern
Wenn das Element Text enthält, können Sie den fokussierten Zustand auswählen und seine Farbe ändern. Dies funktioniert auch für mit mask-image angewendete Icons. Sie können das Icon als Nachfahre des fokussierten Elements auswählen und seine Hintergrundfarbe ändern, wie im folgenden Beispiel mit einer Schaltfläche.
Siehe den Pen
Elemente, die den nativen Umrissfokus durch Text- und Iconfarbe ersetzen von Lari (@larimaza)
auf CodePen.
Auch hier ist Kontrast entscheidend. Sie können auch erwägen, Textlinks eine Unterstreichung hinzuzufügen und diese als Teil des geänderten Zustands zu gestalten, denn wie die Web Content Accessibility Guidelines besagen
Farbe wird nicht als einziges visuelles Mittel verwendet, um Informationen zu vermitteln, eine Aktion anzuzeigen, eine Reaktion auszulösen oder ein visuelles Element zu unterscheiden. (Level A)
Verständnis von Erfolgskriterium 1.4.1
Schatten anwenden
Die Eigenschaft box-shadow kann genau denselben Zweck wie der Umriss erfüllen, nur dass sie viel leistungsfähiger ist – Sie können jetzt Farbe, Deckkraft, Versatz, Weichzeichnungsradius und Streuradius steuern. Und wenn ein border-radius angegeben ist, folgt der Box-Schatten denselben abgerundeten Ecken.
Siehe den Pen
Elemente, die den nativen Umrissfokus durch Box-Schatten ersetzen von Lari (@larimaza)
auf CodePen.
Sie können mit dieser Technik wirklich kreativ werden (im Ernst, tun Sie das nicht)
Siehe den Pen
Elemente, die den nativen Umrissfokus durch einen verrückten Box-Schatten ersetzen von Lari (@larimaza)
auf CodePen.
Dies funktioniert für praktisch jeden Art von fokussierbarem Element, wie z. B. Toggles, Kontrollkästchen, Optionsfelder und Schieberegler.
Siehe den Pen
Toggle und Radiobutton, die den nativen Umrissfokus durch Box-Schatten ersetzen von Lari (@larimaza)
auf CodePen.
Elementgröße erhöhen
Als Alternative zur Farbänderung können Sie auch eine subtile Größenänderung als Fokus-Feedback verwenden. In diesem Beispiel verwenden wir transform: scale.
Siehe den Pen
Elemente, die den nativen Umrissfokus durch transform scale ersetzen von Lari (@larimaza)
auf CodePen.
Der Schlüssel hier ist Subtilität. Extreme Größenänderungen können zu Inhaltsverschiebungen führen, ganz zu schweigen von einer schlechten Erfahrung für Menschen, die reduzierte Bewegungen bevorzugen.
Vorhandene Hover-Stile replizieren
Wenn das Element bereits einen kontrastierenden Hover-Stil hat, können Sie diesen Stil einfach übernehmen und auch für den Fokus-Zustand verwenden. Das ist eine ziemlich elegante Lösung, da Sie keine neuen Farben oder Umrisse zur Benutzeroberfläche hinzufügen müssen.
Hier ist ein Beispiel, bei dem sowohl der Fokus- als auch der Hover-Zustand einen hohen Kontrast zum Hintergrund des Standardstils eines Elements aufweisen
Siehe den Pen
Elemente, die den nativen Umrissfokus durch Hover-Stile ersetzen von Lari (@larimaza)
auf CodePen.
Bonus: Den Standardumriss anpassen
Alles, was wir bisher betrachtet haben, geht davon aus, dass wir den Fokus-Umriss komplett entfernen wollen. Das müssen wir nicht! Tatsächlich ist es ein Rand, den wir anpassen können.
button:focus {
outline: 3px dashed orange;
}
Das ist Kurzschreibweise und hätte so geschrieben werden können, wenn wir die Stile verfeinern wollen
button:focus {
outline-width: 3px;
outline-style: dashed;
outline-color: orange;
}
Eine zusätzliche Superkraft, die wir haben, ist die Eigenschaft outline-offset, die von der outline Kurzschreibweise getrennt ist, aber mit ihr zusammen verwendet werden kann, um die Position des Fokus-Rings zu ändern
button:focus {
outline: 3px dashed orange;
outline-offset: 10px;
}
Fazit
Sie können all diese Optionen mischen und kombinieren, um benutzerdefinierte Stile zu erhalten, die für jeden Komponententyp innerhalb Ihrer Benutzeroberfläche geeignet aussehen.
Und es ist erwähnenswert: Vergessen Sie nicht, strenge Farbkontraste und andere visuelle Hinweise zusätzlich zur Farbe zu verwenden, wenn Sie benutzerdefinierte Fokus-Zustände anwenden. Sicher, wir alle wünschen uns eine Erfahrung, die mit unseren Designs übereinstimmt, aber wir können dabei gute Barrierefreiheitsstandards einhalten. Das W3C empfiehlt dieses Tool, um den Kontrast von Farbwerten gegen die WCAG-Richtlinien zu testen.
Der Hauptgrund, warum Menschen dazu neigen, Fokus-Stile zu entfernen, ist nicht der Tastaturfokus, sondern der Mausfokus – das heißt, die Art und Weise, wie ein angeklicktes Element seinen Fokus-Zustand beibehält und Schaltflächen nach dem Benutzen einen Umriss oder einen anderen Effekt erhalten. Für diese Fälle empfehle ich, einfach
e.target.blur()zur Ereignishandlerfunktion hinzuzufügen, wodurch die Schaltfläche nach dem Klicken den Fokus verliert.Oder, für eine noch bessere Lösung, mache ich gerne
Das prüft, ob die X-Koordinate des Ereignisses 0 ist, bevor der Fokus entfernt wird. Solange die Maus nicht ganz links auf dem Bildschirm war, als der Benutzer geklickt hat (was sie eigentlich nie sein sollte, wegen des Abstands und anderer Dinge), ist die Koordinate größer als 0. Tastaturereignisse hingegen geben immer 0 zurück. Dies entfernt also den Fokus für Mausereignisse, aber nicht für Tastaturereignisse, sodass Benutzer, die mit einer Tastatur oder einem anderen Gerät navigieren, ihre Positionierung beibehalten können.
Was passiert, wenn Sie auf ein Eingabefeld klicken, wenn Sie den obigen Code verwenden?
In einigen Chrome-Versionen werden wir das hoffentlich in reinem CSS tun können
:focus:not(:focus-visible){ outline: none;}(Firefox-Fallback, der jetzt funktioniert)
:focus:not(:-moz-focusring){ outline: none;}Seien Sie sehr vorsichtig, wie Sie
e.target.blur()verwenden. Wie Sie anerkennen, muss ein Tastatur-only-Benutzer möglicherweise von vorne anfangen (die meisten Browser greifen dort wieder auf, wo sie aufgehört haben). Bei Steuerelementen, deren Zustandsänderung wichtig ist (wie z. B. ein Toggle), wird die Zustandsänderung möglicherweise auch für Screenreader-Benutzer nicht angekündigt.Die zweite Lösung ist besser, aber stellen Sie sicher, dass Sie mit Screenreadern sowie mit der Tastatur (sowohl mobil als auch Desktop) testen.
Die Verwendung von
e.target.blurauf diese Weise hat schwerwiegende Folgen für die GEMISCHTE Nutzung von Tastatur und Zeiger. Soweit, dass ich sagen würde, das ist eher feindselig gegenüber Benutzern.Normalerweise können Sie irgendwo mit der Maus klicken, und das Tabulator-Tabbing folgt von diesem Punkt an. Sie können also Dinge tun wie
Klicken Sie, um eine Aufklappgruppe (z. B.
details/summary) zu öffnen, und drücken Sie dann die Tabulatortaste, um zum ersten darin enthaltenen Steuerelement zu gelangen.Klicken Sie auf das erste Steuerelement in einem Formular und verwenden Sie dann die Tabulatortaste, um durch die restlichen Eingaben zu gelangen.
Klicken Sie auf ein beliebiges Optionsfeld in einer Optionsfeldgruppe und verwenden Sie dann die Pfeiltasten, um das richtige auszuwählen.
Das Aufrufen von
blur()setzt normalerweise die Position des Tastatur-Tabbings zurück zum Anfang der Seite. Das verwirrt Leute, die Tastatur und Maus gemischt verwenden.Tastaturnutzer, die eine Maus als schwierig oder unangenehm empfinden, greifen möglicherweise gelegentlich trotzdem zu, obwohl dies nicht ihre bevorzugte Interaktionsweise ist. Vielleicht ist der Fokus-Indikator schwer zu erkennen oder die Tabbing-Reihenfolge ist verwirrend. Manchmal ist es nur, um eine große Anzahl von TAB-Tasten-Drücken zu vermeiden. Insbesondere Tastatur-only-Benutzer könnten die "Maus-Tasten"-Betriebssystemfunktion verwenden, um einen Klick auszulösen und dann mit der Tabulatortaste fortzufahren.
Einige Leute, die hauptsächlich die Maus verwenden, aber zur Tastatur-Tabbing wechseln, wenn sie mit Formularsteuerelementen arbeiten. Jeder, der jemals als Datenerfasser gearbeitet hat, hat diese Angewohnheit wahrscheinlich übernommen.
Die Verwendung von
e.target.blur()auf diese Weise ist meiner Meinung nach schlimmer als die Verwendung vonoutline: none. Die CSS-Regel unterdrückt nur den sichtbaren Fokus-Indikator, beeinträchtigt aber nicht den tatsächlichen Fokus-Zustand, sodass die Position des Tastatur-Tabbings nicht gestört wird.In Understanding WCAG Success Criterion 2.5.6: Concurrent Input Mechanisms heißt es: „Benutzer sollten jederzeit zwischen Eingabemechanismen wechseln können, wenn der Benutzer feststellt, dass bestimmte Aufgaben und Interaktionen durch die Verwendung eines alternativen Eingabemechanismus leichter zu bewältigen sind“ (Hervorhebung von mir). Ich denke, das Zurücksetzen der Position des Tastatur-Tabbings zum Anfang der Seite widerspricht dem Geist dieser Regel (obwohl es bei einer strengen Auslegung nicht gegen den normativen Text der Erfolgsregel verstößt).
Wie bereits erwähnt, kann die Verwendung von
blur()hier immer noch problematisch sein. Tatsächlich ist die Verwendung von:focus-visible(und derzeit mit https://github.com/WICG/focus-visible als Polyfill) der richtige Weg.Das ist ein toller Trick, danke! :)
Der Punkt von Alex oben ist richtig, aber ich bin mir nicht sicher, ob das Erzwingen von
.blur()für das Element eine gute Wahl ist. Firefox scheint zumindest inkonsistent zu sein, welches Element nach einem Klick den Fokus erhält, wenn die Methoden gemischt werden. Und es "blendet" immer noch den Fokusring beim Klicken ein. Ich wäre auch etwas besorgt, dass erzwungene Blurs dazu führen könnten, dass ein Ereignishandler öfter als erwartet ausgelöst wird, oder dass Screenreader unzufrieden sind, ohne weitere Tests – obwohl das nur Spekulation ist. Sie können mit einem Beispiel auf https://codepen.io/gillibrand/pen/povoZKE spielenWahrscheinlich können Sie dies besser mit document-level onclick/onkeydown-Handlern handhaben, die intelligent eine "show-keyboard-focus"-Klasse zum Body hinzufügen und entfernen, sodass die :focus-Selektoren nur übereinstimmen, wenn diese Klasse aktiv ist.
Hey, ich bin nur hierher gekommen, um :focus{outline: none} zu finden, weil ich nicht wusste, wie Sie es gemacht haben. Es hat geholfen, danke