使用JavaScript實(shí)現(xiàn)回到頂部效果

錨鏈接
使用錨鏈接方式實(shí)現(xiàn)回到頂部效果,是最簡(jiǎn)便的一種方式,即將標(biāo)簽a中的href屬性值設(shè)置為#即可:<a href="#" ></a>,便可實(shí)現(xiàn)一鍵回到頂部效果.為了提供較好的用戶體驗(yàn),這里使用js實(shí)現(xiàn)這個(gè)功能.

功能點(diǎn)

  1. 返回頂部的過程是一個(gè)由快到慢的滾動(dòng)過程;
  2. 在返回頂部的滾動(dòng)過程中鸣驱,如果滾動(dòng)鼠標(biāo)滾輪,可暫停在當(dāng)前位置杏死。
  3. 滾動(dòng)條距離頂部較遠(yuǎn)時(shí),顯示返回頂部按鈕,較近時(shí)不顯示;

主要知識(shí)點(diǎn)

  1. DOM操作
  • document.getElementById
    -根據(jù)ID獲取標(biāo)簽元素var obtn=document.getElementById('btn');
  • 獲取瀏覽器距離頂部的高度塞帐,注意在chrom和IE等瀏覽器的兼容性
    -document.documentElement.scrollTop 滾動(dòng)條到頂端的距離顶猜,可以讀寫(適用 IE 類瀏覽器)
    -document.body.scrollTop 滾動(dòng)條到頂端的距離塘娶,可以讀寫(適用 chrome 類瀏覽器)
  1. 事件運(yùn)用
  • window.onload 頁(yè)面加載完畢后觸發(fā)
  • onclick 點(diǎn)擊后觸發(fā)
  • window.onscroll 滾動(dòng)條滾動(dòng)時(shí)觸發(fā)
  1. 定時(shí)器
  • setInterval() 設(shè)置定時(shí)器扰法,需傳入兩個(gè)參數(shù):第一個(gè)是重復(fù)執(zhí)行的函數(shù)栓票,第二個(gè)是函數(shù)重復(fù)執(zhí)行的時(shí)間間隔
  • clearInterval() 關(guān)閉定時(shí)器,需傳入一個(gè)參數(shù):定時(shí)器對(duì)象

代碼
首先獲取元素標(biāo)簽颜启,并對(duì)其綁定點(diǎn)擊事件:獲取滾動(dòng)條距離頂部的高度并進(jìn)行賦值操作偷俭。這樣可實(shí)現(xiàn)每點(diǎn)擊一次滾動(dòng)條向上滾動(dòng)200的距離,需要不斷觸發(fā)點(diǎn)擊事件直到滾動(dòng)條回到頂部為止缰盏。

var osTop=document.documentElement.scrollTop|| document.body.scrollTop;
//osTop=200;
document.documentElement.scrollTop=document.body.scrollTop-=200;

使用setInterval()函數(shù)涌萤,每隔一段時(shí)間執(zhí)行一次賦值操作。并當(dāng)滾動(dòng)條距離頂部的高度值osTop為0時(shí)口猜,清除定時(shí)器负溪。

為了實(shí)現(xiàn)滾動(dòng)條向上滾動(dòng)的過程是一個(gè)由快到慢的過程,執(zhí)行下面的運(yùn)算济炎。ispeed的絕對(duì)值越大川抡、滾動(dòng)條距離頂部的高度值就越小,即回到頂部的速度就越快冻辩;ispeed的絕對(duì)值越小猖腕,返回頂部的速度就相對(duì)較小。
在這里使用Math.floor()向下取整恨闪,當(dāng)osTop / 5介于0~1之間時(shí)倘感,ispeed的值舍為0。這樣的話chrome瀏覽器中滾動(dòng)條距離頂部的高度值 document.body.scrollTop= osTop-0咙咽,這樣滾動(dòng)條的距離頂部的高度會(huì)一直為某個(gè)數(shù)字老玛。導(dǎo)致滾動(dòng)條到頂部的距離永遠(yuǎn)不會(huì)為0,這樣滾動(dòng)條看似在頂部位置停止钧敞,實(shí)際上鼠標(biāo)下拉滾動(dòng)條時(shí)發(fā)現(xiàn)滾動(dòng)條依然會(huì)向上滾動(dòng)蜡豹,說明定時(shí)器一直在執(zhí)行。

var ispeed=Math.floor(osTop / 5);
document.documentElement.scrollTop=document.body.scrollTop = osTop-ispeed;
// console.log(osTop-ispeed);

然鵝溉苛,用Math.ceil()向上取整镜廉,可保證ispeed的值不會(huì)為0;或者依然使用Math.floor()將值改為負(fù)值Math.floor(-osTop / 5)是一樣的道理愚战。代碼如下:

