区域滚动,得到当前滚动对应的下标

发布时间 2023-09-07 17:00:26作者: 小码同学哟~

该方法搭配使用‘锚点定位’可实现 列如点餐页面(右侧菜单类型,左侧菜单列表)

属性名 类型 说明
items  String 滚动区域class名
that.menuList String 渲染菜单列表数据的数组
itemList + index String 用于锚点定位的ID名
55  String 滚动区域与上面样式存在50px的距离;根据实际样式调整
// 调用监听滚动事件
monitorScroll()
// 监听滚动事件
function monitorScroll(){
    let that = this
    // 获取需要监听滚动的DOM元素
    const element = document.getElementsByClassName('items')[0]
    // 使用节流优化滚动事件
    element.addEventListener('scroll', that.debounce(function() {
        let scrollTop = element.scrollTop
        let distance = []
        that.menuList.forEach((item,index) =>{
            let domHeight = document.getElementById('itemList'+index).offsetTop
            distance.push(Math.abs(domHeight-55-scrollTop))
        })
        let minVal = Math.min(...distance)
        let minIndex = distance.indexOf(minVal)
        if(minIndex != that.menuActivatedId){
            that.menuActivatedId = minIndex
        }
    }, 100));
},
// 防抖事件
function debounce(func, delay) {
    let timer = null;
    return function(...args) {
        clearTimeout(timer);
        timer = setTimeout(() => {
            func.apply(this, args);
        }, delay);
    };
},