最近有个需求,让nav
在正常的时候正常显示,当页面滚动下去,nav
要停靠在页面顶。
CSS实现
MDN关于position
的定义里提到过有一种position: sticky;
,可以得到这种效果。必须要设置top的值,才能有效。
Sticky
父元素
<div id="example_0">
<div id="example_1">
Sticky
</div>
父元素
</div>
<style>
#example_0{
text-align: center;
border: #000000 1px solid;
height: 200px;
}
#example_1{
position: sticky;
top: 10px;
}
</style>
这个仅仅在被设置的元素没有超出父元素范围时才生效,超出父元素时会消失。将本页面滚动下去,你能看到效果。
Javascript实现
既然纯CSS做不到,那就只好上JS了。
RUNNING Example_3
<div id="example_3">RUNNING Example_3</div>
<style>
#example_3{
background: #ccc;
text-align: center;
padding: 10px 0;
}
.sticky {
font-size: 20px;
text-align: center;
z-index: 9;
border-bottom: #000000 1px solid;
position: fixed;
left: 0;
right: 0;
top: 0px;
}
</style>
<script>
var initTop = null,
stickyElement = null;
function getElementViewTop(element) {
var actualTop = element.offsetTop;
var current = element.offsetParent;
while (current !== null) {
actualTop += current.offsetTop;
current = current.offsetParent;
}
return actualTop - (document.body.scrollTop + document.documentElement.scrollTop);
}
function stickyFunction() {
var elementViewTop = getElementViewTop(stickyElement),
scrollTop = document.body.scrollTop + document.documentElement.scrollTop;
if (elementViewTop < 0) {
stickyElement.classList.add("sticky");
}
if (initTop >= scrollTop) {
stickyElement.classList.remove("sticky");
}
}
function remSticky() {
stickyElement = null;
initTop = null;
window.removeEventListener("scroll", stickyFunction);
}
function setSticky(element) {
stickyElement = element;
initTop = getElementViewTop(stickyElement);
window.addEventListener("scroll", stickyFunction);
}
setSticky(document.getElementById("example_3"));
</script>
首先通过getElementViewTop
这个函数,可以得到绑定的元素到窗口顶部的距离。记录下最初的值到initTop
,然后把stickyFunction
函数加到滚动事件的回调里。
在这个函数里,计算当前被绑定元素的到窗口的高度差,来确定是否增加.sticky
这个CSS类来控制样式。并且判断初始值是不是大于滚动条滚动的距离——也就是判断元素是不是不该定位到窗口顶部。