Автор оригинала: 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. Новые свойства, как Должность: липкий и Указатели-события Позволяет нам создать лучший опыт для конечного пользователя легче и отрожденно. И поддержка становится все лучше и лучше каждый день. 🏆.