Heim >Web-Frontend >CSS-Tutorial >Wie die Pseudoklasse :has() JavaScript-Hacks in CSS überflüssig macht

Wie die Pseudoklasse :has() JavaScript-Hacks in CSS überflüssig macht

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-30 03:50:09951Durchsuche

How :has() Pseudo-Class Eliminates the Need for JavaScript Hacks in CSS

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.

Was soll die ganze Aufregung um :has()?

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!

Die alten Wege vs. die neue Schärfe

Lassen Sie uns über einige häufige Szenarien sprechen, die uns früher in den Wahnsinn getrieben haben. Erinnern Sie sich daran?

Der Formularfeldvalidierungstanz

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?

Die Überarbeitung des Dropdown-Menüs

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);
}

Zaubertricks aus der realen Welt mit :has()

Sehen wir uns einige praktische Beispiele an, bei denen :has() wirklich glänzt:

1. Intelligente Bildergalerien

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.

2. Formularfeldabhängigkeiten

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;
}

3. Handhabung leerer Zustände

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;
}

Der Leistungsgewinn

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:

  1. Die Style-Engine des Browsers erledigt die gesamte Arbeit nativ
  2. Kein JavaScript-Ausführungsaufwand
  3. Keine Beeinträchtigung des Layouts durch ständige Hinzufügungen/Entfernungen von Klassen
  4. Weniger Ereignis-Listener verstopfen Ihre Seite

Best Practices und Fallstricke

Während :has() großartig ist, gibt es ein paar Dinge zu beachten:

  1. 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!

  2. 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');
});
  1. Leistungsaspekte Während :has() im Allgemeinen performant ist, können sehr komplexe Selektoren dennoch Auswirkungen auf das Rendering haben. Behalten Sie Ihr DevTools-Leistungsfenster im Auge, wenn Sie es häufig nutzen.

Zusammenfassung

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn