Это простые, но важные советы по работе с поведением прокрутки на современных веб-страницах.
1. Как правильно отключить прокрутку для модального окна
Короче говоря, я обнаружил, что лучший способ заморозить прокрутку — это не через событие onScroll, а через переполнение: скрытый и прокрутка вручную до нужного места. Это полезно с модальными окнами и т.п.
Например, в модальном окне в событии, вызванном кнопкой, открывающей модальное окно:
function onModalOpen(event){ document.body.style.overflow="hidden";
window.frozenScrollCoords = { x: window.pageXOffset, y: window.pageYOffset }; }
Затем, когда модальное окно закрывается, событие должно снова сделать страницу прокручиваемой и убедиться, что координаты прокрутки такие же, какими они были до запуска модального окна:
function onModalClose(event){
document.body.style.overflow="scroll";
window.scrollTo(window.frozenScrollCoords.x, window.frozenScrollCoords.y);
window.frozenScrollCoords = {x:0, y:0};
}
2. Плавное изменение стиля на панели навигации при прокрутке одностраничного веб-сайта.
Я также обнаружил, что лучший способ справиться с триггерами стилей CSS для событий прокрутки — сделать их разными значениями для включения и выключения, чтобы избежать такого уродливого дрожащего поведения:
Это касается любого модного стиля навигационной панели, особенно на одностраничных сайтах.
Сначала мы добавляем прослушиватель событий для прокрутки:
document.addEventListener('scroll', debounce(storeScroll), { passive: true });
Затем мы активируем атрибут данных, используемый для стилизации нашей панели навигации в зависимости от того, находимся ли мы в верхней части страницы или нет:
const storeScroll = () => {
const header = document.getElementsByTagName("header")[0];
if(window.scrollY > header.offsetHeight/2.0)
{
header.setAttribute("data-isTop", false);
} else if (window.scrollY < 10)
{
header.setAttribute("data-isTop", true);
}
};
Обратите внимание, как атрибут данных включается и выключается на основе двух разных значений: это действительно важно, иначе вы застрянете между двумя стилями.
Теперь работает корректно:
Первоначально опубликовано на https://aglaiafeli.dev 19 июня 2020 г.