Перейти к содержимому

Как сделать чтобы header двигался при прокрутке

  • автор:

Прилипающий блок CSS

Элемент с position: sticky; фиксируется в рамках ближайшего родителя, когда расстояние до границы ближайшего прокручиваемого родителя достигает указанного в свойствах top , right , bottom , left значения. На то, в каком месте элемент прикрепится и где отцепиться, также влияют свойства padding , margin и transform . Размещение элемента над другими элементами правится с помощью свойства z-index .

После того, как свойство position примет значение sticky , размер элемента не изменится, а соседние элементы не сдвинутся на освободившееся пространство.

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

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

Прилипну, сделав отступ в 2em от верхнего края окна браузера, когда верхний край окна браузера будет выше первоначального расположения верхнего края элемента не более чем на 2em, а нижний край элемента — выше нижнего края ближайшего родителя.

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

Прилипну, сделав отступ в -2em от верхнего края окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента на более чем на 2em, а нижний край элемента — выше нижнего края ближайшего родителя.

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

Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — выше нижнего края ближайшего родителя на более чем 2em.

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

Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — ниже нижнего края ближайшего родителя не более чем на 2em.

4
5
6
7
8
9
10
11
12
13
14
15

 .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.

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

Прилипну к верхнему краю окна браузера, когда верхний край окна браузера будет ниже первоначального расположения верхнего края элемента, а нижний край элемента — выше нижнего края ближайшего родителя на более чем 2em.

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

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

  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

Буду показан под зелёным блоком.
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

Буду показан над зелёным блоком.
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

4
5
6
7
8
9
10
11
12

  1 
2
3
4
5
6
7
8
9
10
11
12

Прилипну внутри блока, который можно проскроллить, а не к краю окна браузера
4
5
6
7
8
9
10
11
12
13
14
15

 .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; равна высоте ближайшего родителя

Не прилипну
4
5
6
7
8
9
10
11
12
13
14
15

 .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
Не прилипну

  1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15

У не прокручиваемого родителя, стоящего внутри прокручиваемого, определён overflow отличный от visible

Не прилипну
4
5
6
7
8
9
10
11
12
13
14
15

 .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

Все четыре свойства top , right , bottom , left имеют значение по умолчанию auto

Не прилипну
4
5
6
7
8
9
10
11
12
13
14
15

 .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 
Поле ромашек
Поле ромашек
Отражение котёнка
Отражение котёнка
Медвежата у реки
Медвежата у реки
Весёлый паровозик
Весёлый паровозик
Планета Земля
Планета Земля

Как закрепить блок при прокрутке страницы

Блок со свойством position: sticky; при прокрутке страницы закрепляется относительно окна браузера опираясь на заданные значения top и/или left , при этом взаимодействует с другими элементами и закрепляется только тогда, когда родительский блок находится в отображаемом окне браузера и закрепленному элементу достаточно места в родительском блоке

Важно понять что для элемента с position: sticky; необходим родительский элемент, у которого будет свободное пространство для закрепленного элемента, если этого пространства нет, то блок со свойством position: sticky; будет вести себя как при position: static; установленном по-умолчанию для всех элементов

Еще раз для наглядности:

 
Lorem ipsum dolor sit amet, consectetur.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur quos veritatis distinctio est ipsam repudiandae vel totam asperiores quas! Debitis quam voluptate fuga iure ut deleniti, illum laborum quaerat aut.
.sticky__half < width: 50%; min-height: 800px; border: 10px solid #000; >.sticky__body
  1. Блоку заданы свойства position: sticky; и top: 100px;
  2. Блок находится в родительском блоке
  3. Высота блока меньше высоты родительского блока

В итоге, при прокрутке страницы, как только блок достигает расстояние 100px от верха окна браузера, закрепляется. Пока родительский блок находится в пределах отображаемого окна браузера и блоку достаточно места, он будет закреплен, как только места становится недостаточно, то блок открепляется от указанных 100px от верха окна браузера и прокручивается выше вместе с родительским блоком

Отличие от position: fixed;

При position: fixed; элемент никак не взаимодействует с другими элементами, он позиционируется относительно окна браузера отдельно от остальных элементов

Свойство position: fixed; полезно если элемент всегда должен находится в пределах окна браузера и не должен взаимодействовать с другими элементами, например, при верстке кнопки “Наверх” для возврата к началу страницы, которую обычно располагают справа внизу относительно окна браузера — она всегда видна и не затрагивает остальные элементы

Как закрепить шапку сайта

  
Sticky
.header < position: -webkit-sticky; position: sticky /* Закрепляем элемент */; top: 0 /* Указывем на каком расстоянии от верха браузера будет крепиться шапка сайта */; >

Блоку добавляем свойство position: sticky; и top: 0; . Родительским элемент для блока является , поэтому при прокрутке страницы блок закрепляется к самому верху окна браузера, пока body будет оставаться в пределах отображаемого окна браузера, а так как основной родительский элемент для всей страницы, то блок будет всегда закреплен к верху окна браузера

