Das :has()
Pseudoklasse ist zweifellos meine neue Lieblings-CSS-Funktion. Ich weiß, dass es zumindest für viele von Ihnen genauso ist diejenigen von Ihnen, die an der State of CSS-Umfrage teilgenommen haben. Die Fähigkeit, Selektoren verkehrt herum zu schreiben, gibt uns mehr Superkräfte, die ich nie für möglich gehalten hätte.
Ich sage „mehr Superkräfte“, weil es bereits eine Menge wirklich erstaunlicher, cleverer Ideen gibt, die von einem Haufen superkluger Leute veröffentlicht wurden, wie zum Beispiel:
Dieser Artikel ist keine endgültige Anleitung :has()
. Es ist auch nicht hier, um das wiederzugeben, was bereits gesagt wurde. Nur ich (hi 👋) springe für einen Moment auf den fahrenden Zug auf, um einige der Möglichkeiten zu teilen, die ich am wahrscheinlichsten verwenden werde :has()
in meiner täglichen Arbeit … das heißt, sobald es offiziell von Firefox unterstützt wird was unmittelbar bevorsteht.
Wenn das passiert, können Sie darauf wetten, dass ich anfangen werde zu verwenden :has()
überall. Hier sind einige reale Beispiele für Dinge, die ich kürzlich gebaut habe und bei denen ich mir dachte: „Mensch, das wird einmal so viel schöner :has()
wird voll unterstützt.“
Vermeiden Sie es, außerhalb Ihrer JavaScript-Komponente zu greifen
Haben Sie jemals eine interaktive Komponente erstellt, die manchmal Stile an anderer Stelle auf der Seite beeinflussen muss? Nehmen Sie das folgende Beispiel, wo <nav>
ist eine Mega-Menü, und das Öffnen ändert die Farben der <header>
Inhalt darüber.
Ich habe das Gefühl, dass ich so etwas tun muss bei jeder Einstellung.
Dieses spezielle Beispiel ist eine React-Komponente, die ich für eine Site erstellt habe. Ich musste den React-Teil der Seite mit „nach außen greifen“. document.querySelector(...)
und schalten Sie eine Klasse auf dem um <body>
, <header>
, oder eine andere Komponente. Das ist nicht das Ende der Welt, aber es fühlt sich sicher ein bisschen eklig an. Sogar in einer vollständigen React-Site (z. B. einer Next.js-Site) müsste ich mich zwischen der Verwaltung einer menuIsOpen
Zustand weit oben im Komponentenbaum, oder die gleiche DOM-Elementauswahl vornehmen – was nicht sehr React-y ist.
Mit der :has()
, das Problem ist weg:
header:has(.megamenu--open) { /* style the header differently if it contains an element with the class ".megamenu--open" */
}
Kein Hantieren mehr mit anderen Teilen des DOM in meinen JavaScript-Komponenten!
Besseres Table Striping UX
Das Hinzufügen alternativer Zeilen „Streifen“ zu Ihren Tabellen kann eine nette UX-Verbesserung sein. Sie helfen Ihren Augen, zu verfolgen, in welcher Reihe Sie sich befinden, während Sie den Tisch scannen.
Aber meiner Erfahrung nach funktioniert das nicht gut bei Tabellen mit nur zwei oder drei Zeilen. Wenn Sie beispielsweise eine Tabelle mit drei Zeilen in der <tbody>
und Sie „streifen“ jede „gerade“ Reihe, könnten Sie am Ende nur einen Streifen haben. Das ist nicht wirklich ein Muster wert und könnte dazu führen, dass sich Benutzer fragen, was an dieser einen hervorgehobenen Zeile so besonders ist.
Mit dieser Technik wo Bramus verwendet :has()
um Stile basierend auf der Anzahl der untergeordneten Elemente anzuwenden, können wir Tabellenstreifen anwenden, wenn es mehr als beispielsweise drei Zeilen gibt:
Was soll schicker werden? Sie können sich auch dafür entscheiden, dies nur zu tun, wenn die Tabelle auch mindestens eine bestimmte Anzahl von Spalten hat:
table:has(:is(td, th):nth-child(3)) { /* only do stuff if there are three or more columns */
}
Entfernen Sie die bedingte Klassenlogik aus Vorlagen
Ich muss oft ein Seitenlayout ändern, je nachdem, was auf der Seite steht. Nehmen Sie das folgende Rasterlayout, bei dem die Platzierung des Hauptinhalts die Rasterbereiche ändert, je nachdem, ob eine Seitenleiste vorhanden ist.
Das hängt möglicherweise davon ab, ob im CMS gleichgeordnete Seiten festgelegt sind. Normalerweise würde ich dies mit Vorlagenlogik tun, um sie bedingt hinzuzufügen BEM-Modifikatorklassen an den Layout-Wrapper, um beide Layouts zu berücksichtigen. Dieses CSS könnte etwa so aussehen (reaktionsfähige Regeln und andere Dinge wurden der Kürze halber weggelassen):
/* m = main content */
/* s = sidebar */
.standard-page--with-sidebar { grid-template-areas: 's s s m m m m m m m m m';
}
.standard-page--without-sidebar { grid-template-areas: '. m m m m m m m m m . .';
}
CSS-technisch ist das natürlich völlig in Ordnung. Aber es macht den Vorlagencode ein wenig chaotisch. Abhängig von Ihrer Vorlagensprache kann es ziemlich hässlich werden, eine Reihe von Klassen bedingt hinzuzufügen, insbesondere wenn Sie dies auch mit vielen untergeordneten Elementen tun müssen.
Vergleichen Sie das mit a :has()
-basierter Ansatz:
/* m = main content */
/* s = sidebar */
.standard-page:has(.sidebar) { grid-template-areas: 's s s m m m m m m m m m';
}
.standard-page:not(:has(.sidebar)) { grid-template-areas: '. m m m m m m m m m . .';
}
Ehrlich gesagt ist das CSS-technisch nicht viel besser. Aber das Entfernen der bedingten Modifikatorklassen aus der HTML-Vorlage ist ein schöner Gewinn, wenn Sie mich fragen.
Es ist einfach, sich Mikrodesign-Entscheidungen zu überlegen :has()
- wie eine Karte, wenn sie ein Bild enthält – aber ich denke, es wird auch für diese Makro-Layout-Änderungen sehr nützlich sein.
Besseres Spezifitätsmanagement
Wenn Sie lesen, mein letzter Artikel, Sie werden wissen, dass ich ein Verfechter der Spezifität bin. Wenn Sie, wie ich, nicht möchten, dass Ihre Spezifitätswerte beim Hinzufügen in die Luft gehen :has()
und :not()
Achten Sie darauf, in Ihren Stilen zu verwenden :where()
.
Das liegt an der Besonderheit von :has()
basiert auf das spezifischste Element in seiner Argumentliste. Wenn Sie also so etwas wie eine ID darin haben, wird es schwierig sein, Ihren Selektor in der Kaskade zu überschreiben.
Auf der anderen Seite, die Besonderheit von :where()
ist immer null, die niemals zum Spezifitätswert beitragen.
/* specificity score: 0,1,0. Same as a .standard-page--with-sidebar modifier class
*/
.standard-page:where(:has(.sidebar)) { /* etc */
}
Die Zukunft ist hell
Dies sind nur einige Dinge, auf die ich es kaum erwarten kann, sie in der Produktion einzusetzen. Der CSS-Tricks Almanac hat auch eine Reihe von Beispielen. Worauf freust du dich? :has()
? Auf welche Beispiele aus der Praxis sind Sie wo gestoßen? :has()
wäre die perfekte Lösung gewesen?
- SEO-gestützte Content- und PR-Distribution. Holen Sie sich noch heute Verstärkung.
- Platoblockkette. Web3-Metaverse-Intelligenz. Wissen verstärkt. Hier zugreifen.
- Quelle: https://css-tricks.com/more-real-world-uses-for-has/
- 1
- 11
- 7
- 9
- 98
- a
- Fähigkeit
- Fähig
- Über Uns
- oben
- Konto
- beeinflussen
- Alle
- bereits
- immer
- erstaunlich
- und
- Ein anderer
- Bewerben
- Ansatz
- Bereiche
- Argument
- Artikel
- basierend
- weil
- Wette
- Besser
- zwischen
- Bit
- Weht
- erbaut
- Haufen
- Kann bekommen
- Karte
- Kaskade
- sicher
- Übernehmen
- Änderungen
- der
- Auswählen
- Klasse
- Unterricht
- cms
- Code
- Spalten
- Komponente
- enthält
- Inhalt
- könnte
- Kurs
- CSS
- Entscheidungen
- definitiv
- Abhängig
- Design
- Tut nicht
- Dabei
- DOM
- Nicht
- nach unten
- Elemente
- insbesondere
- etc
- Sogar
- ÜBERHAUPT
- Jedes
- Beispiel
- Beispiele
- ERFAHRUNGEN
- Augenfarbe
- Favorit
- Merkmal
- wenige
- Ende
- Firefox
- Folgende
- vorwärts
- für
- voll
- bekommen
- gibt
- Goes
- gehen
- groß
- Gitter
- Grid-Template-Bereiche
- Guide
- passieren
- mit
- Hilfe
- hier
- hi
- höher
- Besondere
- HTML
- HTTPS
- KRANK
- Ideen
- Image
- Verbesserung
- in
- interaktive
- IT
- JavaScript
- nur einer
- Behalten
- Art
- Wissen
- Sprache
- Nachname
- Layout
- wahrscheinlich
- wenig
- aussehen
- suchen
- Los
- Makro
- gemacht
- Main
- um
- flächendeckende Gesundheitsprogramme
- viele
- könnte
- Moment
- mehr
- vor allem warme
- Mozilla
- Need
- Bedürfnisse
- Neu
- weiter
- Next.js
- Normalerweise
- Anzahl
- Offiziell
- EINEM
- Eröffnung
- Andere
- aussen
- Teil
- besondere
- Teile
- Schnittmuster
- Personen
- perfekt
- Ort
- Plato
- Datenintelligenz von Plato
- PlatoData
- möglich
- Gegenwart
- ziemlich
- Aufgabenstellung:
- Produktion
- veröffentlicht
- erreichen
- Reagieren
- Lesen Sie mehr
- realen Welt
- kürzlich
- Entfernen
- ansprechbar
- REIHE
- Ohne eine erfahrene Medienplanung zur Festlegung von Regeln und Strategien beschleunigt der programmatische Medieneinkauf einfach die Rate der verschwenderischen Ausgaben.
- Führen Sie
- Said
- gleich
- Scan
- Auswahl
- kompensieren
- Teilen
- am Standort
- smart
- So
- Lösung
- einige
- etwas
- irgendwo
- besondere
- spezifisch
- Spezifität
- Anfang
- Bundesstaat
- Streifen
- Stripes
- Stil
- Super
- Unterstützte
- Tabelle
- Nehmen
- TD
- Vorlage
- Das
- Der Staat
- die Welt
- Ding
- dachte
- nach drei
- während
- zu
- Tonne
- auch
- TOTAL
- verfolgen sind
- was immer dies auch sein sollte.
- Gedreht
- us
- -
- Nutzer
- ux
- warten
- Wege
- Was
- ob
- welche
- WHO
- gewinnen
- fragen
- Arbeiten
- weltweit wie ausgehandelt und gekauft ausgeführt wird.
- wert
- würde
- schreiben
- Du
- Ihr
- Zephyrnet