sticktop

Sticktop

顾名思义,当元素靠近顶部时,自动固定在顶部。

常用场景
1.导航栏
2.字母列表

要实现导航吸顶效果,监听 scroll,然后设置导航的position:fixed

有一种属性:position:sticky

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-type"  charset="utf-8"/>
        <title>Stickytop</title>
        <style>
        .box{
        position:-webkit-sticky;
        position:sticky;
        width:100%;
        height:30px;
        text-align:center;
        color:#fff;
        margin-bottom:50px;
        }
        .box1{
        top:0;
        z-index:1;
        background:#007bff;
        }
        .box2{
        top:30px;
        z-index:1;
        background:#ffc107;
        }
        .box3{
         background: #f4516c;
        }
        </style>
    </head>
    <body>
        <div style="height:500px">scroll</div>
        <div class="box box1"></div>
        <div class="box box2"></div>
        <div class="box box3"></div>
        <div style="height:500px"></div>
    </body>

</html>

注意,由于top值不同,表现得也不同
box1,box2,box3在滚动之前,他们与相对定位一样
但是box1的top为0,就固定在顶部,box2的top为30,就在top30的地方固定,box3没有设置,就一直是相对定位

所以,理解“粘粘定位是相对定位和固定定位的混合,元素在跨越固定阈值之前为相对定位,之后为固定定位,这个固定阈值就是top,也可以是right,left

值得注意的是

  1. 粘性定位的固定固定不一定是position:fixed,只要目标元素的任意父元素都没有设置position:relative,absolute,fixed, sticky的情况下,才与position:fixed表现一样

还需要考虑兼容性。sticky的兼容性不是很好。
接下来,用js来实现

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-type"  charset="utf-8"/>
        <title>Stickytop-onscroll</title>
        <style>
            *{
                margin:0;
                padding:0;
            }
            body{
                height:2000px;
                background-image:linear-gradient(-180deg, #15f09d 0%, #25A0FF 50%, #fca72b 100%);
            }
            #wrap{
                background-color:rgba(0,0,0,0.2);
                width:100%;
                height:100px;
                margin-top:100;
            }
            #wrap[data-fixed="fixed"]{
                position:fixed;
                top:0;
                left:0;
                margin:0;
            }
        </style>
    </head>
    <body>
        <div id="wrap"></div>
        <script>
            var obj =document.getElementById("wrap");
            var ot = obj.offsetTop;
            document.onscroll= function (){
                var st = document.body.scrollTop || document.documentElement.scrollTop;
                obj.setAttribute("data-fixed",st>ot?"fixed":"")
            }

        </script>
    </body>

</html>

offsetTop属性偏移量:元素相对于定位父级顶部内框的距离

css中[]选择器,#wrap[data-fixed=”fixed”],选择data-fixed属性值为fixed

获取当前页面滚动条纵坐标的位置:document.body.scrollTop||document.documentElement.scrollTop

获取当前页面滚动条横坐标的位置:document.body.scrollLeft||document.documentElement.scrollLeft