Vue 实现v-sticky 指令,兼容position:sticky滚动吸顶行为

posititon:sticky 不支持低版本浏览器,因此手动通过position: fixed实现

代码

参数是距离顶部的偏移量

import Vue from 'vue';
/**
 * 参数是距离顶部的偏移量
 * 使用
 * <div v-sticky="10"></div>
 */
Vue.directive('sticky', {
    inserted(el, binding){
        const rect = el.getBoundingClientRect();
        /** 这里加上滚动条的位置,原因:
         * 页面滚动后再刷新,浏览器会自动跳转到之前滚动的位置
         * 此时,获取到的 rect.top 的位置是不对的
         */
        // 获取元素最初距离顶部的位置
        const originTop = rect.top + window.pageYOffset;
        const originLeft = rect.left + window.pageXOffset;
        if (!binding.value) binding.value = 0;
        const paddingTop = binding.value;
        window.stickyScrollCallback = () => {
            // 页面滚动距离大于元素最初距离顶部位置,则使元素变为position:fixed
            if (window.pageYOffset > originTop - paddingTop){
                el.style.cssText = `
                    position: fixed;
                    left: ${originLeft}px;
                    top: ${paddingTop}px;
                    z-index: 10;
                    box-shadow: 0 0 15px #ddd;
                `;
            } else {
                el.style.cssText = '';
            }
        };
        window.addEventListener('scroll', window.stickyScrollCallback);
    },
    unbind(){
        window.removeEventListener('scroll', window.stickyScrollCallback);
    }
});

总结

知识点:浏览器会在页面刷新后,自动滚动到上一次的位置,这可能会导致相关的计算有误。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值