Press shift question mark to access a list of keyboard shortcuts
Этот скринкаст является частью нашей серии CSS AtoZ. Вы можете найти другие записи серии здесь .
расшифровка
Некоторые конструкции интерфейса могут требовать наложения элементов друг на друга или наложения друг на друга.
Есть много способов, которыми элементы будут естественным образом накладываться друг на друга. Но мы можем контролировать этот порядок наложения, используя комбинацию свойств position
z-index
В этом последнем эпизоде первого сезона AtoZ CSS мы узнаем о:
- Порядок наложения документа по умолчанию
- Что такое стековый контекст и как они взаимодействуют друг с другом?
- Как
z-index
- И метод, который я использую для стандартизации
z-index
Укладка по умолчанию
При написании нашего HTML элементы, которые появляются внизу в документе, естественным образом укладываются выше элементов дальше.
<body>
<header class="site-header"></header>
<main class="site-content"></main>
<footer class="site-footer"></footer>
</body>
Учитывая этот фрагмент HTML, footer
header
Элементы могут перекрываться с помощью комбинации свойств position
top
right
bottom
left
Если я установлю position: absolute
footer
.site-header, .site-content, .site-footer {
position: absolute;
width: 400px;
padding: 20px;
}
.site-header {top: 0; left: 0;}
.site-content {top: 50px; left: 50px;}
.site-footer {top: 100px; left: 100px;}
Если я использую свойства смещения top
left
Стековый контекст
Несмотря на использование position: absolute
контекст стека .
Контекст стекирования создается любым из следующих способов:
- элемент с
absolute
relative
z-index
auto
- элемент flexbox со значением
z-index
auto
- элемент с
opacity
- элемент с установленным для
transform
none
Безусловно, самый распространенный способ создания и использования стекового контекста — это первый пример в этом списке, поэтому давайте сосредоточимся на этом на минутку.
Возвращаясь к предыдущему примеру, у нас есть три элемента, расположенные друг над другом, но в настоящее время они не имеют значения z-index
Свойство z-index
Если я установлю z-index: 1
footer
z-index: 2
main
z-index: 3
header
Это выглядит довольно просто на поверхности; чем выше z-index
z-index: 9999
z-index: 9
К сожалению, это немного сложнее, чем это.
z-index
<header class="site-header blue">header</header>
<main class="site-content green">content
<div class="box yellow"></div>
</main>
<footer class="site-footer pink">footer</footer>
Если я добавлю коробку внутри контейнера с site-content
.box {
position: absolute;
bottom: -25px;
right: -25px;
z-index: 4; /* won't work 🙁 */
width: 75px;
height: 75px;
border: 1px solid #000;
}
.site-header {top: 0; left: 0; z-index: -1;}
.site-content {top: 50px; left: 50px;}
.site-footer {top: 100px; left: 100px; z-index: 3;}
Основываясь на наших знаниях о z-index
z-index
Если я установлю z-index: 4
z-index: 3
Обычно люди пытаются форсировать стэкинг, выполняя огромное количество, например 9999
Наблюдение за значениями z-index
Причина, по которой мы не можем получить желаемый результат в виде желтого прямоугольника поверх розового прямоугольника, связана с тем, как z-index
Чтобы продемонстрировать это, давайте рассмотрим несколько более сложный пример, который я позаимствовал на сайте MDN .
<header class="site-header blue">
<h1>Header</h1>
<code>position: relative;<br/>
z-index: 5;</code>
</header>
<main class="site-content pink">
<div class="box1 yellow">
<h1>Content box 1</h1>
<code>position: relative;<br/>
z-index: 6;</code>
</div>
<h1>Main content</h1>
<code>position: absolute;<br/>
z-index: 4;</code>
<div class="box2 yellow">
<h1>Content box 2</h1>
<code>position: relative;<br/>
z-index: 1;</code>
</div>
<div class="box3 yellow">
<h1>Content box 3</h1>
<code>position: absolute;<br/>
z-index: 3;</code>
</div>
</main>
<footer class="site-footer green">
<h1>Footer</h1>
<code>position: relative;<br/>
z-index: 2;</code>
</footer>
.blue {background: hsla(190,81%,67%,0.8); color: #1c1c1c;}
.purple {background: hsla(261,100%,75%,0.8);}
.green {background: hsla(84,76%,53%,0.8); color: #1c1c1c;}
.yellow {background: hsla(61,59%,66%,0.8); color: #1c1c1c;}
.pink {background: hsla(329,58%,52%,0.8);}
header, footer, main, div {
position: relative;
border: 1px dashed #000;
}
h1 {
font: inherit;
font-weight: bold;
}
.site-header, .site-footer {
padding: 10px;
}
.site-header {
z-index: 5;
top: -30px;
margin-bottom: 210px;
}
.site-footer {
z-index: 2;
}
.site-content {
z-index: 4;
opacity: 1;
position: absolute;
top: 40px;
left: 180px;
width: 330px;
padding: 40px 20px 20px;
}
.box1 {
z-index: 6;
margin-bottom: 15px;
padding: 25px 10px 5px;
}
.box2 {
z-index: 1;
width: 400px;
margin-top: 15px;
padding: 5px 10px;
}
.box3 {
z-index: 3;
position: absolute;
top: 20px;
left: 180px;
width: 150px;
height: 250px;
padding-top: 125px;
text-align: center;
}
Здесь у нас есть header
footer
main
content
site-content
z-index
Давайте сначала рассмотрим три основных контейнера — header
footer
main
header
z-index
main
content
z index: 4
footer
z-index
main
z-index
Хорошо.
Вещи становятся немного запутанными с тремя коробками внутри main
Поле содержимого 1 имеет z-index
header
z-index
Поле содержимого 2 имеет z-index
footer
z-index
Так что же происходит?
Все это может быть объяснено тем фактом, что все значения z-index
Поскольку родительский контейнер .site-content
z-index
footer
.site-content
Хороший способ подумать о порядке размещения в контексте стекирования заключается в том, чтобы рассматривать его как вложенный элемент во вложенном упорядоченном списке.
Это можно записать следующим образом:
- Заголовок:
z-index: 5
- Главная:
z-index: 4
- Вставка 1:
z-index: 4.6
- Вставка 2:
z-index: 4.1
- Вставка 3:
z-index: 4.3
- Вставка 1:
- Нижний колонтитул:
z-index: 2
Таким образом, несмотря на то, что header
z-index: 5
content
z-index: 6
content
header
Сначала это немного сбивает с толку, но с практикой это начинает иметь смысл!
стратегия z-index
Я не хочу заканчивать сезон чем-то настолько сложным, поэтому давайте подведем итог простой стратегии, которую я использую для применения z-index
В примерах из этого видео мы использовали однозначные приращения для значений z-index
z-index: 3
z-index: 4
Вам придется изменить много значений — возможно, по всей базе кода, что может стать проблематичным и привести к взлому CSS в других частях сайта.
Мне нравится использовать шкалу z-index
z-index
z index: 53
Другое преимущество использования шкалы с коэффициентами, кратными 10, состоит в том, что если вам действительно нужно вставить новый элемент между двумя другими, есть 9 потенциальных значений, которые вы можете выбрать между 10 и 20, но ни одно из которых вы можете выбрать между 1 и 2.