Если будем закрелять шапку сайта свойством position: fixed; , то шапка сайта не будет взаимодействовать с другими элементами и следующие за шапкой элементы будут перекрыты шапкой или шапка будет перекрыта следующими элементами в зависимости от z-index .

Свойство position: sticky; поддерживается во всех браузерах, кроме Internet Explorer. В Internet Explorer верстка не ломается, просто элементы остаются по умолчанию position: static; и будут прокручиваться не закрепляясь, поэтому можно использовать данный прием в проектах.

Ссылка на документацию по position — MDN web docs

Как зафиксировать слой, чтобы он оставался на одном месте при прокрутке страницы?

Задать положение блочного элемента, чтобы он всегда оставался на одном месте при прокрутке страницы.

Решение

«Замораживание» элемента в определённом месте веб-страницы происходит с помощью стилевого свойства position со значением fixed . При этом положение элемента не меняется даже при прокрутке страницы с помощью скроллинга. Сами координаты задаются через свойства left , right , top и bottom , которые соответственно определяют положение от левого, правого, верхнего и нижнего края окна браузера (пример 1).

Пример 1. Использование position

HTML5 CSS 2.1 IE Cr Op Sa Fx

    Фиксированное меню .menu < position: fixed; /* Фиксированное положение */ right: 10px; /* Расстояние от правого края окна браузера */ top: 20%; /* Расстояние сверху */ padding: 10px; /* Поля вокруг текста */ background: #ffe; /* Цвет фона */ border: 1px solid #333; /* Параметры рамки */ >.text   

Результат данного примера показан на рис. 1. Обратите внимание, что положение элемента не меняется при прокрутке страницы вниз.

Положение блока с меню

Рис. 1. Положение блока с меню

Как закрепить шапку сайта при скролле страницы

Привет, друзья. Сегодня поговорим о том, как закрепить шапку сайта при прокрутке страницы. Наверняка вы все видели такой эффект, когда шапка сначала выглядит статичной, но когда вы начинаете изучать сайт и скролить, то она фиксируется в верхней части экрана и не покидает поле зрения.

При этом она может немного видоизменяться, меняя размер, цвет и содержимое. Давайте реализуем этот эффект, за который меня уже много лет «костерят» в комментариях из-за того, что тема раскрыта неполностью и исправим это недоразумение.

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

Давайте начнем с того, что напишем какую-то стандартную разметку шапки, подключим jQuery, чтобы легче было манипулировать javascript и добавим скрипт, в котором и будем управлять состоянием и положением шапки.

Вот структура моего проекта.

HTML разметка шапки

Для примера я придумал такую структуру.

 
+38(095) 126-73-33

Мобильный
+38(095) 126-72-32

Многоканальный

Слева логотип, название сайта и его описание, а справа контактные телефоны, кнопка обратного звонка и кнопка меню. Типичная разметка для многих сайтов.

Дабавим немного стилей и получим такой внешний вид.

Пока, тут нет никаких особенностей. Это обычная шапка без дополнительных эффектов.

Исходник для изучения разметки, стилей и кода, как обычно, в конце статьи.

Теперь давайте подключим перед закрывающим тегом «body» jQuery и скрипт, в котором и будем писать js-код для управления состоянием и положением шапки.

Итак, давайте начнем с простейшего, добьемся того, чтобы шапка принимала статическое положение и перекрывала контент, который должен находится под ней.

Чтобы это сделать, у нас есть несколько подходов. Первый заключается в том, чтобы при прокрутке добавить шапке определенный класс, с новыми стилями, а второй в том, чтобы добавлять и удалять их прямо в js. Я считаю, что основные манипуляции с CSS нужно делать в таблице стилей, поэтому пойду первым путем, но для этого нужно показать стили шапки, которые я задал, чтобы вы лучше понимали, что происходит. Вот они.

.header < width: 100%; background: #fff; padding: 15px 0; z-index: 100; -webkit-box-shadow: 0 5px 25px rgba(0, 0, 0, 0.15); box-shadow: 0 5px 25px rgba(0, 0, 0, 0.15); >.header__inner

Так выглядят стили для обертки шапки и блок с ее содержимым. За счет такой структуры мы легко сделаем шапку фиксированной, а ее содержимое продолжит оставаться в центре на любом устройстве.

Как я уже говорил, для того чтобы «header» стал фиксированным при прокрутке, ему нужно поменять позиционирование на «fixed». Для этого, при помощи метода «scrollTop()» мы проверим значение прокрутки в окне браузера и в нужный момент добавим шапке класс, в котором и изменим позиционирование.

Звучит страшнее чем кажется. На самом деле все достаточно просто. Давайте в таблицу стилей добавим класс, при помощи которого шапка будет получать position: fixed.

.header_fixed

Обратите внимание, что z-index для того, чтобы при позиционировании шапка была над остальными элементами, я задал непосредственно классу header немного ранее.

