JavaScript - 控制滾動條操作

今天玩 antd-mobile 碰到一個滾動條的問題:在 Tab 組件中使用多個 ListView ,當(dāng)操作第一個 Tab 中的 ListView A 組件藐守,加載數(shù)據(jù),滾動,底部加載一切正常酵紫,可是當(dāng)我點(diǎn)擊切換到第二個 Tab 中的 ListView B 組件時,發(fā)現(xiàn)在 ListView B 組件中滾動屏幕,觸發(fā)了 ListView A 組件中的滾動事件奖地,同樣的橄唬,在 ListView A 組件中滾動屏幕,也會觸發(fā) ListView 組件的滾動事件参歹。

導(dǎo)致這個奇葩問題的原因居然是兩個 ListView 公用了 bodyscroll仰楚,解決思路就是讓兩個 ListView 視同自己的 scroll 事件,同時設(shè)置 bodyoverflow: hidden犬庇。

反思了下對 css僧界、jshtml 的滾動相關(guān)操作的技能太淺臭挽,特別整理了這篇筆記捂襟。

Css 屬性 overflow

設(shè)置內(nèi)容溢出顯示狀態(tài)

div
  {
  width:150px;
  height:150px;
  overflow:scroll;
  }

設(shè)置div內(nèi)容溢出時顯示滾動條

可能的值

描述
visible 默認(rèn)值。內(nèi)容不會被修剪埋哟,會呈現(xiàn)在元素框之外。
hidden 內(nèi)容會被修剪郎汪,并且其余內(nèi)容是不可見的赤赊。
scroll 內(nèi)容會被修剪,但是瀏覽器會顯示滾動條以便查看其余的內(nèi)容煞赢。
auto 如果內(nèi)容被修剪抛计,則瀏覽器會顯示滾動條以便查看其余的內(nèi)容。
inherit 規(guī)定應(yīng)該從父元素繼承 overflow 屬性的值照筑。

Js 監(jiān)聽滾動事件

window.addEventListener('scroll', this.handleScroll); // 添加滾動事件
window.removeEventListener('scroll', this.handleScroll); // 刪除滾動事件

handleScroll: function (e) {
  console.log('瀏覽器滾動事件')
}

Js 獲取與滾輪與頂部距離小技巧

各瀏覽器下 scrollTop的差異 IE6/7/8:

  • 對于沒有doctype聲明的頁面里可以使用 document.body.scrollTop 來獲取 scrollTop高度 吹截;
  • 對于有doctype聲明的頁面則可以使用 document.documentElement.scrollTop; Safari:
  • safari 比較特別凝危,有自己獲取scrollTop的函數(shù) : window.pageYOffset 波俄; Firefox:
  • 火狐等等相對標(biāo)準(zhǔn)些的瀏覽器就省心多了,直接用 document.documentElement.scrollTop 蛾默;

chrome 不認(rèn)識 document.documentElement.scrollTop

如果有文檔聲明(即網(wǎng)頁第一句的docType)的情況下懦铺,標(biāo)準(zhǔn)瀏覽器是只認(rèn)識 documentElement.scrollTop 的,但chrome雖然我感覺比firefox還標(biāo)準(zhǔn)支鸡,但卻不認(rèn)識這個冬念,在有文檔聲明時,chrome也只認(rèn)識document.body.scrollTop.

由于在不同情況下牧挣,document.body.scrollTop與document.documentElement.scrollTop都有可能取不到值

document.body.scrollTop與document.documentElement.scrollTop兩者有個特點(diǎn)急前,就是同時只會有一個值生效。比如document.body.scrollTop能取到值的時候瀑构,document.documentElement.scrollTop就會始終為0裆针;反之亦然。所以,如果要得到網(wǎng)頁的真正的scrollTop值

// 方法一
var scrollTop = document.body.scrollTop + document.documentElement.scrollTop;
var scrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft;

// 方法二
var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);

// 方法三
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop || 0;

這樣就可以解決距離頂部的問題据块。

Js 判斷滾動到底部

判斷滾動條到底部码邻,需要用到DOM的三個屬性值,即scrollTop另假、clientHeight像屋、scrollHeight。

  • scrollTop 為滾動條在Y軸上的滾動距離边篮。
  • clientHeight 為內(nèi)容可視區(qū)域的高度己莺。
  • scrollHeight 為內(nèi)容可視區(qū)域的高度加上溢出(滾動)的距離。

從這個三個屬性的介紹就可以看出來戈轿,滾動條到底部的條件即為scrollTop + clientHeight == scrollHeight

//滾動條在Y軸上的滾動距離
function getScrollTop(){
  return  scrollTop = document.body.scrollTop + document.documentElement.scrollTop;
}
//文檔的總高度
function getScrollHeight(){
  return scrollHeight = document.body.scrollHeight + document.documentElement.scrollHeight;
}
//瀏覽器視口的高度
function getWindowHeight(){
  return document.compatMode == "CSS1Compat" ? windowHeight = document.documentElement.clientHeight : windowHeight = document.body.clientHeight;
}
window.onscroll = function(){
  if(getScrollTop() + getWindowHeight() == getScrollHeight()){
    alert("you are in the bottom!");
  }
};

帶動笑的滾動

使用 Jquery 實(shí)現(xiàn)

$('div').click(function(){$('html,body').animate({scrollTop:$('.a').offset().top}, 800);});

