Web Widget - Make an animation's back top button

back top是很常見的小功能,通常我們會製作一個link來點擊它,以便回到頁首或特定的

地方。而現在我們是要製作成當我們下拉捲軸時會出現一個image,來提醒我們可以點

擊他回到頁首,同時有帶點動畫的滑動效果,而不是一下跳到目的地。


方法一:自行製作back top function

透過JavaScript setInterval的控制,在特定的毫秒內逐一地遞減值,達到慢速上移的效果。

首先就是利用HTML呈現一個back top image:
<img id="backtop" border="0" title="back top" align="right"
onmouseover="changeOpacity(false)" src="images/Top.png" 
onmouseout="changeOpacity(true)" onclick="returnTop()" />

CSS基本定義出它的位置與特性
#backtop{
    position:fixed;
    bottom:0px;
    right:5px;
    cursor:pointer
}

再來就是撰寫JavaScript的語法,由於我們要控制back top image的透明度,當我們沒觸發

mouseover event時,透明度設為0.5,因此在網頁載入後設定及相關的function,如下:

opa_timer主要是當滑鼠移入image時,達到漸漸地回復非透明的效果

var curr_opa = 0.5;
window.onload = function(){
    document.getElementById("backtop").style.opacity = curr_opa;
}

function changeOpacity(opa){
    if(opa){
        document.getElementById("backtop").style.opacity = 0.5;
        curr_opa = 0.5;
    }else{
        opa_timer = setInterval(function(){
            curr_opa = +(curr_opa + 0.1).toFixed(1);
            if(curr_opa == 1){
                clearInterval(opa_timer);
            }
            document.getElementById("backtop").style.opacity = curr_opa;
        } , 10);
    }
}

再來就是當scroll往下移時的事件及點選button時回到頁面頂端的處理:
var scroll_timer;
window.onscroll = function(e){
    if(document.body.scrollTop > 0){
        document.getElementById("backtop").style.display = "block";
    }
    if(document.body.scrollTop == 0){
        document.getElementById("backtop").style.display = "none";
    }
}
function returnTop(){
    scroll_timer = setInterval("animateTop()", 15);
}
function animateTop(){
    document.body.scrollTop = document.body.scrollTop - 100;
    if(document.body.scrollTop == 0 || document.body.scrollTop < 0){
        document.body.scrollTop = 0;
        clearInterval(scroll_timer);
    }
}

當點選back top image就會執行returnTop function,設定每15毫秒進行一次scrollTop - 100

往上的位移。

基本上,語法使用都很簡單,關於移動的順暢度可以自行調整,調整出你覺得滿意的情況!

方法二:利用jQuery animation

再來是利用jQuery來製作back top特效,在動畫處理的code上面會精簡不少。

HTML code修改如下:

<body>
<a id="home"></a>
....
....
<a href="#home">
<img align="right" border="0" id="backtop" onmouseout="changeOpacity(true)" onmouseover="changeOpacity(false)" src="images/Top.png" title="back top" />
</a>
</body>

在這邊會多定義一個標籤即<a id="home"></a>,設id主要是配合jQuery的使用,而jQuery

控制動畫的語法如下:

$(document).ready(function(){
    $('a[href^="#"]').click(function(e){
 e.preventDefault();
 var o=$(this.hash).offset();
 if(o)$('body').animate({scrollTop:o.top});
    });
});

針對要點擊的a標籤,有定義anchor的名稱,並且取消執行a標籤預設會做的動作,當

點擊下去後,取得此DOM(this.hash表示此DOM之location物件的anchor)的offset value,

再來看是否有被defined,若您沒有放<a id="home"></a>,那麼o即為undefined,之後就是

以body標籤為parent,來控制所有下面的animate的行為,畢竟大家都是被包在body下面

地,以此範圍再適合不過!

留言