zkhzz

 

许多商城网址,当我们滚动到一定高度时,我们会发现一般会出现一个回到顶部的js选项,点击轻松实现回到顶部,交互效果会显得比较人性化,且回到顶部过程中若在滚动滚动条时可以停止滚动,现在让我们来实现吧

我总结了一下会用到的知识以及js方面的方法:

1.简单的html及css布局

2.js函数中函数

window.onload方法  //让整个页面渲染完成后再加载

window.onscroll方法 //用户滚动 滚动条时触发 可以修改<a>标签回到顶部 样式 同时清除计时器,使得在回到顶部的过程中,方便用户停止滚动

onclick//点击事件 setInterval// 计时器

 

下面是简单代码的实现:

1.先是一些基本样式的设定:

<style type="text/css">
.main{
height: 3240px;
width: 60%;
background-color: #e5e5e5;
font-size: 60px;
font-family: \'微软雅黑\';
margin: 0 auto;
}
#btn{
position: fixed;
width: 40px;
height: 40px;
left: 50%;
bottom: 15px;
margin-left: 610px;
background: url(img/1.jpg) no-repeat left top;
display: none;      //这里修改display为none 是为了页面滚动超过当前页面尺寸时再修改,使得<a>时隐时现
}
#btn:hover{
background: url(img/1.jpg) no-repeat left -40px;
}
</style>

 

<body>
<div class="main">
js回到顶部
</div>
<a href="javascript:;" title="回到顶部" id="btn"></a>  //href="javascript:;"阻止浏览器的默认行为

</body>

下面就是js功能的实现了: 

1.首先所有方法要在window.onload = function(){}完成后进行

2.

  var obtn = document.getElementById(\'btn\');//获取DOM中按钮
  var timer = null;//设置计时器

3.obtn.onclick = function(){.......}触发事件

  3.1事件触发后,我们先要使用计时器,来不断修改当前滚动条距离顶部的高度 所以计时器就起作用了

  timer = setInterval(function(){..............................}

  

  3.2我们可以通过 var osTop = document.documentElement.scrollTop || document.body.scrollTop;  来获取当前滚动条距离顶部的距离 第一个是ie的属性 第二个是chrome的属性

 

  3.3获取到后 我们要做的就是不断修改document.documentElement.scrollTop 和document.body.scrollTop 的值,使得其一直滚动。 为了使交互更加好 我们可以减缓滚动条回到顶部的速度,使其效果更好,这是我们可以定义一个ispeed变量 

 

  var ispeed = Math.floor(-osTop/6); // -号是为了osTop+ispeed 的值能够到达0,便于清除计时器

 

  3.4接着,就是修改值了 document.documentElement.scrollTop = document.body.scrollTop = osTop+ispeed; 

 

  3.5当我们的滚动条到达顶部时,我们可以清楚计时器,以至于我们可以继续下拉,然后继续回到顶部

  if(osTop==0){
    clearInterval(timer);
  }

 

到这里,基本功能就实现了, 可是我们发现 了问题:

  1.回到顶部的过程中,我们不能停止滚动条的上升 

  2.滚动条不会到顶部是不会挺停止的

  3.<a>标签始终出现,交互效果不好

 

 

所以,到了改进的地步了:

  1. 我们可以通过window.onscroll事件,当用户滚动时触发

 

  2.我们可以定义变量var isTop = true; 来让当用户停止滚动时,停止滚动条的滚动 

  if(!isTop){
    clearInterval(timer);
  }

  3.之后要修改isTop的值为false, 下次进入循环时进入if()判断中

 

这个时候,我们又发现了一个问题,就是滚动条每次就只动一次 ,点击一次动一次 为什么呢?

 

  原来,在修改完isTop的值为false 之后,我们就清除计时器了,那么自然不会继续执行setInterval了,这时候,我们需要在onclick事件中修改isTop的值为true,使其不进入if判断中

 

  4.isTop = true;

现在 回到顶部的功能就完善了些,可以根据用户需要而停止 

 

还有关于css的设定,我们要使得页面高度到达一定距离时才显示出来,那么我们只要定义var clientHeight = document.documentElement.clientHeight;来获取当前页面尺寸 且<a>标签的默认样式为none 然后再window.onscroll中判断 若osTop大于clientHeight 的值 则修改display为block  否则为none;

 

现在,基本功能已经实现, 完整代码如下

 1 <!DOCTYPE html>
 2 <html>
 3 <head land="en">
 4     <meta charset="UTF-8">
 5     <title>js回到顶部</title>
 6 
 7     <style type="text/css">
 8         .main{
 9             height: 3240px;
10             width: 60%;
11             background-color: #e5e5e5;
12             font-size: 60px;
13             font-family: \'微软雅黑\';
14             margin: 0 auto;
15         }
16         #btn{
17             position: fixed;
18             width: 40px;
19             height: 40px;
20             left: 50%;
21             bottom: 15px;
22             margin-left: 610px;
23             background: url(img/1.jpg) no-repeat left top;
24             display: none;
25         }
26         #btn:hover{
27             background: url(img/1.jpg) no-repeat left -40px;
28         }
29     </style>
30 </head>
31 <body>
32     <div class="main">
33         js回到顶部
34     </div>
35     <a href="javascript:;" title="回到顶部" id="btn"></a>
36     <script type="text/javascript">
37     //页面渲染完触发
38     window.onload=function(){
39         var obtn = document.getElementById(\'btn\');
40         var timer = null;
41         var isTop = true;
42         var clientHeight = document.documentElement.clientHeight;
43 
44         //用户滚动 滚动条时触发
45         window.onscroll = function(){
46             var osTop = document.documentElement.scrollTop || document.body.scrollTop;//获取滚动条距离顶部的高度
47             if(!isTop){
48                 clearInterval(timer);
49             }
50             isTop = false;
51             if(osTop>=clientHeight){
52                 obtn.style.display = \'block\';
53             }else{
54                 obtn.style.display = \'none\';
55             }
56         }
57         obtn.onclick = function(){
58             timer = setInterval(function(){
59                 var osTop = document.documentElement.scrollTop || document.body.scrollTop;//获取滚动条距离顶部的高度
60                 var ispeed = Math.floor(-osTop/6);//减缓回到顶部的速度,使交互更好
61                 document.documentElement.scrollTop = document.body.scrollTop = osTop+ispeed;
62                 isTop = true;
63                 if(osTop==0){
64                     clearInterval(timer);
65                 }
66             },30);    
67         }
68     }
69     </script>
70 </body>
71 </html>

有其他想法的大神也可以一起分享,我想学习借鉴,谢谢!

引用前请标明出处:http://www.cnblogs.com/zkhzz/

分类:

技术点:

相关文章: