4011 Stimmen

Gibt es einen CSS-Eltern-Selektor?

Wie wähle ich das

  • Element aus, das ein direktes Elternteil des Anker Elements ist?

    Als Beispiel würde mein CSS so aussehen:

    li < a.active {
        property: value;
    }

    Offensichtlich gibt es Möglichkeiten, dies mit JavaScript zu tun, aber ich hoffe, dass es eine Art Umweg gibt, der nativ für CSS Level 2 existiert.

    Das Menü, das ich zu gestalten versuche, wird von einem CMS ausgespuckt, daher kann ich das aktive Element nicht zum

  • Element verschieben... (es sei denn, ich thematisiere das Menüerstellungsmodul, was ich lieber nicht tun würde).

7 Stimmen

Safari Tech Preview 137 hat heute die erste Implementierung des :has() Selectors eingeführt.

4 Stimmen

Bald erhältlich: chrome!

0 Stimmen

Es wäre großartig, etwas zu haben, das auf eine Weise funktioniert, die kohärent mit JavaScript ist el.parenteElement.parentElement... wie a:active:parent:parent oder sogar a::active::parent::parent, mit zwei Semikolons. Es wäre nicht nur kohärenter mit den vorhandenen Pseudoklassen, sondern auch intuitiver zu verwenden und einfacher zu verknüpfen, um bei Bedarf mehr als eine Ebene nach oben zu gelangen. Ich hoffe wirklich auf diese Art von Umsetzung, weil ich es wirklich nicht mag, :has(something) zu verwenden: es bringt weder Logik noch intuitive noch ergonomische Benutzbarkeit mit sich. Der JavaScript-Weg ist besser, und bei weitem besser als :has().

3324voto

Dan Herbert Punkte 94074

Derzeit gibt es keine Möglichkeit, das Elternelement eines Elements in CSS auf eine Weise auszuwählen, die in allen Browsern funktioniert.

Der Selectors Level 4 Working Draft enthält eine :has() Pseudo-Klasse, die diese Funktion bieten wird. Es wird ähnlich sein wie die jQuery-Implementierung, aber wird derzeit nicht von Firefox unterstützt.

li:has(> a.active) { /* styles to apply to the li tag */ }

Firefox ist derzeit der einzige große Browser, der es standardmäßig nicht unterstützt.

In der Zwischenzeit müssen Sie in Firefox auf JavaScript zurückgreifen, wenn Sie ein Elternelement mit voller Cross-Browser-Unterstützung auswählen müssen.

17 Stimmen

8 Stimmen

Es wird im September 2022 in Chrome 105 veröffentlicht werden.

0 Stimmen

320voto

Yukulélé Punkte 13571

Sie können die :has() CSS-Pseudo-Klasse verwenden

Aber sie hat eine begrenzte Browserunterstützung (derzeit nur Chrome / Edge / Safari).

2 Stimmen

Wie @Rodolfo Jorge Nemer Nogueira bemerkt hat, ist es mit sass (scss) möglich, indem man das &-Zeichen verwendet. Das wird dann zu dem gewünschten css kompiliert. Es wäre schön, wenn die nächste css-Version & unterstützen würde.

4 Stimmen

Eigentlich denke ich, dass es experimentelle Syntax gibt, die Andrews Aussage entspricht: @supports selector(:has(a))

10 Stimmen

@TamusJRoyce ... und zu was kompiliert SASS das resultierende CSS? Es muss am Ende des Tages CSS verwenden.

179voto

jeroen Punkte 89799

Ich denke nicht, dass Sie in CSS nur das übergeordnete Element auswählen können.

Aber da Sie anscheinend bereits eine .active Klasse haben, wäre es einfacher, diese Klasse auf das li zu verschieben (anstelle des a). Auf diese Weise können Sie sowohl auf das li als auch auf das a nur über CSS zugreifen.

4 Stimmen

Du kannst den Pseudo-Selektor nicht auf das Listenelement verschieben, da es kein fokussierbares Element ist. Er verwendet den :active-Selektor, so dass, wenn der Anker aktiv ist, das Listenelement betroffen sein soll. Listenelemente werden nie im aktiven Zustand sein. Es ist bedauerlich, dass ein solcher Selektor nicht existiert. Es scheint unmöglich zu sein, ein rein CSS-Menü vollständig tastaturzugänglich zu machen, ohne ihn (mit Geschwisterselektoren können Untermenüs, die mit verschachtelten Listen erstellt wurden, angezeigt werden, aber sobald die Liste den Fokus erhält, wird sie wieder versteckt). Wenn es CSS-only-Lösungen für dieses bestimmte Problem gibt.

18 Stimmen

@Dominic Aquilina Schau dir die Frage an, der OP verwendet eine Klasse, nicht einen Pseudo-Selektor.

150voto

Idered Punkte 2013

Sie können dieses Skript verwenden:

*! > input[type=text] { background: #000; }

Dadurch wird jeder Elternelement eines Texteingabefelds ausgewählt. Aber warten Sie, es gibt noch viel mehr. Wenn Sie möchten, können Sie einen spezifischen Elternteil auswählen:

.input-wrap! > input[type=text] { background: #000; }

Oder wählen Sie es aus, wenn es aktiv ist:

.input-wrap! > input[type=text]:focus { background: #000; }

Überprüfen Sie dieses HTML:

    Ihr Name, bitte

Sie können das span.help wählen, wenn das input aktiv ist und es anzeigen:

.input-wrap! .help > input[type=text]:focus { display: block; }

Es gibt noch viele weitere Möglichkeiten; schauen Sie einfach in die Dokumentation des Plugins.

Übrigens funktioniert es im Internet Explorer.

5 Stimmen

Angenommen, die Verwendung von jQuery patent() wäre schneller. Dies muss jedoch getestet werden.

2 Stimmen

@Idered Es schlägt fehl, wenn Sie eine CSS-Deklaration eines Selektor-Subjects ohne Nachfolgeselektor haben (#a! allein wirft einen Fehler, #a! p funktioniert), und daher funktionieren die anderen auch nicht, wegen Uncaught TypeError: Cannot call method 'split' of undefined: siehe jsfiddle.net/HerrSerker/VkVPs

5 Stimmen

@HerrSerker Ich glaube, #a! ist ein ungültiger Selektor, was sollte es auswählen?

123voto

zcrar70 Punkte 3096

Wie von einigen anderen erwähnt, gibt es keinen Weg, ein Element oder seine Eltern nur mit CSS zu gestalten, aber das folgende funktioniert mit jQuery:

$("a.active").parents('li').css("Eigenschaft", "Wert");

24 Stimmen

Das < Selektor existiert nicht (überprüft mit jQuery 1.7.1).

7 Stimmen

Vielleicht hat diese <-Syntax im Jahr 2009 funktioniert, aber ich habe sie aktualisiert (für 2013).

6 Stimmen

Noch besser ist es, den integrierten :has() Selector von jQuery zu verwenden: $("li:has(a.active)").css("Eigenschaft", "Wert");. Er liest sich ähnlich wie der vorgeschlagene ! Selector von CSS 4. Siehe auch: :parent Selector, .parents() Methode, .parent() Methode.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X