CSS :first-child funktioniert nicht wie gedacht

Hendoul

Commander
Registriert
Apr. 2008
Beiträge
2.050
CSS:
div:first-of-type {
  color: red;
}
 
Ja danke, das habe ich auch probiert und funktioniert. Aber mich würde interessieren warum first-child nicht funktioniert.
 
Okay vergiss meinen Beitrag.

div-Tags sind in p-Tags nicht erlaubt, sieh mal was dein Webbrowser draus macht:
 

Anhänge

  • 2019-12-12 13_03_30-Document – Opera.png
    2019-12-12 13_03_30-Document – Opera.png
    7,3 KB · Aufrufe: 234
Schau dir die Elemente mal im Inspector an:

1576152337668.png


<div> ist nicht in einem <p> erlaubt und daher dann kein Child-Element mehr.
 
So rum würd's gehen:

HTML:
    <div class="a">
      <p>huba</p>
      <p>huba2</p>
    </div>
    <div class="b">
      <p>huba3</p>
    </div>
    <div>
      <p>huba4</p>
    </div>
CSS:
    p:first-child {
      color: red;
    }
 
Probier mit :nth-child(n) doch mal durch. Dann ist dein first-of-type = nth-child(2). Warum das so ist steht bestimmt in der Spezifikation von first-child.
 
darkR schrieb:
Wenn das alles rot werden soll
Lässt sich schon aus dem codepen entnehmen, dass dem nicht so ist :rolleyes:

CooperakaTigger schrieb:
Warum das so ist steht bestimmt in der Spezifikation von first-child
Nein, weil first-child hier gar nicht das Problem ist.
Ergänzung ()

https://developer.mozilla.org/de/docs/Web/HTML/Element/p

<div> ist ein Block-Level Element, kein Inline-Element.

Wenn du was ähnliches wie in deinem Beispiel machen möchtest, nutze statt der <div> jeweils ein <span>, das ist der Inline-Gegenpart zum <div> (in dem Sinne, dass es keine semantische Bedeutung hat).
 
  • Gefällt mir
Reaktionen: br3adwhale
Ich meinte das eigentlich einfach so, dann sind alle divs children:
<div>
<p class="a">
<div>huba</div>
<div>huba2</div>
</p>
<p class="b">
<div>huba3</div>
</p>
<p>
<div>huba4</div>
</p>
</div>
 
Das ändert aber nichts daran, dass dann immer noch alles gefärbt werden würde, weil schon das umschließende <div> das erste <div>-Child (nämlich vom <body>) ist. Und das ändert auch nichts daran, dass ein <div> innerhalb eines <p> unzulässig ist.

Hendoul schrieb:
wird da der Text-Node vom <p> noch mitgezählt?
Um die Frage übrigens noch zu beantworten: Nein, die Selektoren betreffen nur "echte" DOM-Elemente, keine virtuellen Nodes und auch keine Pseudo-Elemente.
 
darkR schrieb:
Ich meinte das eigentlich einfach so, dann sind alle divs children:

Wird nicht funktionieren, da laut Spezifikation (die alle Browser gottseidank richtig umgesetzt haben) div-Tags innerhalb von p-Tags niemals nicht nie erlaubt sind.

Versuch mal ein span, vielleicht hilft dir das in deiner Sache.
 
ok dann sollte er den Code mal umbauen :) Ich hab das jetzt nicht nagelesen, habe nur rein von der Logik erstmal Eltern Tags plaziert.
 
Das ist ja genau das was der Browser automatisch macht... Und das ist auch nicht das was er hier offensichtlich versucht. Nämlich einen Teil eines Textes zu färben, und zwar immer den im ersten Child-Element, nur dass er eben den falschen Elementtyp verwendet.
Ergänzung ()

(^für die Nachwelt: der Beitrag über mir hatte vorher einen anderen Inhalt...)

Eltern-Tags platzieren funktioniert aber nicht mit einem recht allgemein gehaltenen Selektor wie div:first-child, denn der matcht immer schon das erste div im <body> (bzw. <html>, wenn man <body> weglässt).

Und selbst wenn das umschließende div ignoriert werden würde, und der Style dort nicht schon drauf ginge, wäre auch nur das erste "huba" rot, weil das das einzige first-child ist. huba3 und huba4 sind aber nicht die first-childs des umschließenden <div>, sollen aber trotzdem gefärbt werden. So oder so funktioniert der Vorschlag nicht.
 
Zuletzt bearbeitet:
Ok, zuerst hatte ich:

HTML:
<div class="a">
  <div>huba</div>
  <div>huba2</div>
</div>
<div class="b">
  <div>huba3</div>
</div>
<div>
  <div>huba4</div>
</div>

Aber das färbt dann alle hubas rot ein. Und das leuchtet mir auch nicht ein. huba2 ist doch kein first-child von irgendwas?
 
Aber das <div class="a"> ist das first-child vom <body>, die Farbe wird einfach nur vererbt. Das siehst du auch im Inspector:

1576155465690.png


Probier mal:
HTML:
<div class="a">
  <div>huba</div>
  <div>huba2</div>
</div>
<div class="b">
  <div>huba3</div>
  <div>huba3a</div>
</div>
<div>
  <div>huba4</div>
</div>

huba3a = schwarz
 
  • Gefällt mir
Reaktionen: br3adwhale
Hier ist das ganz gut ersichtlich ... https://www.w3schools.com/cssref/tryit.asp?filename=trycss_sel_firstchild

Und wenn du nur die ersten 2nd level divs haben möchtest, dann nutze:
CSS:
div > div:first-child {
  color: blue;
}
Und hier noch mal die Erklärung warum dein Code anders funktioniert, als du denkst.
HTML:
<div class="a"> <!-- first child of body UND div, daher TRUE -->
  <div>huba</div> <!-- first child of div, daher TRUE, außerdem wird rot vom 1st level vererbt -->
  <div>huba2</div> <!-- second child of div, daher FALSE, ABER es wird rot vom 1st level vererbt -->
</div>
<div class="b"> <!-- second child of body, daher FALSE -->
  <div>huba3</div> <!-- first child of div, daher TRUE -->
</div>
<div> <!-- third child of body, daher FALSE -->
  <div>huba4</div> <!-- first child of div, daher TRUE -->
</div>
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Mihawk90 und br3adwhale
Danke euch allen :)
 
Zurück
Oben