用Javascript实现固定侧边栏

用Javascript实现固定侧边栏

正在学习大前端中,有代码和思路不规范不正确的地方往多多包涵,感谢指教


我们在逛某某商城的时候,或者某些网站的时候,通常会遇到有个东西叫做侧边栏,这个东西会跟随我们浏览器浏览长度来进行变化1,从而实现相对窗口的固定位置1

代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .cm{
            position: absolute;
            top: 300px;
            margin-left: 1150px;
            width: 60px;
            height: 130px;
            background-color: pink;
        }
        .w{
            margin: 10px auto;
            width: 80%;
        }
        .head{
            height: 200px;
            background-color: blue;
        }
        .banner{
            height: 400px;
            background-color: green;
        }
        .main{
            height: 1000px;
            background-color: hotpink;
        }
        span {
            display: none;
            /*position: absolute;
             bottom: 0;*/
        }
    </style>
</head>
<body>
    <div class="cm">
        <span class="backTop">返回顶部</span>
    </div>
    <div class="head w">头部区域</div>
    <div class="banner w">banner区域</div>
    <div class="main w">主体区域</div>
    <script>
        var cm=document.querySelector('.cm')
        var banner=document.querySelector('.banner')
        /*console.log(banner.offsetTop)*/
        //被卷曲头部的大小位置,写在外面
        var bannertop=banner.offsetTop
        var cmtop=cm.offsetTop-bannertop
        var main=document.querySelector('.main')
        var goback=document.querySelector('.backTop')
        var maintop=main.offsetTop
        document.addEventListener('scroll',function () {
            //页面被卷去的头部
            /*console.log(window.pageYOffset)*/
            //当卷曲头部大于214,侧边栏改为固定
            if (window.pageYOffset>bannertop){
                cm.style.position='fixed'
                cm.style.top=cmtop+'px'
            }else {
                cm.style.position='absolute'
                cm.style.top='300px'
            }
            if (window.pageYOffset>maintop){
                goback.style.display='block'
            }else {
                goback.style.display='none'
            }
        })
    </script>
</body>
</html>

演示效果
在这里插入图片描述

代码解释

这里用到了document的添加事件scroll,浏览器滚动事件,当滚动时,触发函数。
这里设置了一个变量为bannerTop,是中间那个绿色模块顶部距离页面最上方的距离,然后定义cmtop这个变量,cm为侧边栏到顶部的距离,cmtop=bannerTop-cm.offsetTop。然后判断页面卷曲的长度是否大于中间那个模块距离顶部的距离,意思的页面是否划到中间这个模块,如果划到了中间这个模块,那么让侧边栏的位置固定,然后侧边栏距离顶部的距离相应改变,这里这个情况因为侧边栏与中间拿块是相对静止,所以,未卷到中间区域时,cmtop的值是恒定不变的,当卷到中间区域时,banner。Top的值变为负值,所以cmtop的值在相应的增加,并且把这个增加的值传给侧边栏距离顶部的值,这也就出现了划到中间区域,侧边栏相对静止的情况。如果没有滑倒中间区域,那么侧边栏的位置还是默认的位置。
然后如果划到了最后一个区域则出现‘回到顶部’这四个字在侧边栏上




别喷我,写的不好就劳烦指点一二,觉得有帮助就留下个大拇指点个关注再走哈哈哈!
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茂茂睡不醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值