全屏滚动的原理

下面代码是用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>

 

 

以上代码参考大神,并做了部分改动

 

原文地址:https://www.cnblogs.com/daheiylx/p/14144680.html