Headroom.js
Скройте ваш Header до тех пор пока он не нужен.
Скачать
Замечание: указанные размеры после сжатия gzip.
Что это вообще такое?
Headroom.js это легкий высокопроизводительный JS виджет (без зависимостей), который позволяет реагировать на прокрутку страницы пользователем. Живой пример это шапка на этой странице. Шапка скрывается при прокрутке вниз и появляется снова при прокрутке страницы вверх.
Зачем мне это использовать?
Фиксированные хедеры довольно популярный подход способствующий быстрому доступу пользователей к меню сайта, контактной информации фирмы и т.п. Это позволит ускорить навигацию пользователя по сайту. Но у этого подхода есть ряд проблем.
Большие экраны обычно имеют альбомную ориентацию, то есть имеют меньше пространства по высоте, чем по ширине. А фиксированные шапки могут содержать довольно много контента и занимать значительную область видимости. На маленьких экранах как правило преобладает вертикальная ориентация, где за счет размеров самого экрана и не правильной деградации контента в шапке также происходит то, что на половину экрана мы видим шапку, а контент занимает другую половину.
Headroom.js позволит вам скрывать шапки при прокрутке страницы вниз, позволяя сконцентрировать внимание на контенте. При этом как только потребуется доступ к навигации, то достаточно начать прокручивать страницу вверх, как тутже отобразится наша скрытая шапка.
Как это работает?
headroom.js по сути просто добавляет и удаляет CSS классы у элемента в ответ на событие скролла:
<!-- инициализация -->
<header class="headroom">
<!-- прокрутка вниз -->
<header class="headroom headroom--unpinned">
<!-- прокрутка вверх -->
<header class="headroom headroom--pinned">
Опираясь на CSS классы headroom.js вы получаете невероятную гибкость. Выбор того, что делать при прокрутке вниз или вверх теперь полностью принадлежит вам - нужно лишь прописать необходимые CSS свойства в файле стилей.
Использование
Всё очень просто. Это чистое JS API, плюс опционально плагин для jQuery/Zepto и директива AngularJS.
На чистом JS
Подключите скрипт headroom.js
на страницу, а затем:
// получить элемент
var myElement = document.querySelector("header");
// создать новый экземпляр Headroom
var headroom = new Headroom(myElement);
// инициализация
headroom.init();
С плагинами jQuery/Zepto
Подключите скрипт headroom.js
и jQuery.headroom.js
на страницу, а затем:
// очень просто
$("#header").headroom();
Плагин также предоставляет возможность использовать data-* API, если вы предпочитаете декларативный подход.
<!-- selects $("[data-headroom]") -->
<header data-headroom>
Замечание: дополнительно для Zepto потребуется data модуль для совместимости.
С AngularJS
Подключить скрипты headroom.js
и angular.headroom.js
. Затем:
<header headroom></header>
<!-- or -->
<headroom></headroom>
<!-- or with options -->
<headroom tolerance="0" offset="0" scroller=".my-scroller" classes="{pinned:'headroom--pinned',unpinned:'headroom--unpinned',initial:'headroom'}"></headroom>
Опции
Ниже представлены дефолтные значения объекта с параметрами для Headroom.js, которые можно переопределять при инициализации:
{
// vertical offset in px before element is first unpinned
offset : 0,
// scroll tolerance in px before state changes
tolerance : 0,
// or you can specify tolerance individually for up/down scroll
tolerance : {
up : 5,
down : 0
},
// css classes to apply
classes : {
// when element is initialised
initial : "headroom",
// when scrolling up
pinned : "headroom--pinned",
// when scrolling down
unpinned : "headroom--unpinned",
// when above offset
top : "headroom--top",
// when below offset
notTop : "headroom--not-top",
// when at bottom of scoll area
bottom : "headroom--bottom",
// when not at bottom of scroll area
notBottom : "headroom--not-bottom"
},
// element to listen to scroll events on, defaults to `window`
scroller : someElement,
// callback when pinned, `this` is headroom object
onPin : function() {},
// callback when unpinned, `this` is headroom object
onUnpin : function() {},
// callback when above offset, `this` is headroom object
onTop : function() {},
// callback when below offset, `this` is headroom object
onNotTop : function() {},
// callback when at bottom of page, `this` is headroom object
onBottom : function() {},
// callback when moving away from bottom of page, `this` is headroom object
onNotBottom : function() {}
}
CSS
Напомним, что headroom.js работает добавляя и удаляя классы реагируя на скролл. Это означает, что вам понадобится CSS. Например, вам нужно скрывать шапку при прокрутке вниз и показывать при прокрутке вверх. Вот базовый CSS для этого:
.headroom--pinned {
display: block;
}
.headroom--unpinned {
display: none;
}
Хотя это и функционально, но слишком резко. Для плавности добавим CSS transition:
/**
* Note: I have omitted any vendor-prefixes for clarity.
* Adding them is left as an exercise for the reader.
*/
.headroom {
will-change: transform;
transition: transform 200ms linear;
}
.headroom--pinned {
transform: translateY(0%);
}
.headroom--unpinned {
transform: translateY(-100%);
}
Обратите внимание что для переходов мы используем свойство transform
. Причина в лучшей производительности при анимации в сравнении с
top
и bottom
и то что вам не нужно знать заранее высоту элемента, значение -100%
всегда будет полностью перемещать элемент за поле зрения.
Примеры
Можно попробовать по играться с параметрами на странице headroom.js и сразу увидеть изменения.
Поддержка браузерами
Headroom.js зависит от следующих API:
Все эти API имеют полифилы, таким образом headroom.js может работать и со старыми браузерами, если это необходимо.