js+html+css仿淘宝固定侧边栏

17 篇文章 0 订阅
4 篇文章 0 订阅
功能概要

将页面分为四部分,header区域、banner区域、main区域以及侧边栏

  1. 当页面向下滑动,header区域隐藏时,右侧侧边栏固定在页面上不继续滑动
  2. 当页面向上滑动,header区域显示时,右侧侧边栏正常随着页面滚动
  3. 当页面向下滑动,header区域以及banner区域隐藏时,右侧侧边栏显示其他相关信息
  4. 当页面向上滑动,header区域以及banner区域显示时,右侧侧边栏隐藏其他相关信息
  5. 点击返回顶部,页面以动画形式向上移动

效果展示
效果图

实现代码

html

<div class="slider-bar">
    <div class="goBack">返回顶部</div>
</div>
<div class="header">头部区域</div>
<div class="banner">banner区域</div>
<div class="main">main区域</div>

css

.slider-bar {
    position: absolute;
    right: 4%;
    top: 300px;
    width: 20px;
    font-size: 14px;
    text-align: center;
    height: 80px;
    background: #e94242;
}

.goBack {
    display: none;
}

.header {
    margin: 0 auto;
    width: 90%;
    height: 200px;
    background-color: #969696;
}

.banner {
    margin: 0 auto;
    margin-top: 20px;
    width: 90%;
    height: 400px;
    background-color: #856c43;
}

.main {
    margin: 0 auto;
    margin-top: 20px;
    width: 90%;
    height: 800px;
    background-color: #64b9d5;
}

js

window.addEventListener('pageshow',function () {
    var header = document.querySelector('.header');
    var banner = document.querySelector('.banner');
    var sliderbar = document.querySelector('.slider-bar');
    var main = document.querySelector('.main');
    var goBack = document.querySelector('.goBack');
    // 获取相对于body的偏移
    var sliderbarTop = sliderbar.offsetTop;
    var bannerTop = banner.offsetTop;
    var mainTop = main.offsetTop;
    // 页面滚动监听事件
    document.addEventListener('scroll',function () {
        // 获取页面滚动上卷距离 而不是元素
        //  如果页面滚动上卷距离超过 Banner距离到body偏移 则固定右侧侧边栏
        if (window.pageYOffset >= bannerTop) {
            sliderbar.style.position = 'fixed';
            sliderbar.style.top = sliderbarTop - bannerTop + 'px';
        } else {
            sliderbar.style.position = 'absolute';
            sliderbar.style.top = '300px';
        }
        //  如果页面滚动上卷距离超过 main距离到body偏移 则显示文字
        if (window.pageYOffset >= mainTop) {
            goBack.style.display = 'block';
        } else {
            goBack.style.display = 'none';
        }

    //  点击返回顶部
        goBack.addEventListener('click',function () {
            animate(window,0,15);
        })

    //    动画函数
        function animate(obj, target, timeout,callback) {
            // 清空已有的定时器
            clearInterval(obj.timer);
            // 为每个对象开辟一个定时器
            obj.timer = setInterval(function () {
                // 移动步长
                var step = (target - window.pageYOffset) / 10;
                // 判断是否为前进还是后退
                step = step > 0? Math.ceil(step): Math.floor(step);
                if (window.pageYOffset == target) {
                    clearInterval(obj.timer);
                    callback && callback();
                }
                window.scroll(0,window.pageYOffset + step);
            },timeout)
        }
    })
})

注意点

以上使用的window.pageYOffset计算页面被卷去的头部距离具有一定的兼容性问题,一般被卷去的头部计算方法有以下几种:

  1. 声明了DTD,使用document.documentElement.scrollTop
  2. 未声明DTD,使用document.body.scrollTop
  3. IE9以上支持,window.pageYOffset

解决兼容性方案:

function getScroll() {
    return {
        left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0,
        top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
    };
}

使用: getScroll().top;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值