Почему зеленый div появляется поверх красного div? - PullRequest
0 голосов
/ 01 июля 2019

https://codepen.io/anon/pen/dBdaWE

В приведенном выше коде у меня есть 2 деления red и blue. Используя z-index, мы убеждаемся, что красный выше синего, даже если он находится перед blue в разметке.

green является ребенком blue с z-index из 9999. Несмотря на то, что z-index высоко, его следует поймать в ловушку внутри blue, что явно ниже red. Как сказано в статье о трюках CSS: https://css -tricks.com / альманах / свойства / г / г-индекс /

Также обратите внимание, что вложение играет большую роль. Если элемент B расположен поверх элемента A, дочерний элемент элемента A никогда не может быть выше элемента B.

Как green div, который является ребенком blue, может взобраться на red div?

Ответы [ 2 ]

1 голос
/ 01 июля 2019

!! обратите внимание, что все приведенные ниже цитаты с * в конце взяты из этого источника

Также обратите внимание, что вложение играет большую роль. Если элемент B расположен поверх элемента A, дочерний элемент элемента A никогда не может быть выше элемента B. *

Как green div, который является потомком blue, может взобраться на red div?

Возможно, вы неверно истолковали это предложение. Он предназначен для той ситуации, когда ни у одного из элементов не установлено z-index. Если вы стилизуете элементы без установки z-index, то это правда. Посмотрите на интерактивный пример, приведенный ниже, без изменения z-index элементов.

.main {
  border: 1px solid;
  padding-left: 50px;
}

.red, .blue {
  width: 100px;
  height: 100px;
}

.red  {
  background-color: red;
  position: relative;
  top: 50px;
  left: -50px;
}

.blue {
  background-color: blue;
}

.green {
  width: 50px;
  height: 50px;
  position: relative;
  top: -25px;
  background-color: green;
}
<div class="main">
  <div class="red"></div>
  <div class="blue">
    <div class="green"></div>
  </div>
</div>

Как видите, следующее утверждение верно

Без значения z-index элементы складываются в том порядке, в котором они отображаются в DOM (самый нижний элемент на том же уровне иерархии отображается сверху) *

Однако, во-первых, это не очевидно, потому что позиция синих равна static, в отличие от двух других элементов, чьи position равны relative (таким образом, нестатические). Если вы ожидаете, что синий цвет выше красного (и ниже зеленого), то вам нужно изменить его position атрибут CSS. Это также упоминается в ссылке, как указано ниже

Элементы с нестатическим позиционированием всегда отображаются поверх элементов со статическим позиционированием по умолчанию. *

В приведенном ниже примере я дал синему элементу (ищите «ДОБАВЛЕНО») нестатическое значение позиции. Это приводит к аналогичному поведению, когда все элементы position равны static: сначала идет красный, затем синий идет сверху, а затем зеленый сверху, потому что это дочерний элемент синего цвета (ниже по иерархии).

.main {
  border: 1px solid;
  padding-left: 50px;
}

.red, .blue {
  width: 100px;
  height: 100px;
}

.red  {
  background-color: red;
  position: relative;
  top: 50px;
  left: -50px;
}

.blue {
  background-color: blue;
  position: relative; /* !! ADDED !! */
}

.green {
  width: 50px;
  height: 50px;
  position: relative;
  top: -25px;
  background-color: green;
}
<div class="main">
  <div class="red"></div>
  <div class="blue">
    <div class="green"></div>
  </div>
</div>

Теперь вернемся к первой цитате;

Также обратите внимание, что вложение играет большую роль. Если элемент B расположен поверх элемента A, дочерний элемент элемента A никогда не может быть выше элемента B. *

Это происходит, когда вы только присваиваете элементу B (в данном случае .red) значение z-index. В приведенном ниже примере я добавил значение z-index к красному элементу.

.main {
  border: 1px solid;
  padding-left: 50px;
}

.red, .blue {
  width: 100px;
  height: 100px;
}

.red  {
  background-color: red;
  position: relative;
  top: 50px;
  left: -50px;
  z-index:1; /* !! ADDED !! */
}

.blue {
  background-color: blue;
  position: relative;
}

.green {
  width: 50px;
  height: 50px;
  position: relative;
  top: -25px;
  background-color: green;
}
<div class="main">
  <div class="red"></div>
  <div class="blue">
    <div class="green"></div>
  </div>
</div>

Видите, зеленый элемент больше не появляется. Это потому, что красный выше синего. И зеленый является частью синего.

В вашем вопросе вы дали зеленому значение z-index. Это отменит текущее поведение, так что оно станет выше красного элемента, как показано здесь ниже.

.main {
  border: 1px solid;
  padding-left: 50px;
}

.red, .blue {
  width: 100px;
  height: 100px;
}

.red  {
  background-color: red;
  position: relative;
  top: 50px;
  left: -50px;
  z-index:1;
}

.blue {
  background-color: blue;
  position: relative;
}

.green {
  width: 50px;
  height: 50px;
  position: relative;
  top: -25px;
  background-color: green;
  z-index: 2; /* !! ADDED !! */
}
<div class="main">
  <div class="red"></div>
  <div class="blue">
    <div class="green"></div>
  </div>
</div>
1 голос
/ 01 июля 2019

Посмотрите на свой файл CSS.z-index из .green равно 9999.

EDIT: когда z-index равно auto, контекст стека не создается.Таким образом, красный и синий имеют одинаковый контекст.Вот почему дочерние элементы синего цвета не работают, как ожидается, от вложенного элемента с более низким z-index.

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...