Ein „übergeordneter Selektor“ in CSS wird regelmäßig als etwas erwähnt, das CSS wirklich gebrauchen könnte. Ich glaube, ich habe diesen Gedanken selbst schon oft gehabt, aber wenn ich dann mein Gehirn nach einem Anwendungsfall frage, fällt es mir schwer, einen zu finden. Nun, ich hatte gerade einen, also dachte ich, ich dokumentiere ihn hier.
Ein klassisches Eltern/Kind-Verhältnis
<div class="parent">
<div class="child"></div>
</div>
Sagen wir, es ist sehr sinnvoll, dass dieses Elternteil einen versteckten Überlauf hat und auch, dass das Kind eine absolute Positionierung verwendet.
.parent {
overflow: hidden;
position: relative;
}
.child {
position: absolute;
}
Nehmen wir nun an, es gibt einen besonderen Umstand, bei dem das Kind außerhalb des Elternteils positioniert und dennoch sichtbar sein muss. Versteckter Überlauf ist für die überwiegende Mehrheit der Situationen immer noch eine gute Standardeinstellung, daher ist es am besten, diese Regel beizubehalten, aber in dieser sehr spezifischen Situation müssen wir diesen Überlauf überschreiben.
.special-child {
position: absolute;
bottom: -20px; /* needs to be slightly outside parent */
}
/* Not real, but just to make a point */
.special-child:parent(.parent) {
overflow: visible;
}
Dieser Selektor oben ist falsch, aber er besagt: „Wähle das Elternteil von .special-child aus“, was diese nötige Überschreibung ermöglichen würde. Vielleicht ist es so
.parent < .special-child {
}
...was das Element links anstatt rechts auswählt. Wer weiß? Wahrscheinlich sind beide auf irgendeine Weise problematisch und die endgültige Syntax wäre etwas anderes. Oder vielleicht bekommen wir es nie. Ich habe keine Ahnung. Nur ein realer Anwendungsfall, den ich hatte, dokumentiert.
Sie denken vielleicht: „Warum nicht einfach eine weitere spezielle Klasse auf dem Elternteil verwenden?“ Das hätte ich getan, aber das Elternteil wurde von einer Drittanbieterbibliothek über eine API eingefügt, die keine Klasse meiner Wahl darauf anbot. Letztendlich musste ich die Klasse zum Elternteil hinzufügen, indem ich etwas benutzerdefinierten JavaScript schrieb, das das DOM abfragte, um .special-child zu finden, das Elternteil zu finden und dann die Klasse dort hinzuzufügen.
Haben Sie, Leute, andere Anwendungsfälle für einen übergeordneten Selektor?
Hier ist einer von Uzair Hayat
Mein Projekt hat ein
<input>, das in ein<div>eingeschlossen ist. Das<div>hat einige Designelemente, die sich auswirken müssen, sobald das<input>in:focusist. Ich hätte::beforeund::afterPseudoelemente verwenden können, aber Inputs unterstützen diese nicht, da sie ersetzte Elemente sind. Im Moment verwende ich JavaScript, um zu erkennen, ob der Input im Fokus ist und eine Klasse auf das übergeordnete Div anzuwenden. Ich wünschte, ich könnte...
input:focus:parent(div):after {
display: block;
/* display design changes when focused */
}
CSS sollte XPath-Unterstützung haben!
Einer, auf den ich heute gestoßen bin, eine Sammlung von Radio-Buttons, die wie folgt codiert sind
<label>Eine Wahl <input type="radio"></label>Wenn der Benutzer seine Auswahl an Radio-Buttons abschließt und seine Antwort absendet, setze ich die Eingabe auf deaktiviert
<label>Eine Wahl <input type="radio" disabled="disabled"></label>Es wäre sehr nützlich, das
<label>basierend auf dem Vorhandensein desdisabledAttributs gestalten zu können.Dies ist ein gutes Beispiel dafür, wie praktisch ein übergeordneter Selektor wäre. Sie können die Aufgabe jedoch erledigen, indem Sie die Eingabe aus dem Label herausnehmen.
Sie haben dies vielleicht schon berücksichtigt
`
input[disabled] ~ label {
color: #777;
}
Feldname
`
Es könnte möglich sein, das zu tun, was Sie wollen, hauptsächlich mit CSS, indem Sie eine versteckte Checkbox mit HTML
idundforLabel-Umleitung verwenden.HTML könnte so aussehen...
... dann so gestalten, dass der Status der Checkbox das Label über
~beeinflusst...... Zur Vollständigkeit ein wenig JavaScript, um auch den Radio-Status umzuschalten...
Meine Antwort zu CSS Parent Selectors auf StackOverflow ist es vielleicht wert, nach anderen Dingen zu suchen, zu denen Checkboxen und Labels fähig sind.
Könnten das Label und die Eingabe nicht Geschwister sein?
Was ist mit der :has() Pseudoklasse?
https://developer.mozilla.org/en-US/docs/Web/CSS/:has
.parent:has(> .special-child) {}
wählt übergeordnete Klassen mit einem direkten Kind der Klasse special-child aus.
Meine fundierte Vermutung ist, dass wir eher eine Syntax ähnlich
.parent:has-child(.special-child)sehen werden.@Joe Maffei
Sie könnten Geschwister sein, aber dann verlieren Sie die Semantik, die durch das Element hinzugefügt wird, das das Radio durch Klicken auf das Label auswählbar macht, wie es beabsichtigt ist und der Grund für die Verwendung des Label-Elements anstelle eines anderen.
Dies ist wahrscheinlich sehr ähnlich zu Ihrem Anwendungsfall, aber ein weiterer Fall für einen übergeordneten Selektor wäre der Container für eine bestimmte Komponente in einer Liste von Elementen, die selbst keine Klassen haben, vermutlich weil Sie keinen direkten Zugriff auf den zugrunde liegenden Quellcode haben. Zum Beispiel könnte der Hauptseiten-Code so aussehen
Ein übergeordneter Selektor wäre dort viel bequemer als das Hinzufügen einer Klasse über JavaScript oder die Verwendung von div:nth-of-type(3).
Und es wäre auch weniger fehleranfällig. Wenn sie später die Reihenfolge ändern, so dass der Kalender nun der zweite Block auf der Seite ist, würde Ihre ursprüngliche CSS fehlschlagen. Wenn Sie sich also für ersteres entscheiden, müssten Sie es jedes Mal aktualisieren, wenn sich die Seitenreihenfolge ändert.
Das ist also ein Anwendungsfall. Dennoch weiß ich, dass Leute ihn hinterfragen werden. Kann man nicht einfach den zugrunde liegenden Code bearbeiten, um dem Elternteil eine Klasse hinzuzufügen?
Nicht unbedingt. Das können Sie, wenn Sie die betreffende Website ausführen und über Serverzugriff verfügen, aber manchmal führen Sie A/B-Tests für Kunden-Websites mit Tools von Drittanbietern (wie z. B. VWO oder Target) durch. Diese geben Ihnen keinen Zugriff auf den Quellcode der Seite, der nicht über JavaScript oder CSS bearbeitet werden kann.
Außerdem sind sie oft auch auf einer „allgemeinen“ Basis gezielt, z. B. „führe diesen Test auf allen Seiten aus, deren URL mit blog beginnt“. Daher ist das Anzielen dieser Elemente nur mit CSS mühsam.
Ja, ich denke, A/B-Tests sind ein weiterer guter Anwendungsfall für einen übergeordneten Selektor, insbesondere wenn er auf Websites verwendet wird, die Ihnen nicht genügend Klassennamen zur Verfügung stellen, um ein bestimmtes Element über „nth-of-type/nth-child“-Spielereien hinaus zu identifizieren.
Sprechen wir über einen direkten übergeordneten Selektor oder einen vielseitigeren (aber wahrscheinlich leistungshungrigeren) Vorfahrenelektor?
Ein Anwendungsfall für letzteres könnte die Verhinderung des Body-Scrollens sein, wenn ein Modal geöffnet ist
Da
dialogElemente wahrscheinlich am besten als direkte Kinder desbodyTags platziert werden, würde das Obige wahrscheinlich auch mit „nur“ einem direkten übergeordneten Selektor funktionieren, aber das ist nebensächlich.Ich hoffe sehr, dass ein solcher Selektor bald implementiert wird. Soweit ich erfahren habe, hat er mehr Anwendungsfälle als
:is.Tatsächlich enthielt der Arbeitsentwurf bereits die relationale Pseudoklasse
:has(), die den Zweck erfüllen kann.Mit
:has()könnte der Selektor des Anwendungsfalls als.parent:has(> .special-child)geschrieben werden.Zum jetzigen Zeitpunkt besagt MDN, dass diese Pseudoklasse nicht in Stylesheets verwendet werden kann, sondern nur in JS-Funktionen wie
document.querySelector('div:has(h1)'). Ich denke, das hat etwas mit der Komplexität zu tun, die mit der Echtzeitberechnung von übergeordneten Selektoren auf der Seite verbunden ist.Meistens, wenn ich einen CSS-übergeordneten Selektor gewollt habe, war es, um HTML zu gestalten, das ich nicht direkt bearbeiten kann (wie Ausgabe von einigen WordPress-Plugins). Ich habe gelegentlich JavaScript verwendet, um mein eigenes HTML hinzuzufügen, nur um einige Ziele zum Gestalten zu haben, wo ein CSS-übergeordneter Selektor Wunder gewirkt hätte!
Es erreicht einen Punkt, an dem CSS bei zu vielen Anfragen zu versagen beginnt. Von dem, was ich vor Jahren gelesen habe, ist ein übergeordneter Selektor nachteilig für die Funktionsweise von CSS – durch Kaskadierung. Nicht nur aus der Perspektive des Stylesheets, sondern auch aus der Design- und Dokumentenfluss-Perspektive.
Ich glaube, wenn wir dafür zu sehr drängen, werden wir CSS in etwas Hässliches und Unelegantes verwandeln.
Es wird **immer** **immer** Einschränkungen in jeder Sprache geben. Ich denke, wir sollten diese eine so belassen, wie sie ist.
Ich **brauchte** nur einen übergeordneten Selektor, als ich ein neuer CSS-Designer war. Versuchen Sie, die Einschränkung zu umgehen, indem Sie Ihre Prozesse und Strukturen bewerten. (Das müssen Sie sowieso tun, weil es keinen übergeordneten Selektor gibt) und akzeptieren Sie, dass, wenn dies die schlimmste Einschränkung ist, die wir in CSS haben, es wirklich nicht so schlimm ist.
Ich stelle fest, dass ich mir häufig wünsche, CSS hätte einen übergeordneten Selektor. Ähnlich wie Sie es beschrieben haben, hat die Software, mit der ich arbeite, viele Elemente, denen dynamische IDs zugewiesen werden, auf die man sich nicht verlassen kann. Ich muss oft das Elternteil eines Elements gestalten, habe aber keine einfache Möglichkeit, darauf zu verweisen. Ich bin gezwungen, entweder auf einen stabilen ID-Groß-Groß-Groß-Groß-Urahn zu verweisen oder einen cleveren Einsatz von Pseudoselektoren zu finden.
Ich arbeite mit RPA-Produkten, die CSS-Selektoren verwenden, um Elemente zum Extrahieren und Interagieren zu finden. Ein übergeordneter Selektor wäre eine große Hilfe auf Websites mit dynamischen IDs, und Elemente können nur nach ihrem Text gefunden werden (Überschriften und Tabellenspalten).
Aber ich denke, die Werkzeuge könnten die übergeordnete Auswahl bereitstellen und nicht den Selektor selbst.
Bearbeitung des vorherigen: Es ist keine Klassen-Selektor erforderlich, wenn Sie bereits wissen, welches das übergeordnete Element ist.
div:has(> .child) würde Ihnen das übergeordnete div geben.
Wenn man darüber nachdenkt, ist es nicht wirklich ein übergeordneter Selektor, den wir wollen, sondern ein übergeordneter Kombinator. Eine Pseudoklassen-Selektor wie der hypothetische
:parentwürde wie ein Filter auf einer Liste von Tags funktionieren, die dem Teil des Selektors vor ihm entsprechen, so dassli:parentalle<li>-Tags nimmt und sie filtert und Ihnen die passenden<li>zurückgibt, aber in diesem Fall ist das nicht das, was wir wollen – wir wollen wahrscheinlich das<ul>auswählen, das es enthält.Ich habe die CSSWG gefragt, welche Syntax CSS-Autoren verwenden können, um benutzerdefinierte Selektor-Kombinatoren darzustellen (wenn Sie selbst Unterstützung dafür implementieren möchten), und mir wurde gesagt, ich solle ein Paar Schrägstriche verwenden, die einen benutzerdefinierten IDENT umgeben, der mit einem doppelten Bindestrich beginnt, wie
/--custom-combinator/. Jeder, der seinen eigenen benutzerdefinierten übergeordneten Kombinator in gültiger CSS-Syntax unterstützen möchte, sollte etwas wie/--parent/oder einen anderen für Sie sinnvollen Namen unterstützen, so dass Sie einen Selektor wieli /--parent/ ul {}schreiben könnten und dieser das<ul>-Elternteil jedes passenden<li>-Tags ansprechen würde.Nur zum Spaß – wir unterstützen bereits einen benutzerdefinierten übergeordneten Kombinator mit dieser
/--parent/-Syntax in unserem CSS bei der Arbeit, schauen Sie ihn sich hier an und spielen Sie damit selbst mit process-css-demo herum: https://twitter.com/innovati/status/1207710819242463234Ich bin heute auf einen gestoßen und dachte an diesen Artikel.
Ein Modal mit einer Klasse
.is-visible, das dasbody-Element auswählen undoverflowauf „hidden“ setzen kann, um das Scrollen im Hintergrund zu verhindern.