Рубрики
Без рубрики

Создание анимированного липкого заголовка с пользовательским смещением

С появлением `Position: Sticky`, мы могли бы создавать липкие элементы без плагинов JavaScript. Но создание липких элементов с анимацией не может быть достигнуто без небольшого количества JavaScript.

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