开发一个官网的时候,遇到这种整屏切换需求,并且滚轮控制切换。
swiper有类似效果,但是感觉不符合我的理想效果
而描点跳转 我曾想用 scrollIntoView 但是因为滑轮监听挂载在 mouted方法,而 scrolltoView 在mouted 中会失效。最终放弃用scrollintoView。
其次vue 也有专门的 Vue-scrollto 组件,但是他的调用方式是绑定在标签上, 如果要实现滚轮滑动来变化 显然不符合效果。
最后决定使用原生api来写。
核心思想:
addEventListener('mousewheel', this.handleScroll, false)
根据监听回调时间 callback中的 deltaY来判段 鼠标是向上还是向下
第一步,获取所有节点offsetTop 高度
内容代码:
<div class="page flex-col" id="index-page"> <div class="bd1 flex-col"> //滚动的内容 <div class="outer1 flex-col pagep page1" id="page1" ref="page1"> ... </div> <div class="outer4 flex-col pagep page2" id="page2" ref="page2"> </div> ... <div class="outer16 flex-col pagep page7" id="page7" ref="page7"> </div> //控制圆点 <div class="dian"> <ul> <li :class="{ da: index == 1 }" @click="jump(0)"></li> <li :class="{ da: index == 2 }" @click="jump(1)"></li> ... <li :class="{ da: index == 7 }" @click="jump(6)"></li> </ul> </div> </div> </div>
关键代码:
export default { data() { return { // 滚动前,滚动条距文档顶部的距离 index: 1, jumpgroup: [], loading: true, }; }, mounted() { this.jumpgroup = document.querySelectorAll(".pagep"); //获取所有滚动子项目 // chrome and ie(谷歌和IE) document .getElementById("index-page") .addEventListener("mousewheel", this.handleScroll, false); //在谷歌ie浏览器绑定鼠标滚动事件 // firefox(火狐) document .getElementById("index-page") .addEventListener("DOMMouseScroll", this.handleScroll, false); //在 Firefox 浏览器中监听鼠标滚轮事件。 this.jump(0); //默认第一幅内容 }, methods: { //实现页面滚动到指定位置的效果 jump(index) { this.index = index + 1; let total = this.jumpgroup[index].offsetTop + 120; //获取目标元素的偏移量,并加上120的偏移量作为最终滚动位置 // Chrome document.body.scrollTop = total; // 设置文档主体的滚动位置为 total // Firefox document.documentElement.scrollTop = total; // 设置文档根元素的滚动位置为 total // Safari window.pageYOffset = total; // 设置页面的纵向滚动位置为 total }, //鼠标滚动回调 handleScroll(e) { // console.log(e); //用来判断滚轮是向上滑动还是向下 e.deltaY大于0是向下 反之向上 let direction = e.deltaY > 0 ? "down" : "up"; //鼠标滚轮向下或后 if (this.loading) { this.loading = false; if (direction == "down") { // console.log(this.target); if (this.index == 7) { this.index = 7; } else { this.index = this.index + 1; this.jump(this.index - 1); } if (this.index == 2) { this.$refs.count1.start(); this.$refs.count2.start(); this.$refs.count3.start(); } setTimeout(() => { this.loading = true; }, 300); } else { if (this.index == 1) { this.index = 1; } else { this.index = this.index - 1; this.jump(this.index - 1); } if (this.index == 2) { this.$refs.count1.start(); this.$refs.count2.start(); this.$refs.count3.start(); } setTimeout(() => { this.loading = true; }, 300); } } }, }, };
最后附上效果图: