Pit: css: ul li:nth-child(2)

Hallo,

Frage: Bezieht sich die Regel ul li:nth-child(2) immer genau auf das 2 Kind, egal ob es sichtbar ist oder nicht? Oder wird das 3. Kind zum 2. Kind, wenn das 1. oder 2. Kind hidden ist?

Pit

  1. Morgen,

    Frage: Bezieht sich die Regel ul li:nth-child(2) immer genau auf das 2 Kind, egal ob es sichtbar ist oder nicht? Oder wird das 3. Kind zum 2. Kind, wenn das 1. oder 2. Kind hidden ist?

    Das bezieht sich immer auf das 2 Element wenn es ein li ist, Sichtbarkeit spielt da keine Rolle.

    Gruß
    Jo

  2. Frage: Bezieht sich die Regel ul li:nth-child(2) immer genau auf das 2 Kind, egal ob es sichtbar ist oder nicht? Oder wird das 3. Kind zum 2. Kind, wenn das 1. oder 2. Kind hidden ist?

    CSS-Selektoren sind Abfragen über den DOM-Baum, welcher in seiner Struktur mittels CSS nicht verändert werden kann.

  3. Hallo Pit,

    merkwürdigerweise sagt die Spec NICHT, dass ein <ul> nur <li> Elemente enthalten darf. Statt dessen steht da "flow content", und das ist eine ganze Menge.

    Wenn Du also den zweiten Listenpunkt ansprechen willst, solltest Du besser li:nth-of-type(2) verwenden und nicht nth-child. Die Aussage von Jo zur Sichtbarkeit gilt da auch.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hey,

      Wenn Du also den zweiten Listenpunkt ansprechen willst, solltest Du besser li:nth-of-type(2) verwenden und nicht nth-child. Die Aussage von Jo zur Sichtbarkeit gilt da auch.

      Auch bei :nth-child wird der Typ geprüft. Falls das 2te Element kein li ist, trifft der Selektor nicht zu. Nachtrag: dazu noch ein kleiner Test

      Gruß
      Jo

      1. @@J o

        Auch bei :nth-child wird der Typ geprüft.

        Bei :nth-child(2) nicht; bei li:nth-child(2) ja.

        Falls das 2te Element kein li ist, trifft der Selektor nicht zu.

        Und falls das erste Element kein li ist, selektiert li:nth-child(2) das erste Listenelement (falls das zweite Element ein li ist).

        LLAP 🖖

        --
        „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
        1. Hey,

          Und falls das erste Element kein li ist, selektiert li:nth-child(2) das erste Listenelement (falls das zweite Element ein li ist).

          Nein, das erste Listenelement ist in dem Fall immernoch das 2te Kind ( li:nth-Child(2) ). Normalerweise bist doch du derjenige, der auf solche Feinheiten Wert legt.

          Gruß
          Jo

          1. @@J o

            Und falls das erste Element kein li ist, selektiert li:nth-child(2) das erste Listenelement (falls das zweite Element ein li ist).

            Nein, das erste Listenelement ist in dem Fall immernoch das 2te Kind ( li:nth-Child(2) ).

            Ich sagte nichts Gegenteiliges.

            LLAP 🖖

            --
            „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
    2. Hallo Rolf

      merkwürdigerweise sagt die Spec NICHT, dass ein <ul> nur <li> Elemente enthalten darf.

      Stimmt, ul darf nicht nur li-Elemente enthalten.

      Statt dessen steht da "flow content", und das ist eine ganze Menge.

      Wo liest du das?

      Ich schaue beim ul-Element in die Zeile zum Thema Inhaltsmodell und lese:

      „Zero or more li and script-supporting elements.“

      Eine ul darf außer li nur script und template als Kinder haben.

      Viele Grüße,

      Orlok

      1. Hallo Orlok,

        ich war zu dumm, um "Category" und "Content-Model" zu unterscheiden.

        Natürlich hast Du da recht. <ul> IST flow content, aber der Inhalt ist es nicht. Der Inhalt ist <li>, <script> und <template>, was für :nth-child natürlich immer noch ein Treffer sein kann.

        Rolf

        --
        sumpsi - posui - clusi
    3. @@Rolf B

      merkwürdigerweise sagt die Spec NICHT, dass ein <ul> nur <li> Elemente enthalten darf.

      Was ist daran merkwürdig?

      Statt dessen steht da "flow content"

      Nein, da steht: “Zero or more li and script-supporting elements.” Sowohl in der WHATWG-Spec (die ich persönlich für irrelevant halte) als auch in der richtigen™.

      LLAP 🖖

      --
      „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
  4. @@Pit

    Frage: Bezieht sich die Regel ul li:nth-child(2) immer genau auf das 2 Kind, egal ob es sichtbar ist oder nicht?

    Ja. Aber nicht egal, ob es vom Typ li ist oder nicht. Wenn du das zweite Listelement haben möchtest (und nicht das li-Element, welches das weite Kind von ul ist), dann ist ul li:nth-of-type(2) angebracht.

    Oder wird das 3. Kind zum 2. Kind, wenn das 1. oder 2. Kind hidden ist?

    Nein, wenn du das willst, brauchst du li:nth-child(2 of :not([hidden])) und Safari (gegenwärtig).

    Guckst du: Zebra gone wrongnth-child ofcan I useerledigt

    LLAP 🖖

    --
    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
    1. hallo

      Ja. Aber nicht egal, ob es vom Typ li ist oder nicht. Wenn du das zweite Listelement haben möchtest (und nicht das li-Element, welches das weite Kind von ul ist), dann ist ul li:nth-of-type(2) angebracht.

      Kleine Korrektur

      dann ist ul > li:nth-of-type(2) angebracht. Wer weiss, wie verschachtelt Listen werden können. Und Nebeneffekte will man in der Regel ausschliessen.

      1. @@beatovich

        Kleine Korrektur

        dann ist ul > li:nth-of-type(2) angebracht. Wer weiss, wie verschachtelt Listen werden können. Und Nebeneffekte will man in der Regel ausschliessen.

        Das hilft dir bei

        ul
        ├─li
        │ └─ul
        │   ├─li
        │   └─li
        └─li
          └─ul
            ├─li
            └─li
        

        aber auch nicht weiter.

        Du willst der äußeren Liste eine ID foo oder Klasse bar vergeben und #foo > li:nth-of-type(2) bzw. .bar > li:nth-of-type(2) selektieren.

        LLAP 🖖

        --
        „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
        1. hallo

          Du willst der äußeren Liste eine ID foo oder Klasse bar vergeben und #foo > li:nth-of-type(2) bzw. .bar > li:nth-of-type(2) selektieren.

          Das ist natürlich noch korrekter.

  5. Danke an alle für die Hinweise.

    Pit