利用JS实现粘性定位


前言

效果如下图(橙色小方块)
请添加图片描述


一、CSS布局

CSS部分的内容很简单,不必详谈。

    <style>
        * {
            margin: 0;
            padding: 0;

        }

        .w {
            /* position: absolute; */
            width: 80%;
            text-align: center;
            margin: 20px auto;
            font-size: 50px;
        }

        .header {
            height: 300px;
            line-height: 300px;
            background-color: indianred;
        }

        .banner {
            height: 400px;
            line-height: 400px;
            background-color: skyblue;
        }

        .main {
            height: 1300px;
            line-height: 1300px;
            background-color: greenyellow;
        }

        .slider_bar {
            position: absolute;
            width: 100px;
            height: 100px;
            left: 50%;
            margin-left: 40%;
            top: 500px;
            background-color: orange;
            line-height: 100px;
            text-align: center;
        }

        .goBack {
            display: none;
            height: 100px;
            width: 100px;
            margin: 0 auto;
            bottom: 0;
        }

        a {
            text-decoration: none;
        }
    </style>

以及html部分:

    <div class="slider_bar">
        <span class="goBack"><a href="#">返回顶部</a></span>
    </div>
    <div class="header w">头部区域</div>
    <div class="banner w">banner区域</div>
    <div class="main w">主体部分</div>

二、JS实现

目标是实现橙色小方块随着滚动,在页面位于header以下时,由绝对定位变为固定定位。

1.获取元素

名字起的随意了点……

        let sb = document.querySelector('.slider_bar');
        let gb = document.querySelector('.goBack');
        let banner = document.querySelector('.banner');

2.获取参数

需要三个参数,既banner部分距离页面最高处的值(用于决对定位->固定定位)、橙色小方块距离页面最高处的值、以及二者之差(用于固定定位->绝对定位)

        //一定要写在函数外边,不然会不准
        let banneroffset = banner.offsetTop;
        let sboffset = sb.offsetTop;
        //滚动后保留距离
        let sliderbarTop = sb.offsetTop - banner.offsetTop;

3.事件

        document.addEventListener('scroll', function () {

            //改为固定定位,pageYOffset需要IE9及以上
            if (window.pageYOffset >= banneroffset) {
                sb.style.position = 'fixed';
                sb.style.top = sliderbarTop + 'px';
                gb.style.display = 'block';
            }
            else {
                sb.style.position = 'absolute';
                sb.style.top = sboffset + 'px';
                gb.style.display = 'none';
            }
        })

需要注意的是,页面被卷去的头部,有兼容性问题,因此被卷去的头部通常有如下几种写法:
1.声明了DTD,使用document.documentElement.scrollTop
⒉未声明DTD,使用document.body.scrollTop
3.新方法window.pageYoffset和window. pageXOffset ,IE9开始支持

总结

很简单的一个小案例,适合新手练习

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值