Теперь давайте перейдем к написанию скрипта. Открывайте файл scripts.js и добавьте следующий код.

$(function() < let header = $('.header'); $(window).scroll(function() < if($(this).scrollTop() >1) < header.addClass('header_fixed'); >else < header.removeClass('header_fixed'); >>); >);

Здесь мы создаем переменную header и присваиваем ей наш элемент, в котором расположена шапка, чтобы было легче и удобнее им манипулировать. Затем пишем функцию, которая следит за прокруткой, и если мы прокрутили больше чем на 1 пиксели от начала окна браузера, то элементу с классом header добавляем недавно созданный класс «header_fixed», который и фиксирует шапку в верхней области экрана.

Начало положено. Теперь шапка при прокрутке ведет себя так, как нам нужно было и успешно фиксируется. Но мне не нравится рывок, который заметен, когда мы меняем позиционирование. Попробуйте покрутить.

Давайте исправим это. Происходи такое резкое смещение из-за того, что шапка занимала 90 пикселей и, соответственно, смещала контент вниз на 90 писклей, а когда мы прокрутили, мы вырвали из общего потока этот элемент и все сдвигается на его высоту. Чтобы этого избежать, предлагаю body, во время того, как шапка становиться фиксированной, дать отступ в 90 пикселей, которые мы теряем. Только я не буду топорно зашивать эту высоту в скрипт, а автоматический вычислю ее высоту и буду использовать это значение в вычислениях.

Опять же звучит страшно и заумно, но посмотрите, как все просто.

$(function() < let header = $('.header'); let hederHeight = header.height(); // вычисляем высоту шапки $(window).scroll(function() < if($(this).scrollTop() >1) < header.addClass('header_fixed'); $('body').css(< 'paddingTop': hederHeight+'px' // делаем отступ у body, равный высоте шапки >); > else < header.removeClass('header_fixed'); $('body').css(< 'paddingTop': 0 // удаляю отступ у body, равный высоте шапки >) > >); >);

В 3 строке я получаю число с высотой шапки. На 8 строке, добавлю отступ тегу body, равный высоте шапки, чтобы скомпенсировать ее, в тот момент, когда мы вырываем из общего потока шапку и минеям ей позиционирование.

Когда прокручиваем страницу обратно, и скрипт удаляет класс header_fixed, я также удалю и, теперь, лишний отступ у тега body.

Надеюсь, понятно объяснил и теперь у вас нет никакого рывка, при скролле, а шапка плавно фиксируется и позиционируется в верхней области экрана.

Изменение высоты шапки и цвета

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

Наверное, вы догадались уже, что никакой магии тут нет и делается все аналогично тому, как мы уже это проделали выше. Просто выбираем расстояние от верхней точки окна браузера, на котором должен произойти тот или иной эффект и добавляем или удалим класс, отвечающий за этот эффект.

Но давайте на этот раз я не буду задавать отдельный класс, а покажу как изменить стили прямо в js. Итак, задача при прокрутке на 300 пикселей при помощи jQuery плавно изменить высоту шапки и ее цвет.

if($(this).scrollTop() > 300) < header.css(< 'padding': '5px 0', 'background': '#f6ffdb', 'transition': '.3s' >); > else < header.css(< 'padding': '15px 0', 'background': '#ffffff', 'transition': '.3s' >); >

Как видите, благодаря методу «.css» можно манипулировать стилями прямо из jQuery. Отступ был по 15 пикселей сверху и снизу, а я заменил его на 5, за счет чего шапка стала меньше на 20 пикселей. Цвет сделал бледно желтым, а при помощи свойства transition сделал эффект перехода из одного состояния в другое более плавным.

Как удалить/скрыть элемент из шапки при прокрутке страницы

Этот вопрос мне также периодически задавали в соцсетях, поэтому решил вынести его в отдельный пункт. Наверняка вы уже догадались, если дочитали статью до этого момента. Ничего нового, увы, тут не будет. Все также, как выше. Получим id или class элемента и добавим ему свойства для скрытия. Например «display: none» в простейшем случае.

Для примера давайте скроем один из номеров телефонов. Это будет сложнее, так как у обоих номеров одинаковый класс. Напомню, блок с контактами у меня выглядит так:

+38(095) 126-73-33

Мобильный
+38(095) 126-72-32

Многоканальный

Теперь давайте в js напишем код, отвечающий за скрытие одного из номеров. Пусть это событие случается, когда мы прокрутили окно на 500 пикселей, но давайте, чтобы не повторятся, будем не просто стили менять или классом манипулировать, а воспользуемся методами fadeIn|fadeOut для плавного скрытия и появления элемента.

let mobileTel = $(‘.header__tel’).first(); // сохранем в переменную первый элемент с классом header__tel if($(this).scrollTop() > 500) < mobileTel.fadeOut(); >else

Вот, что мы получили:

Вот такой, достаточно простой эфеект получился. Надеюсь, все основные нюансы по закреплению шапки учел. Если будут еще какие-то вопросы, задавайте в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *