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

1voto

Damiano Punkte 960

Ich würde einige JavaScript-Code einstellen, um das zu erreichen. Zum Beispiel, in React, wenn Sie über ein Array iterieren, fügen Sie eine weitere Klasse zum Elternelement hinzu, die angibt, dass es Ihre Kinder enthält:

Und dann einfach:

.parent {
    color: #000;
}

.parent.has-kiddos {
    color: red;
}

1voto

A Haworth Punkte 21074

Dies ist eine Antwort auf eine ähnliche (aber nicht genau dieselbe) Frage, die zugunsten dieser Frage geschlossen wurde. Daher habe ich eine Antwort auf Wie ändert man die Rahmenfarbe, wenn das Eingabefeld aktiviert ist hier platziert.

Da es mit reinem CSS nicht möglich ist, das Styling eines Elternelements je nach Status seines Kindes zu ändern, ändert dieses Snippet das HTML so ab, dass ein leeres Span-Element unmittelbar nach den Eingabeelementen folgt. Dieses Span-Element tut nichts, bis auf das Eingabeelement gehovert wird, woraufhin es angezeigt wird und sich auf die gleiche Größe wie das übergeordnete Element ausdehnt, das positioniert ist. Dies ist das Label selbst, nicht das Eingabelement. Daher erscheint der Rahmen (Schatten), als ob er im Label wäre.

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

.OuterField {
  display: flex;
}

.listLabel {
  padding: 8px 5px;
  border: 2px solid black;
  width: 32%;
  margin: 1%;
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-flow: row;
  position: relative;
}

input[type="radio"]~span {
  display: none;
}

input[type="radio"]:checked~span {
  display: inline-block;
  width: 100%;
  height: 100%;
  border: 2px solid red;
  box-shadow: 0 0 0 3px orange;
  position: absolute;
  top: 0;
  left: 0;
}

  Liste 1

  Liste 2

0 Stimmen

Vielen Dank (+1), aber was ist, wenn nur border ohne box-shadow vorhanden ist? Wie zentrieren Sie dann? Habe versucht top: -2px, left: -2px, width: 102%, height: 112% auf dem span-Tag zu ändern. Es hat funktioniert, aber nur auf einigen Bildschirmgrößen und überlappt nicht über den schwarzen Rand auf allen Bildschirmgrößen. Muss ich absolute Werte angeben oder gibt es auch hierfür einen Workaround? Nochmals vielen Dank für die Hilfe, ich schätze es wirklich.

0 Stimmen

Fand eine Lösung, die verwendet werden könnte width: calc(100% + 4px); height: calc(100% + 4px); mit top: -2px left: -2px

1 Stimmen

Freut mich, dass du etwas gefunden hast, das funktioniert. Ja, es ist schwierig, ein absolut positioniertes Element genau an derselben Stelle wie ein anderes Element zu platzieren, um beispielsweise einen dünnen Rand genau auszurichten - auch wenn die CSS-Ausrichtung genau ist, können die zugrunde liegenden Bildschirmpixel sichtbar werden (da es mehrere Bildschirmpixel pro CSS-Pixel geben kann), daher ist deine Lösung praktisch.

-7voto

Viele komplexe Lösungen in den Antworten. Aber du kennst den Eltern-Element, also ist die Lösung nicht komplex. Wenn du z.B. das Styling bei Aktivierung ändern möchtest.

.parentDiv > input[type="checkbox"]:checked {
    //style it
}

4 Stimmen

Dies formatiert das Kind, nicht den Elternteil.

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