- position : sticky
- Кратко
- Пример
- Как понять
- Как пишется
- Подсказки
- На практике
- Лена Райан советует
- Прилипающий блок CSS
- Почему не работает position: sticky;
- Высота элемента с position: sticky; равна высоте ближайшего родителя
- Достигнуто конечное положение
- У не прокручиваемого родителя, стоящего внутри прокручиваемого, определён overflow отличный от visible
- Все четыре свойства top , right , bottom , left имеют значение по умолчанию auto
- Примеры
- Как сделать плавающий блок на сайте: меню, баннер
- Как закрепить шапку HTML-таблицы
- Как расположить HTML-картинки в одну строку с прикрепляющимся слева описанием
- Три варианта фиксации элемента на сайте на CSS/jQuery
- Фиксация элемента на сайте на CSS
- Фиксация элемента на сайте при прокрутке страницы на jQuery
- Фиксация элемента на сайте при прокрутке страницы с остановкой в нужном месте на jQuery
position : sticky
Уникальное позиционирование, которое создаёт липкий элемент.
Время чтения: меньше 5 мин
Кратко
Скопировать ссылку «Кратко» Скопировано
Элемент с position : sticky «прилипает» к экрану при прокрутке, пока не встретится с границей родительского блока.
Пример
Скопировать ссылку «Пример» Скопировано
Сделаем «липкий» заголовок, а также «липкий» блок в правом нижнем углу для каждого из :
h1 position: sticky; top: 15px;> .squares__item:last-of-type position: sticky; bottom: 15px;>
h1 position: sticky; top: 15px; > .squares__item:last-of-type position: sticky; bottom: 15px; >
Как понять
Скопировать ссылку «Как понять» Скопировано
Блоки с «липким» позиционированием ведут себя как position : relative и position : fixed одновременно. Пока блок не достиг указанного расстояния от края окна браузера, он ведёт себя как относительно спозиционированный. Когда блок достигнет этой точки, то станет вести себя, как будто мы указали position : fixed . А когда он встретится с противоположным краем родителя, то снова будет вести себя, как position : relative .
Как пишется
Скопировать ссылку «Как пишется» Скопировано
.block position: sticky; top: 15px;>
.block position: sticky; top: 15px; >
Для блока, который должен быть «липко» позиционирован, указываем position : sticky и позицию относительно окна браузера. В этом примере блок «прилипнет» на расстоянии 15 пикселей от верхнего края окна.
Подсказки
Скопировать ссылку «Подсказки» Скопировано
💡 Если нужный элемент занимает всю высоту родительского блока (если он один в блоке или просто самый высокий среди соседних элементов), то position : sticky не сработает.
💡 При вертикальном скролле работают только свойства top и bottom , при горизонтальном — left и right . Или их логические аналоги inset .
💡 position : sticky можно указать внутри родителя с overflow : scroll или overflow : auto .
💡 Если элементу указать большее число пикселей, чем позволяет родитель, то элемент сразу встанет к противоположному краю родительского блока, но за пределы блока не выйдет.
На практике
Скопировать ссылку «На практике» Скопировано
Лена Райан советует
Скопировать ссылку «Лена Райан советует» Скопировано
🛠 С помощью такого позиционирования удобно делать закреплённую шапку — если она является непосредственным наследником body , то, указав шапке position : sticky , мы получим статичную шапку при загрузке экрана, а при скролле страницы — зафиксированную сверху.
Прилипающий блок CSS
Элемент с position: sticky; фиксируется в рамках ближайшего родителя, когда расстояние до границы ближайшего прокручиваемого родителя достигает указанного в свойствах top , right , bottom , left значения. На то, в каком месте элемент прикрепится и где отцепиться, также влияют свойства padding , margin и transform . Размещение элемента над другими элементами правится с помощью свойства z-index .
После того, как свойство position примет значение sticky , размер элемента не изменится, а соседние элементы не сдвинутся на освободившееся пространство.
Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — выше нижнего края ближайшего родителя.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Прилипну, сделав отступ в 2em от верхнего края окна браузера, когда верхний край окна браузера будет выше первоначального расположения верхнего края элемента не более чем на 2em, а нижний край элемента — выше нижнего края ближайшего родителя.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Прилипну, сделав отступ в -2em от верхнего края окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента на более чем на 2em, а нижний край элемента — выше нижнего края ближайшего родителя.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — выше нижнего края ближайшего родителя на более чем 2em.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — ниже нижнего края ближайшего родителя не более чем на 2em.
.raz < border: 1px solid red; >.sticky < position: sticky; top: -2em; margin-bottom: -2em; padding-top: 2em; > .sticky div 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Прилипну, сделав отступ в 2em от верхнего края окна браузера, когда верхний край окна браузера будет выше первоначального расположения верхнего края элемента не более чем на 2em, а нижний край элемента — ниже нижнего края ближайшего родителя не более чем на 2em.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — выше нижнего края ближайшего родителя на более чем 2em.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Прилипну к нижнему краю окна браузера, когда нижний край окна браузера будет ниже верхнего края ближайшего родителя, а нижний край элемента — выше своего первоначального расположения.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.raz < border: 1px solid red; >.sticky < position: sticky; top: 0; min-height: 2em; background: lightpink; >.relative 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.raz < border: 1px solid red; >.sticky < position: sticky; top: 0; z-index: 1; min-height: 2em; background: lightpink; > .relative 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
9
10
11
12
.raz < overflow: auto; /* добавить полосу прокрутки */ height: 10em; border: 1px solid red; > .sticky 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Почему не работает position: sticky;
Высота элемента с position: sticky; равна высоте ближайшего родителя
.raz < overflow: auto; height: 10em; border: 1px solid red; >.sticky 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Достигнуто конечное положение
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
У не прокручиваемого родителя, стоящего внутри прокручиваемого, определён overflow отличный от visible
.raz < overflow: auto; height: 10em; border: 1px solid red; >.sticky1
2
3 4
5
6
7
8
9
10
11
12
13
14
15
Все четыре свойства top , right , bottom , left имеют значение по умолчанию auto
.raz < overflow: auto; height: 10em; border: 1px solid red; >.sticky 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Примеры
Как сделать плавающий блок на сайте: меню, баннер
Название Основная часть
Как закрепить шапку HTML-таблицы
Как расположить HTML-картинки в одну строку с прикрепляющимся слева описанием
.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
Три варианта фиксации элемента на сайте на CSS/jQuery
Фиксирование элементов сейчас пользуется большой популярностью. Так, например, «Яндекс» или социальная сеть «ВКонтакте» (на момент написания статьи) фиксируют свое меню и поиск при прокрутке страницы. Вполне хорошее решение, позволяющее ограничить пользователя от лишних действий в получении доступа к нужному функционалу сайта и позволяющее сделать некий акцент на важных элементах.
Зафиксировать элемент на сайте можно несколькими способами, каждый из них хорош в своем случае.
Фиксация элемента на сайте на CSS
Самый простой вариант – это фиксация элемента на чистом CSS. Все, что вам нужно, это добавить следующие стили к элементу:
position: fixed; top: 0; left: 0; right: 0;
Положение в таком случае будет верхнее, по всей ширине экрана. Вариант отлично подходит для элементов, которые изначально находятся в самом верху (меню и поиск).
Если хотите поиграть с положением – измените значение свойств left, top, right и bottom соответственно.
Минусы – не подходит для элементов, находящихся ниже верхней границы сайта.
Здесь на помощь к нам приходит другое значение position – sticky. Оно фиксирует тот или иной элемент только в рамках первого родительского контейнера. Фиксация элемента при этом начнется тогда, когда верхняя граница элемента совпадет с верхней частью окна браузера, и завершится при достижении элементом конца родителя, при этом другие элементы (и даже окружаемый текст) не смещаются, что очень удобно в отдельно взятых случаях. Пример использования:
Эти стили вы присваиваете тому элементу, который хотите зафиксировать. Свойство top со значением «10px» говорит здесь о том, что при фиксации элемента необходимо сделать отступ от верхней границы в 10 пикселей.
Фиксация элемента на сайте при прокрутке страницы на jQuery
Этот вариант, в отличие от первого, фиксирует нужный вам элемент только тогда, когда его положение равняется верхней границе вашего экрана при прокрутке страницы.
«.fixed_block» здесь – это класс элемента, который нужно зафиксировать при прокрутке, а «.fixed_block_position» — класс обертки.
Их вы вставляете без изменений. Отличный вариант для фиксации рекламных блоков или других элементов находящихся не в первых рядах.
Фиксация элемента на сайте при прокрутке страницы с остановкой в нужном месте на jQuery
Этот вариант является доработкой вышеуказанного способа. Я много видел сайтов, где в сайдбаре (боковой колонке сайта) фиксируются различные рекламные блоки. Все бы ничего, но при прокрутке страницы до самого низа такие блоки перекрывают футер (низ сайта) и зачастую препятствуют получению немаловажной информации или навигации в нем.
Чтобы исправить этот конфуз и удержать блок при достижении указанной области, и существует этот вариант.
Ну и те же стили из второго варианта с небольшим дополнением:
На что здесь стоить обратить внимание?
«.fixed_block» – это элемент, который мы фиксируем при прокрутке. «.fixed_block_position» — класс обертки, а «.fixed_block_stop» – это элемент (граница), достигнув которую элемент остановит свое движение (фиксацию).