用Javascript實現回到頂部效果
經常看到網頁中有回到頂部的效果,今天也研究一下回到頂部有哪些方法。眾所周知,用錨鏈接是實現回到最簡單的方法,但是從用戶體驗效果來說,並不是最好的。(錨鏈接回到頂部時太快了,而且用戶可能在看到某個感興趣的東西想停下來,卻停不下來),針對上面的缺點,我們試着用Javascript的方法來得到實現。思路是這個樣子的:
1、首先用html和css構建基本的例子,代碼如下
html部分:
<div class="box">
<img src="1.jpg"/>
</div>
<a href="javascript:;" id="btn" title="回到頂部"></a>
css部分:
.box { width: 1190px; margin: 0 auto; }
#btn{ width: 40px; height: 40px; background-color: red; position: fixed; right: 0px; bottom: 60px; background: url(2.jpg) no-repeat left top; }
#btn:hover{ background: url(2.jpg) no-repeat left -40px; }
在這里應該注意的是:href="javascript:;"的目的是為了阻止瀏覽器默認行為。
2、下面我們就可以用Javascript來控制我們的例子
a、首先模仿錨鏈接回到頂部的效果,代碼如下:
window.onload = function(){
var obtn = document.getElementById('btn');
obtn.onclick = function(){
var osTop = document.documentElement.scrollTop || document.body.scrollTop;
document.documentElement.scrollTop = document.body.scrollTop = -200;
};
}
這里的效果為,鼠標每點擊一次,向上移動200像素(200像素是可以變化的),然后我們發現每次都要點擊覺得很麻煩,這里我們不妨為它添加一個定時器函數
b、添加定時器函數,代碼如下:
var timer = null;//在前面聲明
timer = setInterval(function(){},30);//里面接的是移動200px效果
在這里,我們覺得還不是那么的好,比如說“別人家”的效果距離頂部越近的時候,速度越慢;並且我們中間還有一個問題就是回到頂部之后,在想繼續往下看時不會繼續往下了。
c、清除定時器效果並控制回到頂部的速率,代碼如下:
//改變回到頂部的速度
var isSpeed = Math.floor(-osTop/6)
document.documentElement.scrollTop = document.body.scrollTop = osTop + isSpeed;
//清除定時器效果
if(osTop == 0){
clearInterval(timer);
}
到這里,我們的效果差不多完成了,但是還是不能在滾動條滾動的時候,看到感興趣的內容停下來。
d、滾動條滾動即停,代碼如下:
var isTop = true;//先聲明
//滾動條滾動時觸發
window.onscroll = function(){
if(!isTop){
clearInterval(timer);
}
isTop = false;
};
isTop = true;//添加在obtn.onclick事件的timer中
到這里,我們還有一點小小的地方可以改動,就是當在可視窗口中,回到頂部是不出現的,到達一定值后才出現
e、回到頂部的顯示與隱藏,代碼如下:
/*在css中添加如下代碼:*/
#btn{display: none;}
//獲取頁面的可視窗口高度
var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
/*在window.onscroll中添加如下代碼,控制顯示與隱藏*/
//在滾動的時候增加判斷
var osTop = document.documentElement.scrollTop || document.body.scrollTop;//特別注意這句,忘了的話很容易出錯
if (osTop >= clientHeight) {
obtn.style.display = 'block';
}else{
obtn.style.display = 'none';
}
這樣,回到頂部的效果就實現了,我們在看下完整的代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Javascript 回到頂部效果</title>
<style type="text/css">
#btn {
width: 40px;
height: 40px;
position: fixed;
display: none;
right: 0px;
bottom: 30px;
background: url(2.jpg) no-repeat left top;
}
#btn:hover {
background: url(2.jpg) no-repeat 0 -40px;
}
.box {
width: 1190px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="box">
<img src="1.jpg" />
</div>
<a href="javascript:;" id="btn" title="回到頂部"></a>
<script type="text/javascript">
window.onload = function() {
var obtn = document.getElementById('btn');
var timer = null;
var isTop = true;
//獲取頁面的可視窗口高度
var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;
//滾動條滾動時觸發
window.onscroll = function(){
//在滾動的時候增加判斷
var osTop = document.documentElement.scrollTop || document.body.scrollTop;//特別注意這句,忘了的話很容易出錯
if (osTop >= clientHeight) {
obtn.style.display = 'block';
}else{
obtn.style.display = 'none';
}
if (!isTop) {
clearInterval(timer);
}
isTop = false;
};
btn.onclick = function(){
//設置定時器
timer = setInterval(function(){
//獲取滾動條距離頂部的高度
var osTop = document.documentElement.scrollTop || document.body.scrollTop; //同時兼容了ie和Chrome瀏覽器
//減小的速度
var isSpeed = Math.floor(-osTop / 6);
document.documentElement.scrollTop = document.body.scrollTop = osTop + isSpeed;
//console.log( osTop + isSpeed);
isTop = true;
//判斷,然后清除定時器
if (osTop == 0) {
clearInterval(timer);
}
},30);
};
}
</script>
</body>
</html>
到這里,還要小結一下,在中間我們運用的知識點:
知識點回顧:
DOM:
1、document.getElementById()
2、document.documentElement.scrollTop
3、document.body.scrollTop
事件:
1、window.onload
2、window.onscroll
3、obtn.onclick
定時器的使用:
1、setInterval(function(){},30)
2、clearInterval(timer)