var timer = null;
obtn.onclick=function(){
        //設(shè)置定時(shí)器

        timer=setInterval(function(){
            //獲取滾動(dòng)條距離頂部的高度
            var osTop=document.documentElement.scrollTop|| document.body.scrollTop;
            var ispeed=Math.floor(-osTop / 5);
            isTop = true;
            document.documentElement.scrollTop=document.body.scrollTop = osTop+ispeed;

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

這樣就實(shí)現(xiàn)了點(diǎn)擊返回頂部按鈕娇唯,頁(yè)面返回頂部的速度隨著滾動(dòng)條到頂部距離的減小而變慢,即實(shí)現(xiàn)了一個(gè)速度由快到慢的過程寂玲。


window是一個(gè)窗口類塔插,onscroll是窗口類window的對(duì)象,滾動(dòng)滾動(dòng)條時(shí)觸發(fā)。
這里window.onscroll事件的目的拓哟,就是在使用鼠標(biāo)的滾動(dòng)按鈕滾動(dòng)頁(yè)面時(shí)停止setInterval.用的方法是添加一個(gè)isTop.由于頁(yè)面是一點(diǎn)一點(diǎn)滾動(dòng)的想许,函數(shù)會(huì)被執(zhí)行多次。鼠標(biāo)滾動(dòng)断序,觸發(fā)window.onscroll,執(zhí)行完里面的函數(shù)后才執(zhí)行setInterval流纹,但是在執(zhí)行window.onscroll事件第二次的時(shí)候!isTop=true,清楚定時(shí)器,這個(gè)時(shí)候就不再往上滾動(dòng)了违诗。

    var isTop = true;
    var clientHeight = document.documentElement.clientHeight;//獲取頁(yè)面可視區(qū)高度
    
    window.onscroll=function(){
        //alert(clientHeight);
        //滾動(dòng)條滾動(dòng)觸發(fā)
        if(!isTop)//條件為真時(shí)執(zhí)行清除定時(shí)器操作
            clearInterval(timer);
        isTop = false;
    }

實(shí)現(xiàn)了滾動(dòng)暫停捧颅,另外再在window.onscroll事件中使用腳本控制“回到頂部”按鈕的顯示與隱藏

    var osTop=document.documentElement.scrollTop|| document.body.scrollTop;
    if(osTop >= clientHeight){
            obtn.style.display = 'block';
        }else{
            obtn.style.display = 'none';
        }

問題:

var osTop = document.documentElement.scrollTop為什么不能做全局變量
1、盡量不要使用全局變量较雕。每聲明一個(gè)全局變量會(huì)占用一點(diǎn)內(nèi)存碉哑,另外會(huì)造成變量名污染;
2亮蒋、var osTop = document.documentElement.scrollTop扣典。如果寫在外面,osTop只是在JS文件載入時(shí)獲取滾動(dòng)條距離頂部的高度慎玖,但有的時(shí)候贮尖,如頁(yè)面在滾動(dòng)的時(shí)候osTop的值是在不斷變化的,所以我們要在綁定scroll事件中不斷的去獲取osTop的值.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末趁怔,一起剝皮案震驚了整個(gè)濱河市湿硝,隨后出現(xiàn)的幾起案子薪前,更是在濱河造成了極大的恐慌,老刑警劉巖关斜,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件示括,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痢畜,警方通過查閱死者的電腦和手機(jī)垛膝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丁稀,“玉大人吼拥,你說我怎么就攤上這事∠呱溃” “怎么了凿可?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)授账。 經(jīng)常有香客問我矿酵,道長(zhǎng),這世上最難降的妖魔是什么矗积? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任全肮,我火速辦了婚禮,結(jié)果婚禮上棘捣,老公的妹妹穿的比我還像新娘辜腺。我一直安慰自己,他們只是感情好乍恐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布评疗。 她就那樣靜靜地躺著,像睡著了一般茵烈。 火紅的嫁衣襯著肌膚如雪百匆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天呜投,我揣著相機(jī)與錄音加匈,去河邊找鬼。 笑死仑荐,一個(gè)胖子當(dāng)著我的面吹牛雕拼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粘招,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼啥寇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辑甜,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤衰絮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后磷醋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猫牡,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年子檀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镊掖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃戈。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褂痰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出症虑,到底是詐尸還是另有隱情缩歪,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布谍憔,位于F島的核電站匪蝙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏习贫。R本人自食惡果不足惜逛球,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苫昌。 院中可真熱鬧颤绕,春花似錦、人聲如沸祟身。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袜硫。三九已至氯葬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婉陷,已是汗流浹背帚称。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秽澳,地道東北人世杀。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肝集,于是被迫代替她去往敵國(guó)和親瞻坝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.第一種方式:錨鏈接 優(yōu)點(diǎn):簡(jiǎn)單快速,沒有兼容性問題 缺點(diǎn): 視覺上不夠直觀所刀,用戶體驗(yàn)不太好 2.js的方式: ...
    love2013閱讀 789評(píng)論 0 0
  • Window和document對(duì)象的區(qū)別 window對(duì)象window對(duì)象表示瀏覽器中打開的窗口window對(duì)象是...
    FConfidence閱讀 2,206評(píng)論 0 5
  • 一.首先介紹常用的屬性: HTML精確定位:scrollLeft,scrollWidth,clientWidth,...
    silingling閱讀 3,058評(píng)論 0 1
  • JavaScript 將字符串轉(zhuǎn)換為數(shù)字 parseInt() ◆只保留數(shù)字的整數(shù)部分衙荐,不會(huì)進(jìn)行四舍五入運(yùn)算。 ...
    AkaTBS閱讀 985評(píng)論 0 9
  • 東伯雪鷹、乾合娘娘斩披、青君溜族、元初主人、時(shí)空島主等一眾主宰們也都遙遙看向母祖教老巢——那座古樸美麗的球形堡壘垦沉。 “倒這...
    im喵小姐閱讀 359評(píng)論 0 0