Почему селектор + работает точно также как селектор ~?

Насколько я понимаю, селектор + задает стиль для первого элемента после соседнего; селектор ~ применяется после выбранного тэга ко всем элементам выбранного типа (их может быть несколько).

В данном случае селектор + работает так, как должен работать селектор ~.

1. Пример с селектором +:

.bl {
  width: 50px;
  height: 50px;
  border: 1px solid grey;
}

.child_1 + .child_1 {
  background: yellowgreen;
}
<div class="parent">
  <div class="child_4 bl"></div>
  <div class="child_1 bl">1)</div>
  <div class="child_1 bl">1)</div>
  <div class="child_1 bl">1)</div>
</div>

2. Пример с селектором ~:

.bl {
  width: 50px;
  height: 50px;
  border: 1px solid grey;
}

.child_1 ~ .child_1 {
  background: yellowgreen;
}
<div class="parent">
  <div class="child_4 bl"></div>
  <div class="child_1 bl">1)</div>
  <div class="child_1 bl">1)</div>
  <div class="child_1 bl">1)</div>
</div>

Чем можно объяснить одинаковую работу этих селекторов?


Ответы (2 шт):

Автор решения: Dzorogh

Сравните с вот таким вариантом применения:

.bl {
  width: 50px;
  height: 50px;
  border: 1px solid grey;
}

.child_4~.child_1 {
  background: yellowgreen;
}
<div class="parent">
  <div class="child_4 bl"></div>
  <div class="child_3 bl">1)</div>
  <div class="child_2 bl">1)</div>
  <div class="child_1 bl">1)</div>
</div>

.bl {
  width: 50px;
  height: 50px;
  border: 1px solid grey;
}

.child_4+.child_1 {
  background: yellowgreen;
}
<div class="parent">
  <div class="child_4 bl"></div>
  <div class="child_3 bl">1)</div>
  <div class="child_2 bl">1)</div>
  <div class="child_1 bl">1)</div>
</div>

Селектор + выберет только следующий элемент внутри одного родителя. А селектор ~ выберет все элементы (любой элемент), после указанного перед селектором, внутри одного родителя.

→ Ссылка
Автор решения: Qwertiy

child_1 следует за другим child_1.

Надо вот так смотреть. Из-за отсутствия класса на 4м элементе во второй строке разница проявилась на 5м элементе - при плюси он не попадает под условие и нижней границы у него нет. Ну а по верхней границе в обеих строках видно разницу.

.a + .a { border-bottom-color: red; }
.a ~ .a { border-left-color:  blue; }

.a:first-child + .a { border-top-color:  orange; }
.a:first-child ~ .a { border-right-color: green; }

section {
  overflow: hidden;
}

div {
  background: antiquewhite;
  border: 3px solid transparent;
  float: left;
  margin: .25em;
  width: 2em;
  height: 2em;
  line-height: 2em;
  text-align: center;
}
<section>
  <div class="a">1</div>
  <div class="a">2</div>
  <div class="a">3</div>
  <div class="a">4</div>
  <div class="a">5</div>
  <div class="a">6</div>
  <div class="a">7</div>
</section>

<section>
  <div class="a">1</div>
  <div class="a">2</div>
  <div class="a">3</div>
  <div          >4</div>
  <div class="a">5</div>
  <div class="a">6</div>
  <div class="a">7</div>
</section>

→ Ссылка