Вот начало . В принципе, мы копируем заголовок при загрузке, а затем проверяем (используяwindow.scrollY
или.down
), чтобы видеть, когда пользователь прокручивается за пределы точки (например, 200 пикселей). Затем мы просто переключаем класс (в этом случаеtransition: top 0.2s ease-in
), который перемещает оригинал в поле зрения.
Наконец, все, что нам нужно сделать, это применить .down
к нашему клону, чтобы, когда он находится в header { position: relative; width: 100%; height: 60px; } header.clone { position: fixed; top: -65px; left: 0; right: 0; z-index: 999; transition: 0.2s top cubic-bezier(.3,.73,.3,.74); } body.down header.clone { top: 0; }
состоянии, он скользит в поле зрения. Dunked делает это лучше, но с небольшой игрой вокруг легко настроить
CSS
var sticky = {
sticky_after: 200,
init: function() {
this.header = document.getElementsByTagName("header")[0];
this.clone = this.header.cloneNode(true);
this.clone.classList.add("clone");
this.header.insertBefore(this.clone);
this.scroll();
this.events();
},
scroll: function() {
if(window.scrollY > this.sticky_after) {
document.body.classList.add("down");
}
else {
document.body.classList.remove("down");
}
},
events: function() {
window.addEventListener("scroll", this.scroll.bind(this));
}
};
document.addEventListener("DOMContentLoaded", sticky.init.bind(sticky));
либо Vanilla JS (при необходимости заполнять полином)
$(document).ready(function() {
var $header = $("header"),
$clone = $header.before($header.clone().addClass("clone"));
$(window).on("scroll", function() {
var fromTop = $("body").scrollTop();
$('body').toggleClass("down", (fromTop > 200));
});
});
или jQuery
translate()
Новые размышления
В то время как выше ответы на исходный вопрос OP «Как Dunked достичь этого эффекта?» , Я бы не рекомендовал этот подход. Во-первых, копирование всей верхней навигации может быть довольно дорогостоящим, и нет реальной причины, почему мы не можем использовать оригинал (с небольшой работой).
Кроме того, Пол Ирланд и другие, писали о том, как анимация с top
лучше, чем оживление top
. Он не только более совершенен, но также означает, что вам не нужно знать точную высоту вашего элемента. Вышеупомянутое решение будет изменено следующим образом (см. JSFiddle) :
header.clone {
position: fixed;
top: 0;
left: 0;
right: 0;
transform: translateY(-100%);
transition: 0.2s transform cubic-bezier(.3,.73,.3,.74);
}
body.down header.clone {
transform: translateY(0);
}
Единственный недостаток использования преобразований заключается в том, что, несмотря на то, что поддержка браузера довольно хороша , вы, вероятно, захотите добавить версии с префиксом поставщика, чтобы максимизировать совместимость.