该方法搭配使用‘锚点定位’可实现 列如点餐页面(右侧菜单类型,左侧菜单列表)
属性名 | 类型 | 说明 |
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); }; },