Как работает position: sticky;
Элемент с position: sticky; фиксируется в рамках ближайшего родителя, когда расстояние до границы ближайшего прокручиваемого родителя достигает указанного в свойствах top, right, bottom, left значения. На то, в каком месте элемент прикрепится и где отцепиться, также влияют свойства padding, margin и transform. Размещение элемента над другими элементами правится с помощью свойства z-index.
После того, как свойство position примет значение sticky, размер элемента не изменится, а соседние элементы не сдвинутся на освободившееся пространство.
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — выше нижнего края ближайшего родителя.
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Прилипну, сделав отступ в 2em от верхнего края окна браузера, когда верхний край окна браузера будет выше первоначального расположения верхнего края элемента не более чем на 2em, а нижний край элемента — выше нижнего края ближайшего родителя.
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
top: 2em;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Прилипну, сделав отступ в -2em от верхнего края окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента на более чем на 2em, а нижний край элемента — выше нижнего края ближайшего родителя.
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
top: -2em;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — выше нижнего края ближайшего родителя на более чем 2em.
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
margin: 2em;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — ниже нижнего края ближайшего родителя не более чем на 2em.
5
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
top: -2em;
margin-bottom: -2em;
padding-top: 2em;
}
.sticky div {
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div style="margin-bottom: -2em;"></div>
<div class="sticky">
<div></div>
</div>
<div style="margin-top: 2em;"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Прилипну, сделав отступ в 2em от верхнего края окна браузера, когда верхний край окна браузера будет выше первоначального расположения верхнего края элемента не более чем на 2em, а нижний край элемента — ниже нижнего края ближайшего родителя не более чем на 2em.
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
transform: translate(0, 2em);
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — выше нижнего края ближайшего родителя на более чем 2em.
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
padding: 2em;
}
.sticky {
position: sticky;
top: 0;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
14
15
2
3
4
5
6
7
8
9
10
11
12
Прилипну к нижнему краю окна браузера, когда нижний край окна браузера будет ниже верхнего края ближайшего родителя, а нижний край элемента — выше своего первоначального расположения.
1314
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
bottom: 0;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
<div class="sticky"></div>
13<br>
14<br>
15<br>
</div>
1
2
3
4
5
6
7
9
10
11
12
13
14
15
2
3
4
5
6
7
Прилипну то к нижнему краю окна браузера, то к верхнему
89
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
bottom: 0; /* не рекомендуется для высоких элементов, так как на коротких устройствах он загородит собой информацию родителя */
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
4<br>
5<br>
6<br>
7<br>
<div class="sticky"></div>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Буду показан под зелёным блоком.
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
min-height: 2em;
background: lightpink;
}
.relative {
position: relative;
min-height: 6em;
background: green;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
<div class="relative"></div>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Буду показан над зелёным блоком.
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
z-index: 1;
min-height: 2em;
background: lightpink;
}
.relative {
position: relative;
min-height: 6em;
background: green;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
<div class="relative"></div>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
2
3
Cправа
5
6
7
8
9
10
11
12
<style>
.raz {
position: relative;
margin-right: 4em;
border: 1px solid red;
}
.absolute {
position: absolute;
top: 0;
bottom: 0;
left: 100%;
visibility: hidden;
}
.sticky {
position: sticky;
top: 0;
min-height: 2em;
visibility: visible;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="absolute">
<div class="sticky"></div>
</div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
</div>
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Прилипну внутри блока, который можно проскроллить, а не к краю окна браузера
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
overflow: auto; /* добавить полосу прокрутки */
height: 10em;
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
Почему не работает position: sticky;
Высота элемента с position: sticky; равна высоте ближайшего родителя
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
Не прилипну
5
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
overflow: auto;
height: 10em;
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div>
<div class="sticky"></div>
</div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
Достигнуто конечное положение
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Не прилипну
<style>
.raz {
overflow: auto;
height: 10em;
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
<div class="sticky"></div>
</div>
У не прокручиваемого родителя, стоящего внутри прокручиваемого, определён overflow отличный от visible
1
2
3
2
3
<style>
.raz {
overflow: auto;
height: 10em;
border: 1px solid red;
}
.sticky {
position: sticky;
top: 0;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3
<div style="overflow: hidden;">
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
</div>
Все четыре свойства top, right, bottom, left имеют значение по умолчанию auto
1
2
3
5
6
7
8
9
10
11
12
13
14
15
2
3
Не прилипну
45
6
7
8
9
10
11
12
13
14
15
<style>
.raz {
overflow: auto;
height: 10em;
border: 1px solid red;
}
.sticky {
position: sticky;
min-height: 2em;
background: lightpink;
}
</style>
<div class="raz">
1<br>
2<br>
3<br>
<div class="sticky"></div>
4<br>
5<br>
6<br>
7<br>
8<br>
9<br>
10<br>
11<br>
12<br>
13<br>
14<br>
15<br>
</div>
Примеры
Как сделать плавающий блок на сайте: меню, баннер
<style>
header, nav, article, aside, footer {
border: 1px solid gray;
}
header, nav, article, aside {
margin-bottom: 1em;
}
article, footer {
min-height: 100vh;
}
aside {
min-height: 20vh;
}
@supports (display: grid) {
@media (min-width: 20em) {
body {
display: grid;
grid-template-columns: 1fr minmax(0, 40em) 1em minmax(0, 15em) 1fr;
grid-template-rows: repeat(3, auto 1em) 1fr 1em auto;
}
header, nav, article, aside {
margin: 0;
}
header, footer, nav {
grid-column: 2/5;
}
nav {
grid-row: 3/4;
}
article {
grid-column: 2/3;
grid-row: 5/8;
}
[id^="right"] {
grid-column: 4/5;
}
#right1 {
grid-row: 5/6;
}
#right2 {
grid-row: 7/8;
}
.sticky {
position: sticky;
top: 0;
}
footer {
grid-row: 9/10;
}
}
}
</style>
<header>Название</header>
<nav>Меню</nav>
<article>Основная часть</article>
<div id="right2">
<aside class="sticky">Прилипающая часть</aside>
</div>
<aside id="right1">Вспомогательная часть</aside>
<footer>Подвал</footer>
Как закрепить шапку HTML-таблицы
| Заголовок | Заголовок | Заголовок |
|---|---|---|
| Ячейка | Ячейка | Ячейка |
| Ячейка | Ячейка | Ячейка |
| Ячейка | Ячейка | Ячейка |
| Ячейка | Ячейка | Ячейка |
<style>
.raz {
border: 1px solid red;
}
.raz th {
position: sticky;
top: 0;
background: lightpink;
}
</style>
<table class="raz">
<caption>Название таблицы</caption>
<thead>
<tr>
<th>Заголовок
<th>Заголовок
<th>Заголовок
<tbody>
<tr>
<td>Ячейка
<td>Ячейка
<td>Ячейка
<tr>
<td>Ячейка
<td>Ячейка
<td>Ячейка
<tr>
<td>Ячейка
<td>Ячейка
<td>Ячейка
<tr>
<td>Ячейка
<td>Ячейка
<td>Ячейка
</table>
Как расположить HTML-картинки в одну строку с прикрепляющимся слева описанием
<style>
.raz {
overflow: auto;
border: 1px solid red;
white-space: nowrap; /* не переносить на другую строку inline-элемент */
}
.raz figure {
display: inline-flex;
margin: 0;
}
.raz figcaption {
position: sticky;
left: 0;
/* для IE */
writing-mode: tb-rl;
/* для Mozilla Firefox */
width: 1em;
padding: 1em;
line-height: 1;
writing-mode: vertical-rl; /* перевернуть текст */
text-align: center; /* выравнять текст по середине */
background: rgba(255,255,255,.9);
}
.raz img {
height: 300px;
}
</style>
<div class="raz">
<figure>
<figcaption>Поле ромашек</figcaption>
<img src="http://2.bp.blogspot.com/-mvoZS1oSdK8/TktsiBc4voI/AAAAAAAACLQ/MKaAYSFJvlo/s450/romashki.jpg" alt="Поле ромашек">
</figure><figure>
<figcaption>Отражение котёнка</figcaption>
<img src="http://4.bp.blogspot.com/-uXTQrdgmR5A/TVOtm4AfAzI/AAAAAAAABcA/ZPY0DjhgY0o/s300/mechty.jpg" alt="Отражение котёнка">
</figure><figure>
<figcaption>Медвежата у реки</figcaption>
<img src="http://img-fotki.yandex.ru/get/4414/63641203.16/0_6c04a_2e684832_M" alt="Медвежата у реки">
</figure><figure>
<figcaption>Весёлый паровозик</figcaption>
<img src="http://4.bp.blogspot.com/-Nq5KPM8uNjk/UFbSS3v0Z5I/AAAAAAAADNQ/3MxRKB-jfqo/s390/parovozik.jpg" alt="Весёлый паровозик">
</figure>
</figure><figure>
<figcaption>Планета Земля</figcaption>
<img src="http://4.bp.blogspot.com/-nPTLkC1HEzU/UyhFH_hLSzI/AAAAAAAAERU/NvtlJ8yKYRk/s400/planeta.jpg" alt="Планета Земля">
</figure>
</div>