由一個瀑布流導出對滾動條滾動距離,可視區尺寸,元素尺寸的內容的知識點

来源:https://www.cnblogs.com/freefy/archive/2018/09/15/9652310.html
-Advertisement-
Play Games

下麵是在實現瀑布流中的一小段代碼(當滾動條滾動距離+可視區高度>文檔高度,請求數據) 下麵複習一下知識點: 一、查看滾動條的滾動距離 js中有兩套方法可以查看滾動條的滾動距離 (1)window.pageXOffset/window.pageYOffset 查看滾動條橫軸和縱軸的滾動距離;但IE8以 ...


下麵是在實現瀑布流中的一小段代碼(當滾動條滾動距離+可視區高度>文檔高度,請求數據)

 window.onscroll = function () {
        var scrollHeight = document.documentElement.scrollTop || document.body.scrollTop;//滾動條縱軸滾動距離
        var clientHeight = document.documentElement.clientHeight || document.body.clientHeight;//可視區高度
        var pageHeight = oLi[getMinList(oLi)].offsetHeight;//元素高度(文檔高度)
        if(scrollHeight + clientHeight > pageHeight) {
            getData();//獲取ajax數據
        }
    }

下麵複習一下知識點:

一、查看滾動條的滾動距離

js中有兩套方法可以查看滾動條的滾動距離 

(1)window.pageXOffset/window.pageYOffset 查看滾動條橫軸和縱軸的滾動距離;但IE8以及以下的版本不相容

(2)針對IE,有了第二種方法:

document.body.scrollLeft/doucment.body.scrollTop
document.documentElement.scrollLeft/document.documentElement.scrollTop

雖然IE可以使用這兩個方法,但是這兩個方法不僅僅是IE才可以使用。
這裡要說明的是,這兩種方法要一起使用,因為瀏覽器的相容性問題,有的瀏覽器是document.body有值,有的是document.documentElement有值,但是所有的瀏覽器都只有一個有值,不會兩個都有或者一個都沒有,而且這裡的沒有值不代表是null,而是0,因此我們使用的時候一般都是兩個一起使用。
針對相容性的問題,我們現在就可以封裝一個函數,求滾動條滾動距離的方法

