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

104voto

Salman A Punkte 246207

Es gibt keinen Eltern-Selektor; genauso wenig wie es keinen vorherigen Geschwister-Selektor gibt. Ein guter Grund dafür, diese Selektoren nicht zu haben, ist, dass der Browser durch alle Kinder eines Elements traversieren muss, um festzustellen, ob eine Klasse angewendet werden soll. Wenn Sie beispielsweise Folgendes schreiben:

body:contains-selector(a.active) { background: red; }

Dann muss der Browser warten, bis alles abgerufen und analysiert wurde, bis zum , um festzustellen, ob die Seite rot sein soll oder nicht.

Der Artikel _Warum wir keinen Eltern-Selektor haben_ erklärt es im Detail.

16 Stimmen

Um den Browser schneller zu machen. Das Internet selbst schneller. Dieser Selector ist definitiv erforderlich, und der Grund, warum er nicht implementiert wird, liegt leider daran, dass wir in einer langsamen, primitiven Welt leben.

16 Stimmen

Tatsächlich würde der Selector einen sehr schnellen Browser langsam aussehen lassen.

10 Stimmen

Ich vertraue darauf, dass Browser-Entwickler eine Implementierung entwickeln würden, die mindestens so schnell ist wie die JavaScript-Version, die sowieso von den meisten Menschen verwendet wird.

80voto

sol Punkte 20777

Das Pseudo-Element :focus-within ermöglicht es einem Elternelement, ausgewählt zu werden, wenn ein Nachkomme im Fokus steht.

Ein Element kann fokussiert werden, wenn es ein tabindex-Attribut hat.

Browser-Unterstützung für focus-within

Tabindex

Beispiel

.parent:focus-within {
  background: hsl(199deg, 65%, 73%);
}

/* Demo-Stile */
body {
  margin: 0;
}
.parent {
  background: hsl(0, 0%, 80%);
  min-height: 100vh;
  display: grid;
  place-content: center;
}
.child {
  background: hsl(0, 0%, 0%);
  color: white;
  padding: 3rem;
  outline: 0;
  cursor: pointer;
  font: 18px/1.25 sans-serif;
  width: 20ch;
}

    Klicke oder fokussiere mich, mein Elternelement wird sich ändern.

3 Stimmen

Das funktioniert in meinem Fall gut, danke! Nur eine Anmerkung, das Beispiel wäre anschaulicher, wenn Sie die Farbe des Elternelements ändern würden, nicht des Geschwisterelements. Ersetzen Sie also .color:focus-within .change durch .color:focus-within. In meinem Fall benutze ich die Bootstrap-Navigationsleiste, die der Klasse bei Aktivierung Kinderelemente hinzufügt, und ich möchte der Elternklasse .nav-bar eine Klasse hinzufügen. Ich denke, dies ist ein ziemlich verbreitetes Szenario, bei dem ich das Markup besitze, aber das CSS+JS des Komponenten ist Bootstrap (oder ein anderes), sodass ich das Verhalten nicht ändern kann. Obwohl ich tabindex hinzufügen und dieses CSS verwenden kann. Vielen Dank!

0 Stimmen

Vielen Dank! Ich denke, dass DIESER ANSATZ wirklich die Antwort ist!

69voto

Josh Punkte 6118

Es gibt keine Möglichkeit, dies in CSS 2 zu tun. Sie könnten die Klasse zum li hinzufügen und auf das a verweisen:

li.aktiv > a {
    Eigenschaft: Wert;
}

4 Stimmen

Durch Anpassung des a-Elements auf display:block können Sie es so gestalten, dass es den gesamten Bereich des li ausfüllt. Wenn Sie erklären können, welchen Stil Sie suchen, kann ich eventuell mit einer Lösung helfen.

39voto

Raseko Punkte 389

Versuchen Sie, a auf die Anzeige block umzuschalten, und verwenden Sie dann beliebigen Stil. Das a-Element füllt das li-Element aus, und Sie können sein Aussehen nach Belieben ändern. Vergessen Sie nicht, das Padding von li auf 0 zu setzen.

li {
  padding: 0;
  overflow: hidden;
}
a {
  display: block;
  width: 100%;
  color: ..., background: ..., border-radius: ..., etc...
}
a.active {
  color: ..., background: ...
}

35voto

cobaasta Punkte 637

Der CSS-Selektor "Allgemeiner Geschwisterverknüpfungsoperator" könnte vielleicht für das verwendet werden, was Sie wollen:

E ~ F {
    eigenschaft: wert;
}

Dies passt zu jedem F-Element, das von einem E-Element vorangestellt ist.

0 Stimmen

.component-one:sichtbar ~ body{ Hintergrundfarbe: rot; } funktioniert nicht.

2 Stimmen

@F-Natic Ich bin nicht überrascht, dass es nicht funktioniert. Es handelt sich nicht um gültiges CSS (es gibt keine :visible Pseudo-Klasse in CSS). body ist auch ein direkter und nur Nachkomme von html.

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