4275 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().

29voto

Marco Allori Punkte 3064

Dies ist der am meisten diskutierte Aspekt der Spezifikation Selector Level 4. Mit diesem wird ein Selektor in der Lage sein, ein Element entsprechend seines Kindes zu stylen, indem er ein Ausrufezeichen nach dem angegebenen Selektor (!) verwendet.

Zum Beispiel:

body! a:hover{
   background: red;
}

wird eine rote Hintergrundfarbe festlegen, wenn der Benutzer über einen Anchor schwebt.

Aber wir müssen auf die Implementierung der Browser warten :(

1 Stimmen

Das ("!") Feature wurde durch ':has()' ersetzt drafts.csswg.org/selectors/#changes-2013

27voto

Mark Hurd Punkte 12692

Nicht in CSS 2, soweit ich weiß. CSS 3 hat leistungsstärkere Selektoren, aber sie sind nicht konsistent in allen Browsern umgesetzt. Auch mit den verbesserten Selektoren glaube ich nicht, dass es genau das erreichen wird, was du in deinem Beispiel angegeben hast.

25voto

riverstorm Punkte 530

Sie könnten versuchen, das Hyperlink als übergeordnetes Element zu verwenden und dann die inneren Elemente bei Hover zu ändern. So sieht es aus:

a.active h1 {color:red;}

a.active:hover h1 {color:green;}

a.active h2 {color:blue;}

a.active:hover h1 {color:yellow;}

Auf diese Weise können Sie den Stil in mehreren inneren Tags basierend auf dem Überrollen des übergeordneten Elements ändern.

1 Stimmen

Das ist korrekt, aber beschränkt den Markup-Code innerhalb des a-Tags nur auf bestimmte Elemente, wenn Sie den XHTML-Standard einhalten möchten. Zum Beispiel können Sie kein div innerhalb von a verwenden, ohne eine Warnung wegen Verstoßes gegen das Schema zu erhalten.

2 Stimmen

Total richtig Ivaylo! "a" ist ein Inline-Element, so dass keine Block-Elemente darin verwendet werden können.

2 Stimmen

Im HTML5 ist es völlig in Ordnung, Blockelemente innerhalb von Links zu platzieren.

24voto

David Clarke Punkte 12420

Ich weiß, dass der OP nach einer CSS-Lösung gesucht hat, aber es ist einfach, dies mit jQuery zu erreichen. In meinem Fall musste ich das

Elternelement für ein Element finden, das im untergeordneten* enthalten ist. jQuery hat den :has Selektor, so dass es möglich ist, ein Elternelement anhand der enthaltenen Kinder zu identifizieren:

    $("ul:has(#someId)")

wird das `ul` Element auswählen, das ein Kindelement mit der id _someId_ hat. Oder um die ursprüngliche Frage zu beantworten, sollte etwas ähnliches wie das Folgende das Problem lösen (nicht getestet):

    $("li:has(.active)")

4 Stimmen

Oder verwenden Sie $yourSpan.closest("ul") und Sie erhalten das übergeordnete UL-Element Ihres Spannelements. Trotzdem ist Ihre Antwort meiner Meinung nach völlig off topic. Wir können alle mit CSS getaggten Fragen mit einer jQuery-Lösung beantworten.

0 Stimmen

Ja, aber nicht alle mit CSS zusammenhängenden Fragen haben eine CSS-Antwort. Trotzdem ist dein Kommentar meiner Meinung nach völlig off-topic. Stackoverflow ist eine Website, um Dinge zu erledigen, kein Forum für religiöse Diskussionen.

21voto

Jan Kyu Peblik Punkte 1310

Hier ist ein Hack unter Verwendung von pointer-events mit hover:

/* Zubehör */
.parent {
    width: 200px;
    height: 200px;
    background: gray;
}
.parent, 
.selector {
    display: flex;
    justify-content: center;
    align-items: center;
}
.selector {
    cursor: pointer;
    background: silver;
    width: 50%;
    height: 50%;
}

/* relevant */
.parent {
    background: gray;
    pointer-events: none;
}
.parent:hover {
    background: fuchsia;
}
.parent 
.selector {
    pointer-events: auto;
}

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