зачем писать эту статью
Sticky
Это не новое знание Причина написания этой статьи в том, что в процессе реализации эффекта в последнее время я обнаружил, что меня не интересуетSticky
Понимание предвзятое, а результаты выполнения кода не такие, как ожидалось. Решил написать статью для повторного изучения.
что липкое
Sticky
(MDN переводится как липкий эффект) даCSS
Атрибутыposition
Необязательное значение в . Используйте больше вместе с намиstatic
, fixed
,relative
,absolute
Например, используется для описания того, как элемент позиционируется.
С точки зрения эффекта,Sticky
Как гибрид, до того, как страница скользит к «точке перескакивания», она ведет себя какrelative
, когда он достигает «критической точки», он ведет себя какfixed
.
как использовать
использоватьCSS Sticky
Требуются только два условия.
position: sticky;
top: 0; // right/bottom/left 任一有效值,甚至可以为负像素值
top:0
Это означает, что когда элемент перемещается на 0 пикселей из окна просмотра, а затем продолжает двигаться, элемент закрывается. допустимыйздесьПосмотрите на эффект (попробуйте изменить верхнее значение)
Сравните реализации JS
нетCSS Sticky
Ранее аналогичные эффекты достигались с помощью JS. Общие шаги таковы:
- Слушайте события прокрутки и вычисляйте расстояние целевого элемента от области просмотра.
- Когда расстояние не соответствует условиям, держите пешки и не двигайтесь.
- Когда расстояние удовлетворяет условию, создайте элемент-заполнитель и измените метод позиционирования целевого элемента как
fixed
.
window.addEventListener('scroll', () => {
const rect = elem.getBoundingClientRect();
// 计算目标元素和视口的距离
})
Поищите по ключевому слову sticky в npm, там доступно много отличных пакетов. кreact-stickyНапример, при выполнении условия будет созданplaceholder
элементов (для предотвращения дрожания страницы), позволяяheader
позиционируется какfixed
.
правильноChrome Dev-Tools
изlayers
панель, сгенерирована синяя частьplaceholder
.
Сравнение двух схем на графике пламени (для увеличения эффекта ставлюcpu
в 6 раз медленнее)
CSS-схема
использоватьCSS Sticky
, работа сданаGPU
, не заниматьJS
Ресурсы основного потока очень плавно работают на мобильном терминале.
React Sticky
из-за необходимостиscroll event
Вызывается непрерывно в обратном вызовеgetBoundingClientRect
,а такжеgetBoundingClientRect
Это вызовет перестановку страниц и перерисовку, а кадр упадет и зависнет, если вы не будете осторожны. Как раз для достижения такого эффекта (отсутствие другого контента на странице) очень рентабельно пойти на войну.
Вывод: добитьсяSticky
эффект, желательноCSS Sticky
непонимание
1. Действует только внутри содержащего блока.
Исправлятьпример, используйте div, чтобы поместитьSticky Header
завернули и нашлиSticky
Эффект недействителен! ! !
...
<div class="wrapper">
<header>Sticky Header</header>
</div>
...
Согласно документации,Sticky
Эффект толькоContaining Blockдействует внутри,Containing Block
При скольжении по экрануStickey Element
Тоже ускользнул.
Исправлятьwrapper
высота, чтобы увидеть эффект.
.wrapper {
height: 100px;
background-color: #e6e6e6;
}
несколькоSticky Element
Помещение его в один кусок будет иметь особый эффект, что предыдущий вытесняется последним.На самом деле он не вытесняется, аContaining Block
утащить его.
2. Переполнение влияет на Sticky
Исправлятьпримеркод в , давая#root
плюсoverflow: auto
#root {
overflow: auto;
}
Sticky
Эффект опять пропал(overflow
установить на другойvisible
Эффективное значение , также имеет тот же эффект. )
После прочтения большого количества связанных документов мой вывод таков:
Sticky Element
Значение смещения основано наnearest scrolling ancestor
(расстояние до ближайшего предка прокрутки), если нет подходящего предка, в качестве ссылки используется область просмотра.
проблема вoverflow-x
илиoverflow-y
любой из не-visible
Он считается искомым элементом, и в процессе прокрутки окнаSticky Element
и найденный целевой предковый элементoffset
Значение не изменилось, поэтомуSticky
не работает.
Назначьте правильное лекарство, чтобы прокрутка происходила в элементе-предке, который «несоответствует» и может быть восстановленSticky Effect
.
#root {
overflow: auto;
height: 100vh;
}
совместимость
считатьprefixed
,токcss sticky
Совместимость на мобильном терминале достигает 94,14%, если вашему бизнесу необходимо позаботиться об оставшихся 5,86% пользователей, вы также можете использовать его.polyfillилиposition: fixed
.