function getScrollOffset(){
      if(window.pageXOffset) {
            return {
                  x: window.pageXOffset,
                  y: window.pageYOffset
            }
      }
      return {
            y: document.body.scollTop + document.documentElement.scrollTop,
            x: document.body.scrollLeft + document.documentElement.scrollLeft;
}

 當瀏覽器不是IE的時候,可以直接使用window.pageXOffset和window.pageYOffset的方法,當沒有這兩個的時候,我們才需要來計算。

 二、查看視口的尺寸

註:視口就是我們的可視區,因為我們改變瀏覽器的大小的時候會改變可視區的大小

有兩種方法查看視口尺寸

(1)window.innerHeight/window.innerWidth;這個方法可以直接獲取到當前可視區的寬高,但是依然很遺憾的是IE8以及以下的版本不相容。

(2)這個時候就需要第二套方法了:  
  在標準模式下,doucment.documentElement.clientWidth/document.documentElement.clientHeight  在任何瀏覽器都相容。  

  在怪異模式(混雜模式)下,document.body.clientWidth/document.body.clientHeight才能查看視口大小,而不能使用上面標準模式下的方法。

• 什麼是怪異模式和標準模式呢?
瀏覽器的渲染模式有兩種:標準模式和怪異模式。我們常用的是標準模式,怪異模式是防止瀏覽器升級版本過高對後面版本你的代碼不相容,讓瀏覽器可以向後相容其他低版本的代碼的法規則,比如IE6的怪異模式下可以相容IE5個IE4的語法。
• 我們如何變成怪異模式呢?
其實很簡單,只需要把我們html代碼的第一行的<!DOCTYPE HTML>去掉就可以變成怪異模式了,而加上這一行代碼就可以變成標準模式。

• 如何判斷怪異模式還是標準模式?
document上中有一個方法叫做compatMode,當瀏覽器處於怪異模式的時候會返回字元串“BackCompat”,在標準模式下可以返回“CSS1Compat”,通過這個方法我們就可以判斷了。
知道了什麼是標準模式和怪異模式以及如何判斷的情況下,我們就可以封裝一個相容性的函數,返回瀏覽器的視口大小。

  function getViewportOffset () {
      if(window.innerWidth) {
            return {
                  w: window.innerWidth,
                  h: window.innerHeight
            }
      }
      if(document.compatMode == 'CSS1Compat') {
            return {
                  w: document.documentElement.clientWidth,
                  h: document.documentElement.clientHeight
      }else {
            return {
                  w: document.body.clientWidth,
                  h: document.body.clientHeight
            }
      }
}  

三、查看元素尺寸

(1)dom.getBoundingClientRect()
在獲取的dom元素上,有一個getBoundingClientRect方法,這個方法可以獲取到元素的寬高和左上點的位置以及有下點的位置(width、height、top、left、right、bottom),註意這裡的寬高是指除去了margin的盒子模型的寬高。
但是老版本的IE瀏覽器沒有實現width和height,那麼我們在老版本的IE計算寬高的時候就需要用bottom-top和right-left來計算寬高值了。
還有一點需要註意的是,這裡的寬高也不是實時更新的,數據只是一個副本。
我們依然可以封裝一個函數,可以返回元素的寬高。

Element.getElementOffset() {
      var objData = this.getBoundingClientRect();
      if(objData.width) {
            return {
                  w: objData.width,
                  h: objData.height
            }
      }else {
            return {
                  w: objData.right - objData.left,
                  h: objData.bottom - objData.top
            }
      }
}

(2)domEle.offsetWidth/dom.offsetHeight
雖然前面有一個ele.getBoundingClientRect()方法,但是由於這個方法名字是在太長了,因此用的並不是非常多,相比較而言,這兩個dom元素的屬性用的更多一些。
這裡獲取的寬高值和上面的一樣,都是除去margin後的盒子模型的寬高

四、查看元素的位置

dom.offsetLeft/dom.offsetTop這兩個值分別是元素距離左側和上側的距離,這裡的值是相對於有定位的父級而言的,如果沒有有定位的父級的話,才是相對於文檔的坐標。

那麼現在就來了一個問題:如何找到有定位的父級呢?
domEle上面還有一個屬性是offsetParent,這個屬性可以查看到元素的有定位的父級,如果沒有的話就會返回body,而body的offsetParent則是null。
我們利用上面的信息,可以來封裝一個函數,求元素的相對於文檔的坐標。

Element.prototype.getPosition = function (){
      if (!this.offsetParent){
            return {
                  "w": this.offsetLeft,
                  "h": this.offsetTop
            }
      }
      var width = this.offsetLeft,
            height = this.offsetTop,
            ele = this.offsetParent;
      while (ele.offsetParent){
            width += this.offsetParent.offsetLeft;
            height += this.offsetParent.offsetTop;
            ele = ele.offsetParent;
      }
      return {
            "w": width,
            "h": height
      }
}

 

五、滾動條滾動
讓滾動條滾動的方法有三個:scroll、scrollTo、scrollBy;這三個方法都有兩個參數,分別是x值和y值。

前兩個方法的作用一模一樣,都是讓滾動條滾動到(x,y)的位置,但是最後一個scrollBy有一些區別,它是讓滾動條相對於上一個位置滾動多少距離。
我們可以簡單的用這個方法來實現一個自動閱讀的功能:
setInterval(function () {
scrollBy(0, 10);
},50);

 根據上面的總結,可以將一開始的代碼段完善:

    function getScrollOffset(){
        if(window.pageXOffset){           
            return{
                x:window.pageXOffset,
                y:window.pageYOffset
            }
        }
        return {
            x:document.documentElement.scrollLeft||document.body.scrollLeft,
            y:document.documentElement.scrollTop||document.body.scrollTop
            
        }
    }
    function getClient (){
        if(window.innerHeight){
            return{
                w:window.innerWidth,
                h:window.innerHeight
            }
        }
        //標準模式
        if(document.compatMode=='CSS1Compat'){
            return{
                w:document.documentElement.clientWidth,
                h:document.documentElement.clientHeight
            }
        }
        else{
            return{
                w:document.body.clientWidth,
                h:document.body.clientHeight
            }
        }
    }

    window.onscroll = function () {
        var scrollHeight = getScrollOffset().y//滾動條縱軸滾動距離
        var clientHeight = getClient().h//可視區高度
        var pageHeight = oLi[getMinList(oLi)].offsetHeight;//元素高度(文檔高度)
        if(scrollHeight + clientHeight > pageHeight) {
            getData();//獲取ajax數據
        }
    }
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、xcall.sh 批量命令腳本,例:xcall.sh jps ,查看hadoop101~ hadoop104的jps進程 2、xsync.sh 集群同步文件,分發文件腳本,例:xsync.sh /usr/loacl/test.sh,在hadoop101~hadoop104上的/usr/local ...
  • 一般使用dp,不使用px。sp啥時候用呢?給TextView設置文字大小的時候用。 ...
  • 線性佈局: 相對佈局: ...
  • 第一種:內部類的方式 第二種:匿名內部類 第三種按鈕點擊事件:讓當前類實現onClickListener介面。 第四種按鈕的點擊事件: 如果將click方法中的View v去掉或者方法名不是click都會報異常。 原因是什麼呢? 查看View源碼得知: 查看View源碼裡面的onClick屬性: 里 ...
  • 自古開篇先說兩句,寫這些筆記不是學慣用的,主要是後續分享一些遇到的坑,碰到過什麼樣的問題,怎麼去解決,如果你不是一個很耐心無看文章的人,建議去 網易雲課堂找一些課程,跟著別人的腳步或許會更有動力,我的筆記也是從哪裡學習,記一些小筆記,我覺得大學里做這件事是最合適的了,當然最重要的是有沒有興趣,如果沒 ...
  • 新博客地址 http://wossoneri.github.io/2018/09/15/[Android][Framework]create system service/ 做系統開發,有時候需要自己定義一些介面供App使用, 同時為了方便維護管理,就會需要自己建立一個服務,把新的功能集中在一起。下 ...
  • 運行電話撥號器,需要加這個許可權,否則不會打通電話。這個許可權是用戶許可權,是谷歌工程師為了跟自己撇清關係,用戶需要許可權的時候自己加。 運行android程式的時候提示:ActivityManager: Warning: Activity not started, its current task has ...
  • 這裡介紹一個可以快速創建 React UI 組件庫使用、演示文檔的項目:Docz ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...