Es gibt ein HTML-Attribut, das genau das tut, was Sie denken.
<div>I'm visible</div>
<div hidden>I'm hidden</div>
Es hat sogar großartige Browserunterstützung. Ist es nützlich? Ähm. Vielleicht. Nicht wirklich.
Adam Laki mag die Semantik davon
Wenn wir das hidden-Attribut verwenden, verbessern wir unsere Semantik ein wenig. Jeder wird verstehen, was ein "hidden"-Attribut bei einem Element bedeutet.
Monica Dinculescu nennt es eine Lüge
Die `hidden`-Regel ist ein User-Agent-Stil, was bedeutet, dass sie weniger spezifisch ist als ein moderater Schnupfen. Das bedeutet, dass Ihr bevorzugter `display`-Stil sie überschreiben wird.
<style>
div { display: block; }
</style>
<div hidden>
lol guess who's not hidden anymore
hint: it's this thing
</div>
Also zwei verwandte Probleme…
- Es ist extrem schwach. Buchstäblich jede Änderung an der `display`-Eigenschaft außer dem Wert `none` bei dem Element mit einer beliebigen Selektorenstärke wird es überschreiben. Ähnlich wie jede andere `display`-Eigenschaft, wie `width` oder was auch immer, aber es fühlt sich irgendwie schlimmer an, ein `hidden`-Attribut aktiv auf einem Element zu haben und es dann nicht wirklich verborgen zu haben.
- Die `display`-Eigenschaft ist leider mit Verantwortlichkeiten überladen. Es wäre wirklich cool, wenn `hidden` eine CSS-Eigenschaft wäre, die für die Sichtbarkeit/Zugänglichkeit von Elementen zuständig wäre, anstatt dieselbe Eigenschaft, die den Blocktyp steuert. Aber leider stoppt die Abwärtskompatibilität für das Leben des Webs das (was gut für die allgemeine Gesundheit des Webs ist).
Wenn Sie die Semantik des Attributs wirklich lieben, schlägt Monica vor
[hidden] { display: none !important; }
Scheint eine schöne Ergänzung zu jedem "Reset" oder jeder Basis-Stylesheet zu sein.
Ansonsten ist die klassische Technik, Dinge mit einer Klasse zu verstecken, absolut in Ordnung. Normalerweise habe ich eine Utility-Klasse
.hide, .hidden {
display: none;
}
Aber denken Sie daran, dass es immer tausend Wege gibt, Dinge zu tun. Ich erwische mich regelmäßig dabei, One-Off-Hide/Show-Mechanismen zu implementieren. Zum Beispiel ein Menü, dessen Sichtbarkeit mit Flair umgeschaltet werden muss, aber jederzeit zugänglich bleibt…
.menu {
opacity: 0;
visibility: hidden;
transition: 0.2s;
transform: translateX(20px);
&[data-open] {
opacity: 1;
visibility: visible;
transform: translateX(0);
}
}
Einer meiner Lieblings-CSS-Schnipsel überhaupt ist dieser aus CSS Remedy
Wenn Sie das mit Ihrem `[hidden] { display: none !important; }` kombinieren, wird der versteckte/visuell versteckte Zustand Ihres DOM perfekt offensichtlich. (Sie müssten die erste Zeile ebenfalls zu `!important` ändern).
Leider verhält sich `aria-hidden=false` inkonsistent über Browser hinweg und wird vom W3C nicht empfohlen: https://www.w3.org/TR/wai-aria-1.1/#aria-hidden Ich bin mir nicht sicher, wie zutreffend das immer noch ist, aber verwenden Sie es mit Vorsicht.
@Jace Cotton
Ich glaube, das bezieht sich auf die Verwendung zur *Aufdeckung* von Dingen, nicht darauf, sie als nicht versteckt zu kennzeichnen.
Ein anderer Teil der W3-Website besagt, dass Browser `aria-hidden="false"` so behandeln, als wäre das Attribut überhaupt nicht vorhanden: https://www.w3.org/WAI/PF/aria-implementation/#mapping_state-property_table
Dieser Blog behauptet, "JAWS, Window Eyes und NVDA (Windows), ChromeVox (Chrome OS), VoiceOver (iOS und Mac OSX) und Orca (Linux) mit unterstützenden Browsern für jedes Betriebssystem" getestet zu haben und festgestellt zu haben, dass `aria-hidden="false"` keine Wirkung hat: https://developer.paciellogroup.com/blog/2012/05/html5-accessibility-chops-hidden-and-aria-hidden/
Sie haben die Nebenwirkungen dieses Attributs vergessen: Es betrachtet das Element als vollständig abwesend aus dem DOM-Baum und versteckt es folglich auch automatisch für Benutzer von Hilfsmitteln. Screenreader springen automatisch zum nächsten sichtbaren Element.
Die Verwendung dieses Attributs ist sinnvoll, die Tatsache, dass man es mit einfachem CSS überschreiben kann (und diese Überschreibbarkeit - sorry - einfach beheben kann), scheint mir nicht relevant zu sein. Warum sollte man einen Kampf zwischen Ihrem HTML und CSS organisieren?
&[data-open] bedeutet was?
Ich würde vorschlagen: `&[aria-expanded=true]`
Das, was ich am `hidden`-Attribut mag, ist, wie man es über JavaScript aufrufen kann.
element.hidden = true;Fühlt sich viel natürlicher an als `element.classList[state ? 'add' : 'remove']('is-open');`
Aber ja, ich benutze es in Kombination mit `[hidden] { display: none !important; }` Und man kann nicht zwischen den Zuständen überblenden oder animieren, das gibt es.
Es ist ein verschachtelter Sass-Selektor für erhöhte Spezifität – Elemente mit der Klasse "menu" und dem Datenattribut "open". Der kompilierte CSS-Code dafür wäre .menu[data-open]
Wenn Sie mehr erfahren möchten: https://css-tricks.de/the-sass-ampersand/
Sie haben doch nicht wirklich geglaubt, "hidden" sei eine Sicherheitsmaßnahme, oder? Es ist für die Navigation (Single-Page-Anwendungen und ähnliche Funktionalitäten) und für visuelle Zwecke, wie das Verbergen von vorab ausgefüllten Formulardaten, die nicht menschenlesbar sind. Sensible Daten irgendwo in Ihrem HTML zu platzieren, bedeutet, dass Ihre Website-Sicherheit fehlerhaft ist.
Ach was. Ich habe das falsch gelesen. Meine Bemerkung kann aber jemandem helfen, der wirklich auf dem falschen Weg ist.
Schöner Artikel. Habe ihn geliebt.