Недавно столкнулся с проблемой в процессе проекта.Меню-бар надеется всегда отображаться вверху, а элементы после него отображаются под ним.В то время установка z-индекса не дает никакого эффекта.Я не знаю причину, поэтому я нашел информацию о каскадировании в CSS и решил эту проблему. Запишите это здесь ~
Экран представляет собой двухмерную плоскость, но элементы HTML расположены в трехмерной системе координат, где x — горизонтальное положение, y — вертикальное положение, а z — положение экрана изнутри наружу. Когда мы смотрим на экран, мы следуем оси Z. Направление снаружи внутрь, таким образом, элементы образуют каскадную связь с точки зрения пользователя, и элемент может покрывать другие элементы или может быть покрыт другими элементами;
Итак, вот несколько важных концепций:контекст стека(контекст стекирования, контекст стекирования),Каскадный уровень(уровень стека),Каскадный порядок(порядок укладки, порядок укладки, порядок укладки),z-index
утверждение:
- Следующие элементы позиционирования относятся к
position: absolute|fixed|relative|sticky
- Следующие непозиционированные элементы относятся к
position: initial|static
- Существует аналогичная концепция наложения контекстов:контекст форматирования на уровне блока(BFC, Контекст блочного форматирования), вы можете обратиться кВажные BFC в CSS, который также знакомит с содержанием некоторых потоков документов;
- Эта статья довольно длинная, но если у вас хватит смелости прочитать ее, вы должны иметь базовые понятия, связанные со стекированием (~o ̄▽ ̄)~
Заинтересованные студенты могут добавить группу WeChat в конце статьи для совместного обсуждения~
1. Контекст стекирования
контекст стека(контекст стекирования, контекст стекирования) — это трехмерная концепция в HTML. В спецификации CSS2.1 положение каждого элемента является трехмерным.Когда элемент сложен, он может перекрывать другие элементы или быть перекрыт другими элементами, чем выше ось z, тем ближе он к экрану. зритель закрыть
статьяЕсть хорошая аналогия, вот цитата;
Представьте себе таблицу с кучей элементов, и эта таблица представляет собой контекст стека. Если рядом с первой таблицей находится вторая таблица, эта вторая таблица представляет другой контекст стека.
А теперь представьте, что на первом столе есть четыре маленьких квадратика, и все они лежат прямо на столе. Поверх этих четырех квадратиков лежит кусок стекла, а поверх стакана – тарелка с фруктами. Эти кубики, кусочки стекла и вазы с фруктами представляют разные слои в контексте укладки, то есть стол.
Каждая веб-страница имеет контекст стека по умолчанию. Корень этого контекста стека (таблица)<html></html>
. Все в теге html помещается в стек этого контекста стека по умолчанию (элементы размещаются на столе).
Когда вы даете позиционированный элемент, кромеauto
z-index, вы создаете новый контекст стека со стеками, независимыми от других контекстов стека и стеков на странице, что эквивалентно внесению в комнату еще одного стола.
Контекст стекирования 1 (Контекст стекирования 1) формируется корневым элементом документа, Контекст стекирования 2 и 3 (Контекст стекирования 2, 3) представляют собой слои стекирования в Контексте стекирования 1 (Контекст стекирования 1). Каждый из них также формирует новый контекст наложения, который содержит новые слои наложения.
В контексте наложения его дочерние элементы накладываются друг на друга в соответствии с описанными выше правилами. формирование контекста стекаметодимеют:
- корневой элемент
<html></html>
-
position
значениеabsolute | relative
,иz-index
значение неauto
-
position
значениеfixed | sticky
-
z-index
значение неauto
гибкий элемент, то есть: родительский элементdisplay: flex | inline-flex
-
opacity
стоимость имущества меньше1
Элементы -
transform
стоимость имущества неnone
Элементы -
mix-blend-mode
стоимость имущества неnormal
Элементы -
filter
,perspective
,clip-path
,mask
,mask-image
,mask-border
,motion-path
значение неnone
Элементы -
perspective
значение неnone
Элементы -
isolation
свойство установлено наisolate
Элементы -
will-change
Любые свойства CSS, указанные в -
-webkit-overflow-scrolling
свойство установленоtouch
Элементы
Суммировать:
- Контексты стекирования могут содержаться внутри других контекстов стекирования и вместе образуют иерархический контекст стекирования.
- Каждый контекст укладки полностью независим от своих братьев и сестер, и при укладке учитываются только дочерние элементы, что-то вродеBFC
- Каждый контекст наложения является самодостаточным: когда содержимое элемента складывается, веськонтекст стека в родительскомслоистых по порядку
2. Уровень стека
Каскадный уровень(Уровень наложения, Уровень наложения) Определяет порядок отображения элементов по оси Z в одном контексте наложения.концепция;
- Уровень стека обычных элементов определяется контекстом стека, в котором они расположены.
- Сравнение уровней стека имеет смысл только в пределах одного и того же элемента контекста стека.
- В том же контексте наложения описание уровня наложения определяет верхний и нижний порядок элементов в контексте наложения по оси Z.
Обратите внимание, что уровень наложения не обязательно определяется z-индексом, только уровень наложения позиционированного элемента определяется z-индексом, а уровень наложения элементов других типов определяется порядком наложения, порядком в которые они появляются в HTML, и элементы над их родительским элементом. Уровень размещения определяется вместе. Подробные правила см. в описании последовательности размещения ниже.
3. z-index
В CSS 2.1 все элементы блочной модели находятся в трехмерной системе координат. В дополнение к нашим обычным абсциссе и ординате, элементы блочной модели также могут быть сложены вдоль «оси Z. Когда они перекрывают друг друга, порядок оси Z становится важным.
z-индекс применим только к позиционированным элементам, недействителен к непозиционированным элементам, он может быть установлен на положительное целое число, отрицательное целое число, 0, авто, если позиционированный элемент не имеет установленного z-индекса, то по умолчанию используется автоматический;
Значение z-index элемента имеет смысл только в том же контексте стека. Если уровень стека родительского контекста стека ниже, чем уровень стека другого контекста стека, то его z-индекс устанавливается выше этого. Поэтому, если вы столкнулись с большим значением z-индекса, которое не работает, проверьте, распространяется ли его родительский контекст наложения на другие контексты наложения.
4. Порядок укладки
Каскадный порядок(порядок наложения, порядок наложения, порядок наложения) описывает порядок элементов в одном контексте наложения.правило, начиная с нижней части стопки, существует семь порядков укладки:
- фоны и границы: Фон и граница элементов, формирующих контекст наложения.
- Отрицательное значение z-индекса: Позиционирование дочерних элементов с отрицательными значениями z-index в контексте наложения, чем больше отрицательное значение, тем ниже уровень наложения;
- коробка блочного уровня: блочные непозиционированные дочерние элементы в потоке документов;
- плавающий ящик: непозиционируемый плавающий элемент;
- Встроенный блок: встроенные непозиционированные дочерние элементы в потоке документов;
- z-index: 0: позиционирование элементов с z-индексом 0 или auto, эти элементы формируют новый контекст наложения;
- Положительное значение z-индекса: z-индекс является положительным элементом позиционирования, чем больше положительное значение, тем выше уровень стека;
Элементы с одинаковым порядком размещения располагаются в том же порядке, в котором они появляются в HTML; элементы в порядке седьмого уровня отображаются над элементами в предыдущем порядке, который, по-видимому, перекрывает элементы более низкого уровня:
5. Настоящий бой
5.1 Общая ситуация
триrelative
позиционируетсяdiv
каждый в блокеabsolute
разных цветовspan.red
,span.green
,span.blue
, они все настроеныposition: absolute
;
Затем, когда ни один элемент не содержит атрибут z-index, элементы в этом примере располагаются в следующем порядке (снизу вверх):
- Фон и граница корневого элемента
- Непозиционированные элементы уровня блока располагаются в том порядке, в котором они появляются в HTML.
- Встроенные непозиционированные элементы располагаются в том порядке, в котором они появляются в HTML.
- Позиционированные элементы располагаются в том порядке, в котором они появляются в HTML.
И красный, и зеленый, и синий принадлежат элементам позиционирования, z-индекс которых установлен автоматически, поэтому они относятся к шестому уровню порядка размещения в соответствии с правилом 7-уровневого порядка размещения, поэтому они размещаются в порядке появления в HTML. :红->绿->蓝
5.2 В случае родительских элементов одного и того же контекста стека
красный и зеленый вdiv.first-box
вниз, синий находитсяdiv.second-box
Далее устанавливаются красный, зеленый и синийposition: absolute
,first-box
иsecond-box
все готовоposition: relative
;
См. Codepen — разные родительские элементы, но все они находятся под корневым элементом.
В этом примере родительский элемент красного, синего и зеленого элементовfirst-box
иsecond-box
Ни один из них не генерирует новый контекст наложения, все они принадлежат элементам в корневом контексте наложения, и все они находятся на шестом уровне порядка наложения, поэтому они складываются в порядке появления в HTML:红->绿->蓝
5.3 Добавление z-индекса к дочерним элементам
красный и зеленый вdiv.first-box
вниз, сине-желтый расположен вdiv.second-box
Далее устанавливаются красный, зеленый и синийposition: absolute
, если в это время вы добавите атрибут к зеленомуz-index: 1
, то в это время.green
на вершине;
если в.second-box
Вниз.green
с последующим абсолютным позиционированиемspan.gold
,настраиватьz-index: -1
, то он будет располагаться ниже красного, зеленого и синего;
См. Codepen - установлен z-index
В этом примере новый контекст наложения не создается в родительских элементах красного, синего, зеленого и желтого элементов, и все они принадлежат элементам корневого контекста наложения.
- Для красного и синего не задан z-индекс, оба относятся к шестому уровню в порядке наложения и складываются в порядке появления в HTML;
- Зеленый имеет положительный z-индекс и относится к уровню 7;
- Huang устанавливает отрицательный z-индекс и принадлежит к уровню 2;
Таким образом, порядок, отображаемый снизу вверх в этом примере, следующий:黄->红->蓝->绿
5.4 В случае родительских элементов с разными контекстами наложения
красный и зеленый вdiv.first-box
вниз, синий находитсяdiv.second-box
Далее устанавливаются красный, зеленый и синийposition: absolute
,еслиfirst-box
Соотношение настройки z-indexsecond-box
велик, то независимо от того, насколько велик синий z-индексz-index: 999
, синий расположен ниже красного и зеленого; если мы только изменим значение z-индекса красного и зеленого, так как оба элемента находятся в родительском элементеfirst-box
В сгенерированном каскадном контексте тот, кто имеет большее значение z-index в это время, находится на нем;
См. Codepen — родительские элементы для различных контекстов стекирования
В этом примере красный, зеленый и синий — все позиционированные элементы с установленным z-index, но их родительские элементы создают новый контекст наложения;
- красно-зеленый родительский элемент
first-box
Это элемент позиционирования с положительным набором z-index, поэтому создается контекст наложения, который принадлежит седьмому уровню в порядке наложения; - синий родительский элемент
second-box
Также создается контекст наложения, который принадлежит шестому уровню в порядке наложения; - В порядке укладки,
first-box
Все элементы вsecond-box
начальство; - И красный, и зеленый принадлежат контексту стека.
first-box
Посередине установлены разные положительные z-индексы, все они относятся к седьмому уровню в порядке наложения; - Синий принадлежит контексту стека
second-box
, и задается большой положительный z-индекс, который принадлежит седьмому уровню каскадного элемента; - Хотя синий z-индекс очень большой, т.к.
second-box
Коэффициент каскадного уровняfirst-box
маленькие, а потому ниже красных и зеленых;
Таким образом, порядок отображения в этом примере снизу вверх:蓝->红->绿
(Я столкнулся с ситуацией, похожей на этот пример)
5.5 Установка прозрачности для дочерних элементов
красный и зеленый наdiv.first-box
вниз, синий находитсяdiv.second-box
Далее устанавливаются красный, зеленый и синийposition: absolute
, зеленый наборz-index: 1
, то в это время зеленый находится выше красного и синего;
Если в это время датьfirst-box
настраиватьopacity: .99
, в это время независимо от того, насколько велик красный и зеленый z-индексz-index: 999
, синий находится поверх красного и зеленого;
если в.second-box
Вниз.green
добавить один послеspan.gold
,настраиватьz-index: -1
, то он будет расположен ниже красного, зеленого и синего;
См. Codepen — влияние непрозрачности
Он был введен ранее, устанавливаяopacity
Контексты стекирования также могут быть сформированы, поэтому:
-
first-box
уже настроенopacity
,first-box
становится новым контекстом стека; -
second-box
Новый контекст наложения не формируется, поэтому все элементы в нем принадлежат корневому контексту наложения; - Желтый относится ко второму уровню в порядке укладки, красный и зеленый относятся к седьмому уровню,
first-box
относится к уровню 6, синий относится к уровню 6 в порядке наложения и расположен в том порядке, в котором появляется HTMLfirst-box
выше;
Таким образом, порядок отображения в этом примере снизу вверх:黄->红->绿->蓝
Большинство сообщений в Интернете имеют разную глубину и даже некоторые несоответствия. Следующие статьи являются кратким изложением процесса обучения. Если вы найдете какие-либо ошибки, пожалуйста, оставьте сообщение, чтобы указать ~
Ссылаться на:
- Z-индекс, который вы не знаете
- MDN - z-index
- What No One Told You About Z-Index
- Тщательно понимать контекст стека CSS, уровень стека, порядок стека, z-индекс
- Более плавная анимация для оптимизации производительности интерфейса.
- Чего вы не знали о z-index
- Давайте поговорим о связанных с каскадом концепциях в CSS.
Рекомендуемое чтение:
PS: Всех приглашаю обратить внимание на мой публичный аккаунт [Front End Afternoon Tea], давайте работать вместе~
Кроме того, вы можете присоединиться к группе WeChat «Front-end Afternoon Tea Exchange Group», нажмите и удерживайте, чтобы определить QR-код ниже, чтобы добавить меня в друзья, обратите вниманиеДобавить группу, я заберу тебя в группу~