position: sticky — это новый способ позиционирования элементов, концептуально похожий на position: fixed . Разница в том, что элемент с position: sticky ведет себя как position: relative внутри своего родителя, пока в области просмотра не будет достигнут заданный порог смещения.
Варианты использования
Перефразируя первоначальное предложение Эдварда О'Коннора об этой функции:
Представляем липкое позиционирование

Просто добавив position: sticky (с префиксом поставщика), мы можем указать элементу как position: relative до тех пор, пока пользователь не прокрутит элемент (или его родительский элемент) до 15 пикселей сверху:
.sticky {
position: -webkit-sticky;
position: -moz-sticky;
position: -ms-sticky;
position: -o-sticky;
top: 15px;
}
top: 15px , элемент становится фиксированным.
Чтобы проиллюстрировать эту функцию на практике, я собрал ДЕМО , в которой заголовки блогов прикрепляются при прокрутке.
Старый подход: события прокрутки
До сих пор для достижения эффекта липкости сайты настраивали прослушиватели событий scroll в JS. Мы также используем эту технику в руководствах по html5rocks. На экранах размером менее 1200 пикселей наша боковая панель с оглавлением меняется на position: fixed после определенного количества прокрутки.
Вот (уже старый способ) создать заголовок, который прикрепляется к верхней части области просмотра, когда пользователь прокручивает вниз, и возвращается на место, когда пользователь прокручивает вверх:
<div class="header"></div>
<script>
var header = document.querySelector('.header');
var origOffsetY = header.offsetTop;
function onScroll(e) {
window.scrollY >= origOffsetY ? header.classList.add('sticky') :
header.classList.remove('sticky');
}
document.addEventListener('scroll', onScroll);
</script>
Попробуйте: http://output.jsbin.com/omanut/2/
Это достаточно просто, но эта модель быстро выходит из строя, если вы хотите сделать это для группы узлов DOM, скажем, для каждого заголовка <h1> блога при прокрутке пользователем.
Почему JS не идеален
В общем, обработчики прокрутки никогда не были хорошей идеей. Люди склонны выполнять слишком много работы и задаются вопросом, почему их пользовательский интерфейс неудобен.
Еще следует учитывать, что все больше и больше браузеров реализуют аппаратное ускорение прокрутки для повышения производительности. Проблема в том, что при использовании обработчиков прокрутки JS браузеры могут вернуться в более медленный (программный) режим. Теперь мы больше не работаем на графическом процессоре. Вместо этого мы снова обращаемся к процессору. Результат? Пользователи воспринимают больше рывков при прокрутке страницы.
Таким образом, имеет смысл сделать такую функцию в CSS декларативной.
Поддерживать
К сожалению, спецификации для этого нет. Он был предложен на сайте www-style еще в июне и только что появился в WebKit. Это означает, что нет хорошей документации, на которую можно было бы указать. Однако следует отметить одну вещь: согласно этой ошибке , если указаны и left , и right , преимущество имеет left . Аналогично, если top и bottom используются одновременно, top выигрывает.
На данный момент поддерживается Chrome 23.0.1247.0+ (текущий Canary) и WebKit каждую ночь.