Js 滾動相關(guān)API

  • 網(wǎng)頁可見區(qū)域?qū)挘?document.body.clientWidth;
  • 網(wǎng)頁可見區(qū)域高: document.body.clientHeight;
  • 網(wǎng)頁可見區(qū)域?qū)挘?document.body.offsetWidth; (包括邊線的寬)
  • 網(wǎng)頁可見區(qū)域高: document.body.offsetHeight; (包括邊線的寬)
  • 網(wǎng)頁正文全文寬: document.body.scrollWidth;
  • 網(wǎng)頁正文全文高: document.body.scrollHeight;
  • 網(wǎng)頁被卷去的高: document.body.scrollTop; (當(dāng)前滾動條距離頂部的距離)
  • 網(wǎng)頁被卷去的左: document.body.scrollLeft;(當(dāng)前滾動條距離左邊的距離)
  • 網(wǎng)頁正文部分上: window.screenTop;
  • 網(wǎng)頁正文部分左: window.screenLeft;
  • 屏幕分辨率的高: window.screen.height;
  • 屏幕分辨率的寬: window.screen.width;
  • 屏幕可用工作區(qū)高度: window.screen.availHeight;
  • 屏幕可用工作區(qū)寬度:window.screen.availWidth;
  • scrollHeight: 獲取對象的滾動高度凌受。
  • scrollLeft:設(shè)置或獲取位于對象左邊界和窗口中目前可見內(nèi)容的最左端之間的距離
  • scrollTop:設(shè)置或獲取位于對象最頂端和窗口中可見內(nèi)容的最頂端之間的距離
  • scrollWidth:獲取對象的滾動寬度
  • offsetHeight:獲取對象相對于版面或由父坐標(biāo) offsetParent 屬性指定的父坐標(biāo)的高度
  • offsetLeft:獲取對象相對于版面或由 offsetParent 屬性指定的父坐標(biāo)的計算左側(cè)位置
  • offsetTop:獲取對象相對于版面或由 offsetTop 屬性指定的父坐標(biāo)的計算頂端位置
  • event.clientX 相對文檔的水平座標(biāo)
  • event.clientY 相對文檔的垂直座標(biāo)
  • event.offsetX 相對容器的水平坐標(biāo)
  • event.offsetY 相對容器的垂直坐標(biāo)
  • document.documentElement.scrollTop 垂直方向滾動的值
  • event.clientX+document.documentElement.scrollTop 相對文檔的水平座標(biāo)+垂直方向滾動的量
  • 要獲取當(dāng)前頁面的滾動條縱坐標(biāo)位置,用:
  • document.documentElement.scrollTop;
  • 而不是:
  • document.body.scrollTop;
  • documentElement 對應(yīng)的是 html 標(biāo)簽思杯,而 body 對應(yīng)的是 body 標(biāo)簽

拓展

  • JS滾輪事件(mousewheel/DOMMouseScroll)了解

    • 一張較全的IE7, IE10, Chrome, 以及FireFox胜蛉,鼠標(biāo)向下滾動圖表
    • 講解了 DOMMouseScrollonmousewheel的差異
    • 兼容的滾輪事件方法
    • 簡單的實(shí)例
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末色乾,一起剝皮案震驚了整個濱河市誊册,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暖璧,老刑警劉巖案怯,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異澎办,居然都是意外死亡嘲碱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門局蚀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麦锯,“玉大人,你說我怎么就攤上這事琅绅±敫溃” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵奉件,是天一觀的道長宵蛀。 經(jīng)常有香客問我,道長县貌,這世上最難降的妖魔是什么术陶? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮煤痕,結(jié)果婚禮上梧宫,老公的妹妹穿的比我還像新娘接谨。我一直安慰自己,他們只是感情好塘匣,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布脓豪。 她就那樣靜靜地躺著,像睡著了一般忌卤。 火紅的嫁衣襯著肌膚如雪扫夜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天驰徊,我揣著相機(jī)與錄音笤闯,去河邊找鬼。 笑死棍厂,一個胖子當(dāng)著我的面吹牛颗味,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牺弹,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼浦马,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了张漂?” 一聲冷哼從身側(cè)響起晶默,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鹃锈,沒想到半個月后荤胁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞧预,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屎债,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垢油。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盆驹。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滩愁,靈堂內(nèi)的尸體忽然破棺而出躯喇,到底是詐尸還是另有隱情,我是刑警寧澤硝枉,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布廉丽,位于F島的核電站,受9級特大地震影響妻味,放射性物質(zhì)發(fā)生泄漏正压。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一责球、第九天 我趴在偏房一處隱蔽的房頂上張望焦履。 院中可真熱鬧拓劝,春花似錦、人聲如沸嘉裤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屑宠。三九已至厢洞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侨把,已是汗流浹背犀变。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秋柄,地道東北人获枝。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像骇笔,于是被迫代替她去往敵國和親省店。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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

  • Window和document對象的區(qū)別 window對象window對象表示瀏覽器中打開的窗口window對象是...
    FConfidence閱讀 2,159評論 0 5
  • 一.首先介紹常用的屬性: HTML精確定位:scrollLeft,scrollWidth,clientWidth,...
    silingling閱讀 3,038評論 0 1
  • 一笨触、JS前言 (1)認(rèn)識JS 也許你已經(jīng)了解HTML標(biāo)記(也稱為結(jié)構(gòu))懦傍,知道了CSS樣式(也稱為表示),會使用HT...
    凜0_0閱讀 2,752評論 0 8
  • 網(wǎng)頁可見區(qū)域?qū)挘篸ocument.body.clientWidth網(wǎng)頁可見區(qū)域高:document.body.cl...
    LuckyS007閱讀 653評論 0 0
  • 是的芦劣,很難 不知道你有沒有這樣的體驗(yàn) 上學(xué)的時候粗俱,當(dāng)你發(fā)現(xiàn)老師錯了,并指出來的時候虚吟,她多半不會承認(rèn)寸认,可能還會惱羞成...
    還要個什么名字不成閱讀 311評論 0 0