Автор оригинала: Silvestar Bistrović.
Липкие элементы используются все по всей сети. С появлением Должность: липкий
Свойство, мы могли бы создавать липкие элементы без плагинов JavaScript. Но создание липких элементов с анимацией не может быть достигнуто без небольшого количества JavaScript.
Технические характеристики
Задача состоит в том, чтобы построить липкий заголовок, который появляется, когда пользователь прокручивается мимо статического заголовка или на пользовательском положении смещения. При прокрутке вниз статический заголовок должен оставаться на своем месте, а липкий заголовок должен свернуть. При прокрутке вверх, липкий заголовок должен исчезнуть, а статический заголовок должен свернуть. Обратите внимание, что содержание статического заголовка и липкого заголовка отличается.
Решение
Чтобы облегчить понять спецификации, см. Эту ручку, которая содержит полное решение:
Пробоя
Для лучшего понимания того, как работает этот код, мы должны изучить структуру HTML.
HTML
Вот упрощенный превью структуры HTML:
.........
Внутри Главная
Элемент, у нас есть Заголовок,
.fake-header
и Статья
элементы. Сделать Должность: липкий
Работа, липкий элемент должен быть внутри прокручиваемого элемента – Главная
элемент в нашем случае.
Заголовок держит два элемента:
.Header - Альфа
статический заголовок и. Генер - бета
, липкий заголовок.
CSS.
Во-первых, давайте стиль нашего элемента обертки. Он должен иметь позицию относительно по умолчанию, а липкий, как только смещение достигнуто.
header { top: 0; position: relative; overflow: hidden; } header.sticky { position: sticky; }
Недвижимость Вершина: 0
удостоверился бы, что наш заголовок застрял до вершины, а также о себе Переполнение: скрыто
скрывает все за пределами Заголовок
элемент.
Далее мы должны определить поведение частей заголовка.
.header--alpha { transition: .225s ease-out; } .sticky .header--alpha { opacity: .5; transform: translateY(-100%); transition: none; }
.Header - Альфа
Наш статический заголовок виден по умолчанию. Когда пользователь прокручивает мимо смещения, и обертка Заголовок
Элемент становится липким, он будет переведен вне элемента обертки, мгновенно без какого-либо эффекта перехода. Обратите внимание, что элемент будет переходить, когда он отправляется в исходное положение, когда наступающий эффект не будет активным.
.header--beta { position: absolute; top: 0; left: 0; right: 0; opacity: .5; transform: translateY(-100%); } .sticky .header--beta { opacity: 1; transform: translateY(0); transition: .35s ease-out; }
. Генер - бета
Наш липкий заголовок расположен абсолютно и переведен за пределы обертки Заголовок
элемент. Когда липкий эффект активирован, он будет переведен и переходить в исходное положение.
Javascript
Возможно, вы заметили .fake-header
элемент.
.fake-header { height: 1px; position: relative; }
Этот элемент служит смещением для прокрутки. Когда он достигает верхней части просмотра просмотра, заголовок становится липким. И когда заголовок становится липким, поддельный элемент будет подталкиваться по высоте заголовка плюс один дополнительный пиксель. Когда пользователь прокручивается и достигает поддельного элемента в своей новой позиции, липкий эффект будет выключен.
const $realSticky = document.querySelector("header"); const $fakeSticky = document.querySelector(".fake-header"); const stickyHeader = () => function() { const sr1 = $fakeSticky.getBoundingClientRect(); const sr2 = $realSticky.getBoundingClientRect(); if (sr1.top > 0) { $realSticky.classList.remove("sticky"); $fakeSticky.style.top = 0; } else { $realSticky.classList.add("sticky"); $fakeSticky.style.top = `-${sr2.height + 1}px`; } }; window.addEventListener("scroll", _.debounce(stickyHeader(), 15));
В этом примере Лодш Дебаз Функция используется для выполнения задачи на событии прокрутки.
Я знаю, что я могу написать лучше код JS и избегать добавления .fake-header Элемент, но я хотел создать демонстрацию без слишком много расчетов.
Поскольку статический заголовок определяет высоту элемента обертки, у нас есть проблема с выбором или нажимающим на контент сразу после того, как его появится.
Мы могли бы использовать указатели-события, чтобы исправить эту проблему:
header { pointer-events: none; } .header { pointer-events: all; }
Сначала мы бы настроим Указатели-события
к Нет
к Заголовок
Элемент для отключения событий Click/Hover, а затем мы бы установили Указатели-события
к Все
снова подрезать их.
Заключение
Вы могли видеть полную демонстрацию На моем кодепене Отказ
Это демонстрация использует Должность: липкий
и Указатели-события
Свойства, которые имеют ограниченную поддержку.
Я действительно взволнован, чтобы увидеть, как быстро движется CSS. Новые свойства, как Должность: липкий
и Указатели-события
Позволяет нам создать лучший опыт для конечного пользователя легче и отрожденно. И поддержка становится все лучше и лучше каждый день. 🏆.