Heim >Web-Frontend >CSS-Tutorial >Wie die Pseudoklasse :has() JavaScript-Hacks in CSS überflüssig macht
Erinnern Sie sich an die Zeiten, als Sie ein übergeordnetes Element basierend auf seinen untergeordneten Elementen formatieren mussten und am Ende eine Menge JavaScript geschrieben haben, nur um eine einfache Klasse hinzuzufügen? Nun, diese Tage liegen endlich hinter uns! Die CSS-Pseudoklasse :has() ist hier, um den Tag zu retten und das Spiel für Front-End-Entwickler überall zu verändern.
Stellen Sie sich :has() als Ihre CSS-Kristallkugel vor – damit können Sie in Elemente hineinschauen, um zu überprüfen, was sie enthalten. Möchten Sie ein Div anders gestalten, wenn es ein Bild enthält? Es ist so einfach wie das Schreiben von div:has(> img). Es ist kein JavaScript erforderlich!
/* This targets any div that contains an image */ div:has(img) { padding: 1rem; background: #f5f5f5; } /* This one's more specific - only direct children */ div:has(> img) { border: 2px solid #ddd; }
Die meisten modernen Browser unterstützen jetzt :has(), obwohl Internet Explorer-Benutzer (falls Sie sie noch unterstützen müssen) einen Ersatz benötigen. Aber lassen Sie sich davon nicht aufhalten – progressive Verbesserung ist hier Ihr Freund!
Lassen Sie uns über einige häufige Szenarien sprechen, die uns früher in den Wahnsinn getrieben haben. Erinnern Sie sich daran?
Der alte Weg:
const formGroup = document.querySelector('.form-group'); const input = formGroup.querySelector('input'); input.addEventListener('invalid', () => { formGroup.classList.add('has-error'); });
Der neue Weg:
.form-group:has(input:invalid) { border-color: red; background: #fff8f8; }
Keine Ereignis-Listener oder Klassenumschaltungen mehr – nur reines, deklaratives CSS. Ist das nicht schön?
Das kennen wir alle schon: Wir haben versucht, einen Dropdown-Container zu formatieren, wenn das Menü geöffnet ist. Bisher benötigten Sie JavaScript, um Klassen im DOM-Baum nach oben und unten zu verschieben.
Alter JavaScript-Ansatz:
const dropdown = document.querySelector('.dropdown'); const menu = dropdown.querySelector('.menu'); menu.addEventListener('click', () => { dropdown.classList.toggle('is-open'); });
Neuer CSS-Ansatz:
.dropdown:has(.menu:focus-within) { background: #f0f0f0; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
Sehen wir uns einige praktische Beispiele an, bei denen :has() wirklich glänzt:
Möchten Sie, dass das Layout Ihrer Galerie an die Art der darin enthaltenen Inhalte angepasst wird? Kinderleicht!
.gallery:has(img) { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); } .gallery:has(video) { display: flex; flex-direction: column; }
Sie können den Link zum Medium-Artikel in Ihren neuen Artikel integrieren, indem Sie ihn als Referenz, Zitat oder Inspirationsquelle verwenden. So können Sie es effektiv einbinden:
Interaktive Formulare, Dropdown-Menüs und Geschwisterstatusverwaltung sind nur einige Beispiele dafür, wo CSS jetzt die Führung übernimmt. Wie in diesem aufschlussreichen Medium-Artikel erwähnt, ermöglichen moderne Techniken wie :has() CSS, diese Aufgaben direkt zu verwalten, ohne auf JavaScript angewiesen zu sein.
Müssen Sie einen ganzen Abschnitt hervorheben, wenn ein Kontrollkästchen aktiviert ist? Kein Problem!
.section:has(input[type="checkbox"]:checked) { background: #e8f4ff; padding: 1rem; border-radius: 4px; }
Möchten Sie eine Nachricht anzeigen, wenn ein Behälter leer ist? :has() steht hinter dir:
/* This targets any div that contains an image */ div:has(img) { padding: 1rem; background: #f5f5f5; } /* This one's more specific - only direct children */ div:has(> img) { border: 2px solid #ddd; }
Das Besondere an der Verwendung von :has() anstelle von JavaScript ist, dass es nicht nur darum geht, weniger Code zu schreiben. Ihre Seiten werden tatsächlich eine bessere Leistung erbringen, weil:
Während :has() großartig ist, gibt es ein paar Dinge zu beachten:
Keep it Simple
Übertreiben Sie es nicht mit komplexen Selektoren. Nur weil Sie div:has(> span:has(> img)):has( p) schreiben können, heißt das nicht, dass Sie es tun sollten!
Progressive Verbesserung
Halten Sie immer einen sinnvollen Fallback für Browser bereit, die :has():
nicht unterstützen
const formGroup = document.querySelector('.form-group'); const input = formGroup.querySelector('input'); input.addEventListener('invalid', () => { formGroup.classList.add('has-error'); });
Die Pseudoklasse :has() ist mehr als nur eine neue CSS-Funktion – sie ist ein Paradigmenwechsel in der Art und Weise, wie wir Eltern-Kind-Beziehungen in unseren Stylesheets handhaben. Es hilft uns, besser wartbaren Code zu schreiben, die Leistung zu verbessern und, was am wichtigsten ist, es ermöglicht CSS, das zu tun, was CSS am besten kann: Stile deklarativ zu handhaben.
Wenn Sie also das nächste Mal zu JavaScript greifen, um eine Klasse für ein übergeordnetes Element umzuschalten, denken Sie daran: Möglicherweise gibt es mit :has() eine einfachere und elegantere Lösung. Probieren Sie es aus – Ihr Code (und Ihre Benutzer) werden es Ihnen danken!
Denken Sie daran, dass die Browserunterstützung zwar gut ist und immer besser wird, Sie aber immer auf caniuse.com nach den neuesten Kompatibilitätsinformationen suchen. Und haben Sie keine Angst vor Experimenten – so lernen und wachsen wir alle als Entwickler!
Das obige ist der detaillierte Inhalt vonWie die Pseudoklasse :has() JavaScript-Hacks in CSS überflüssig macht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!