下面代码是用vue来写的
1、HTML结构
1 <template>
2 <div id="wrap">
3 <div id="main">
4 <div class="page">1</div>
5 <div class="page">2</div>
6 <div class="page">3</div>
7 <div class="page">4</div>
8 </div>
9 </div>
10 </template>
2、CSS样式
wrap块为窗口可看到的部分,通过absolute等属性设置占满窗口,并为其设置为:overflow:hidden
属性,使得窗口不出现滚动条,只显示窗口大小的一页内容。
设置main区域,定位为relative,通过改变main块的 top 属性实现不同页面的切换,具体的css代码如下:
1 <style lang="less" scoped>
2 #wrap{
3 position: absolute;
4 top: 0;
5 bottom: 0;
6 left: 0;
7 right: 0;
8 overflow:hidden;
9 background:rgb(15, 221, 211);
10 #main{
11 width:100%;
12 position:relative;
13 .page{
14 width:100%;
15 margin:0;
16 font-size: 20px;
17 &:nth-child(1) {
18 background:rgb(195, 185, 240);
19 }
20 &:nth-child(2) {
21 background: rgb(15, 221, 211);
22 }
23 &:nth-child(3) {
24 background: rgb(236, 173, 217);
25 }
26 &:nth-child(4) {
27 background: rgb(241, 161, 141);
28 }
29 }
30 }
31 }
32 </style>
3、JavaScript代码逻辑(对滚动事件的函数绑定)
要考虑到鼠标滚动事件的兼容性:
(1)大多数浏览器提供了mousewheel
事件
(2)Firefox 3.5+不支持,但支持相同作用的事件:DOMMouseScroll
(3)滚动属性值的区别:
① mousewheel
事件:event.wheelDelta
返回的如果是正值说明滚轮是向上滚动 ② DOMMouseScroll
事件:event.detail
返回的如果是负值说明滚轮是向上滚动
同时每页高度为 document.body.clientHeight
+px,代码如下
1 <script>
2 export default {
3 data() {
4 return {
5 now: 0,
6 startTime: 0,
7 endTime: 0,
8 length: 0,
9 }
10 },
11 mounted() {
12 this.length = document.body.clientHeight;
13 var pages = document.getElementsByClassName('page');
14 for(let i = 0; i<pages.length; i++) {
15 pages[i].style.height = this.length + 'px'
16 }
17 /* 区分浏览器
18 大多数浏览器提供了mousewheel事件,
19 Firefox 3.5+不支持,但支持相同作用的事件:DOMMouseScroll;
20 */
21 if(navigator.userAgent.toLowerCase().indexOf('firefox') != -1) {
22 document.addEventListener('DOMMouseScroll', this.scrollFun);
23 }else if(document.addEventListener){
24 document.addEventListener('mousewheel', this.scrollFun, false)
25 }else if(document.attachEvent){ // IE
26 document.attachEvent("onmousewheel", this.scrollFun);
27 }else {
28 document.onmousewheel = this.scrollFun;
29 }
30 },
31 methods: {
32 scrollFun(e){
33 var main = document.getElementById('main');
34 this.startTime = new Date().getTime();
35 var event = e || window.event;
36 /* mousewheel事件:event.wheelDelta 返回的如果时正值说明滚轮是向上滚动的;
37 DOMMouseScroll事件:event.detail 返回的如果时负值说明滚轮是向上滚动,
38 每页高度为 document.body.clientHeight+px;
39 */
40 var dir = event.wheelDelta || -event.detail;
41 if(this.startTime - this.endTime > 200) {
42 if(dir > 0 && this.now > -3 * this.length) {
43 this.now -= this.length;
44 main.style.top = this.now + 'px';
45 this.endTime = new Date().getTime();
46 }else if(dir < 0 && this.now < 0){
47 this.now += this.length;
48 main.style.top = this.now + 'px';
49 this.endTime = new Date().getTime();
50 }
51 }else {
52 // event.preventDafault();
53 }
54 }
55 }
56 }
57 </script>
以上代码参考大神,并做了部分改动