Różnica między selektorami div + p (plus) i div ~ p (tylda)


89

Sposób, w jaki to określa w3schools , brzmi tak samo.

Dokumentacja CSS W3Schools

div + p
Wybiera wszystkie <p>elementy, które są umieszczane bezpośrednio po <div>elementach

div ~ p
Wybiera każdy <p>element poprzedzony <div>elementem

Jeśli <p>element znajduje się bezpośrednio po <div>elemencie, czy nie oznacza to, że <p>element jest poprzedzony <div>elementem?

W każdym razie szukam selektora, w którym mogę wybrać element znajdujący się bezpośrednio przed danym elementem.


5
+jest najbliższym następnym pelementem i ~zawiera wszystkie następne pelementy (po każdym divelemencie)
— vsync

2
nie możesz tego zrobić before. niemożliwy. tylko z javascript. będziesz musiał go poszukać i wszystkie beforete klasy są celem w twoim CSS.
— vsync

7
Staraj się także unikać w3schools :) w3fools.com
— Alex Char

3
Zobacz to, aby uzyskać wizualne wyjaśnienie
— Marc B

2
Ciekawostką związaną z tym pytaniem jest to, że nie zadawano go wcześniej. Przynajmniej nie mogłem znaleźć podobnego pytania na SO.
— Hashem Qolami

Odpowiedzi:


120

Sąsiednie selektory rodzeństwa X + Y

Sąsiednie selektory rodzeństwa mają następującą składnię: E1 + E2, gdzie E2 jest tematem selektora. Selektor pasuje, jeśli E1 i E2 mają tego samego rodzica w drzewie dokumentu, a E1 bezpośrednio poprzedza E2, ignorując węzły nieelementowe (takie jak węzły tekstowe i komentarze).

ul + p {
   color: red;
}

W tym przykładzie wybierze tylko ten element, który jest bezpośrednio poprzedzony poprzednim elementem. W takim przypadku tylko pierwszy akapit po każdym ul będzie miał czerwony tekst.

Ogólne selektory rodzeństwa X ~ Y

Kombinator ~ oddziela dwa selektory i dopasowuje drugi element tylko wtedy, gdy jest poprzedzony pierwszym i oba mają wspólnego rodzica.

ul ~ p {
   color: red;
}

Ten kombinator rodzeństwa jest podobny do X + Y, jednak jest mniej rygorystyczny. Podczas gdy sąsiedni selektor (ul + p) wybierze tylko pierwszy element, który jest bezpośrednio poprzedzony poprzednim selektorem, ten jest bardziej uogólniony. Wybierze, nawiązując do powyższego przykładu, dowolne elementy p, o ile będą następować po ul.

Źródło

code.tutsplus

Ogólne selektory rodzeństwa MDN

Sąsiednie selektory rodzeństwa w3


6
Ta odpowiedź jest niczym innym jak cytatem z innego artykułu, bez próby odpowiedzi na konkretne pytanie. Podane przykłady również nie radzą sobie zbyt dobrze z odpowiedzią na to pytanie.
— BoltClock

1
@BoltClock dzięki, rozumiem. Zawsze czekam na Twoją opinię. Ale myślę, że moja odpowiedź wyjaśnia OP, jaka jest różnica między tymi selektorami.
— Alex Char

To prawda. Chociaż nie do końca odpowiada na to pytanie, w rozsądny sposób ilustruje różnicę między dwoma selektorami.
— BoltClock

@AlexChar Aby lepiej pokazać różnicę między tymi dwoma, powinieneś użyć tego samego przykładu HTML dla X + Y i X ~ Y.
— thecoolmacdude

@thecoolmacdude Gotowe. Dzięki za opinie. Teraz myślę, że jest bardziej jasne.
— Alex Char

22

Jeśli <p>element znajduje się bezpośrednio po <div>elemencie, czy nie oznacza to, że <p>element jest poprzedzony <div>elementem?

To jest poprawne. Innymi słowy, div + pjest podzbiorem z div ~ p- cokolwiek dopasowane dawna jest również dopasowane przez ten ostatni, z konieczności.

Różnica między +i ~polega na tym, że ~pasuje do wszystkich następnych rodzeństwa, niezależnie od ich bliskości od pierwszego elementu, o ile oboje mają tego samego rodzica.

Oba te punkty są najbardziej zwięźle zilustrowane na jednym przykładzie, w którym każda reguła stosuje inną właściwość. Zauważ, że pta następująca bezpośrednio po divma zastosowane obie reguły:

div + p {
    color: red;
}

div ~ p {
    background-color: yellow;
}
<section>
    <div>Div</div>
    <p>Paragraph</p>
    <p>Paragraph</p>
    <p>Paragraph</p>
</section>
<section>
    No div
    <p>Paragraph</p>
    <p>Paragraph</p>
    <p>Paragraph</p>
</section>

W każdym razie szukam selektora, w którym mogę wybrać element znajdujący się bezpośrednio przed danym elementem.

Niestety jeszcze takiego nie ma .


8

rozważ ten przykład:

p + p { /* the first p immediately after a preceding p */
   color: red; 
} 

p ~ p { /* all p's after a preceding p */
   font-weight: bold;
} 
<div>
   	<p>1</p>
	<div>separator</div>
   	<p>2</p> <!-- only ~ is applied here -->
  	<p>3</p> <!-- both + and ~ are applied here -->
</div>


0

1) Sąsiednie selektory rodzeństwa (S1 + S2)

Sąsiedni selektor równorzędny służy do wybierania określonego elementu, który znajduje się bezpośrednio obok innego określonego elementu. Oba elementy powinny być na tym samym poziomie.

div + p {
    color:red;
}

Przykład sąsiednich selektorów rodzeństwa

2) Ogólne selektory rodzeństwa (S1 ~ S2)

Ogólny selektor rodzeństwa służy do wybierania wszystkich określonych elementów równorzędnych innego określonego elementu.

div ~ p {
   color:red;
}

Przykład ogólnych selektorów rodzeństwa

Selektory Adjacent Sibling (S1 + S2) vs General Sibling (S1 ~ S2):

Selektor sąsiadującego rodzeństwa (S1 + S2) wybiera tylko bezpośredni element siostrzany, ale selektor ogólnego rodzeństwa (S1 ~ S2) wybiera wszystkie elementy rodzeństwa innego określonego elementu. W obu przypadkach oba elementy (S1 i S2) powinny być na tym samym poziomie.

Pozostałe selektory są wyjaśnione tutaj: https://www.csssolid.com/35-css-selectors-to-remember.html

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.