成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

帶型帶秀專(zhuān)題之 Lazy Load (三)

everfight / 1876人閱讀

摘要:而和則表示該容器中頁(yè)面視圖區(qū)的大小減去邊框?qū)挾?。語(yǔ)法實(shí)際上,返回的值是一個(gè)雙精度浮點(diǎn)值,指示文檔當(dāng)前從原點(diǎn)垂直滾動(dòng)的像素?cái)?shù),其中正值表示向上滾動(dòng)。除此之外,舊版本不支持這些屬性,必須通過(guò)檢查其他非標(biāo)準(zhǔn)屬性來(lái)解決。

博客地址:https://guitong.github.io/blo...

上一節(jié)中,我們分析了 jQuery lazyload 源碼,其中有這么一段:

  /* 在jQuery命名空間內(nèi)定義了便捷的方法,判斷圖片是否在容器視口范圍內(nèi) */
  $.belowthefold = function (element, settings) {...}
  $.rightoffold = function (element, settings) {...}
  $.abovethetop = function (element, settings) {...}
  $.leftofbegin = function (element, settings) {...}
  $.inviewport = function (element, settings) {...}

說(shuō)實(shí)話(huà),這才是我最感興趣的內(nèi)容。那么實(shí)現(xiàn)一個(gè)lazyload,應(yīng)該怎樣判斷圖片與瀏覽器可見(jiàn)區(qū)域的相對(duì)位置呢,現(xiàn)在以$.belowthefold方法為例,看一下其實(shí)現(xiàn)方式:

$.belowthefold = function(element, settings) {
        var fold;

        if (settings.container === undefined || settings.container === window) {
            fold = (window.innerHeight ? window.innerHeight : $window.height()) + $window.scrollTop();
        } else {
            fold = $(settings.container).offset().top + $(settings.container).height();
        }

        return fold <= $(element).offset().top - settings.threshold;
    };

首先這段代碼的目的是判斷當(dāng)前元素(圖片)是否在瀏覽器視口的下方。

變量fold我理解為當(dāng)前文檔已“折疊”的高度,也就是當(dāng)前瀏覽器視口的最底部至文檔最頂部的距離。與fold變量值相比較的值是$(element).offset().top - settings.threshold,那么這個(gè)值代表什么呢?

seetings.threshold是我們上節(jié)提到過(guò)的臨界值,默認(rèn)為0,這里我們可以先將其忽略。jQuery對(duì)象的offset()方法定義如下:

Get the current coordinates of the first element in the set of matched elements, relative to the documents.

也就是當(dāng)前元素相對(duì)于文檔的坐標(biāo)。它的top值即為元素到文檔頂部的距離。

那么也就不難理解,如果這個(gè)值大于等于文檔已“折疊”的高度值,它的位置就在瀏覽器視口的下方。

然而這些jQuery方法也是封裝過(guò)的方法,我們還需要探究它們的實(shí)現(xiàn)方式。

一、如何得到瀏覽器視口(即可見(jiàn)區(qū)域)的大小

以下內(nèi)容參考自大紅本 — 《JavaScript高級(jí)程序設(shè)計(jì)》,第三版,第八章

跨瀏覽器確定一個(gè)窗口的大小不是一件簡(jiǎn)單的事。IE9+、Firefox、Safari、Opera和Chrome均為此提供了4個(gè)屬性:innerWidth 、innerHeightouterWidth、outerHeight。在IE9+、Safari和Firefox中,outerWidthouterHeight返回瀏覽器窗口本身的尺寸(無(wú)論是最外層的window對(duì)象還是從某個(gè)框架訪(fǎng)問(wèn))。在Opera中,這兩個(gè)屬性的值表示頁(yè)面視圖容器(這里所謂的“頁(yè)面視圖容器”指的是Opera中單個(gè)標(biāo)簽頁(yè)對(duì)應(yīng)的瀏覽器窗口)的大小。而innerWidthinnerHeight則表示該容器中頁(yè)面視圖區(qū)的大小(減去邊框?qū)挾龋?。在Chrome中,outerWIdthouterHeightinnerWidth、innerHeight返回相同的值,即視口(viewport)大小而非瀏覽器窗口大小。

IE8及更早版本沒(méi)有提供取得當(dāng)前瀏覽器窗口尺寸的屬性;不過(guò),它通過(guò)DOM提供了頁(yè)面可見(jiàn)區(qū)域的相關(guān)信息。

在IE、Firefox、Safari、Opera和Chrome中,document.documentElement.clientWidthdocument.documentElement.clientHeight中保存了頁(yè)面視口的信息。在IE6中,這些屬性必須在標(biāo)準(zhǔn)模式下才有效;如果是混雜模式,就必須通過(guò)document.body.clientWidthdocument.body.clientHeight取得相同信息。而對(duì)于混在模式下的Chrome,則無(wú)論通過(guò)document.documentElement還是document.body中的clientWidthclientHeight屬性,都可以取得取得視口的大小。

(跑題了?? )

雖然最終無(wú)法確定瀏覽器窗口本身的大小,但卻可以取得頁(yè)面視口的大小,如下所示:

var pageWidth = window.innerWidth,
    pageHeight = window.innerHeight;
if (typeof pageWidth != "number") {
    if (document.compatMode == "CSS1Compat") {
          pageWidth = document.documentElement.clientWidth;
          pageHeight = document.documentElement.clientHeight;
    } else {
          pageWidth = document.body.clientWidth;
          pageHeight = document.body.clientHeight;
    }
}

這段代碼很好理解,值得注意的是document.compatMode這個(gè)屬性。該值表明當(dāng)前文檔的渲染模式為“混雜模式”還是“標(biāo)準(zhǔn)模式”。當(dāng)值為"CSS1Compat"代表標(biāo)準(zhǔn)規(guī)范模式;當(dāng)值為"BackCompat"代表混雜模式。

二、如果得到文檔在在垂直/水平方向滾動(dòng)的距離

這里以垂直方向?yàn)槔?/p>

先來(lái)看一個(gè)stackoverflow上的回答,翻譯如下:

獲取滾動(dòng)距離的標(biāo)準(zhǔn)方法為window.scrollY。Chrome、Firefox、Opera、Safari及IE Edge(或更高版本)均支持此方法。如果您僅需要支持這些瀏覽器,使用這個(gè)屬性即可。

IE >= 9 支持一個(gè)類(lèi)似的屬性window.pageYOffset,為了保證兼容性,在現(xiàn)代瀏覽器中會(huì)返回與window.scrollY相同的值,盡管它可能在某些時(shí)候被棄用。

使用document.documentElement.scrollTopdocument.body.scrollTop的問(wèn)題是,它們并不是總是都被定義了滾動(dòng)。例如,Chrome和Safari將滾動(dòng)定義在元素,而Firefox則定義在了document.documentElement返回的元素上。這不是標(biāo)準(zhǔn)化的,并且在未來(lái)版本的瀏覽器中可能會(huì)發(fā)生變化。然而,如果scrollYpageYOffset不存在,則這是獲取滾動(dòng)位置的唯一方法。

遂總結(jié)如下:

window.scrollY || window.pageYOffset || document.body.scrollTop + (document.documentElement && document.documentElement.scrollTop || 0)

經(jīng)過(guò)測(cè)試,這個(gè)方法是可行的。不過(guò),正如文中所說(shuō),果然在未來(lái)版本的瀏覽器中發(fā)生了變化。在最新的Chrome、Safari、Firefox中測(cè)試發(fā)現(xiàn),Chrome與Firefox表現(xiàn)相同,document.documentElement.scrollTop返回滾動(dòng)值,而document.body.scrollTop返回0,Safari則與它們相反。

再來(lái)看一下MDN上對(duì)window.scrollY的解釋。

window接口的只讀屬性值scrollY返回文檔當(dāng)前垂直滾動(dòng)距離的像素值。這個(gè)值在現(xiàn)在瀏覽器中是亞像素精準(zhǔn)的,這意味著它不一定是一個(gè)整數(shù)。您可以從scrollY屬性獲取文檔水平滾動(dòng)的像素值。

# 語(yǔ)法

var y = window.scrollY

實(shí)際上,返回的值是一個(gè)雙精度浮點(diǎn)值,指示文檔當(dāng)前從原點(diǎn)垂直滾動(dòng)的像素?cái)?shù),其中正值表示向上滾動(dòng)。如果文檔在子像素精準(zhǔn)的設(shè)備上呈現(xiàn),則返回的值也是子像素精準(zhǔn)的,并且可能包含一個(gè)小數(shù)分量。如果文檔沒(méi)有向上或向下滾動(dòng),則滾動(dòng)值是 0 。

如果你需要一個(gè)整型值,可以使用Math.round()方法

用更技術(shù)的話(huà)說(shuō),scrollY返回當(dāng)前視口頂邊的Y坐標(biāo),如果沒(méi)有視口,則返回 0 。

# 示例

// make sure and go down to the second page
if (window.scrollY) {
  window.scroll(0, 0); // 重置滾動(dòng)條位置
}

window.scrollByPages(1);

(這個(gè)示例 出現(xiàn)在這里感覺(jué)怪怪的)

# 注意事項(xiàng)

使用此屬性來(lái)檢查使用相對(duì)滾動(dòng)方法時(shí)(如;scrollBy()scrollByLines()、scrollByPages())文檔是否尚未滾動(dòng)。

pageYOffset屬性是scrollY屬性的別名:

window.pageYOffset == window.scrollY // always true

考慮到跨瀏覽器兼容性,使用window.pageYOffset替代window.scrollY。除此之外,舊版本 IE(< 9)不支持這些屬性,必須通過(guò)檢查其他非標(biāo)準(zhǔn)屬性來(lái)解決。完全兼容的的例子如下:

var supportPageOffset = window.pageXOffset !== undefied;
var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");

var scrollX = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft;
var scrollY = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.document.scrollTop : document.body.scrollTop;

# 規(guī)范

CSS Object Model (CSSOM) View ModuleThe definition of "window.scrollY" in that specification.

==================== 太平洋分割線(xiàn)=======================

那么可以總結(jié)一下了。

要獲得頁(yè)面當(dāng)前的滾動(dòng)值,window.scrollY是基于標(biāo)準(zhǔn)的方法。然而考慮到跨瀏覽器兼容性,應(yīng)該使用window.pageYOffset,該屬性是window.scrollY的別名,被絕大多數(shù)現(xiàn)代瀏覽器所支持。對(duì)于低版本IE瀏覽器(< 9),可以判斷渲染模式(標(biāo)準(zhǔn)or混雜)來(lái)選擇使用document.documentElement.scrollTop/Leftdocument.body.scrollTop/Left方法。

推薦:

var supportPageOffset = window.pageXOffset !== undefined;
var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");

var scrollX = supportPageOffset ? window.pageXOffset : isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft;
var scrollY = supportPageOffset ? window.pageYOffset : isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop;
三、???

發(fā)現(xiàn)跑題了,不是要看一下jQuery方法的源碼嗎???不過(guò)應(yīng)該大同小異。

明白了上面兩個(gè)重要的方法,實(shí)現(xiàn)一個(gè)兼容性良好lazyload就變得輕而易舉。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89441.html

相關(guān)文章

  • 帶型帶秀專(zhuān)題 Lazy Load (一)

    摘要:今天開(kāi)始帶型帶秀專(zhuān)題。專(zhuān)題第二節(jié)會(huì)深入到源碼。在可視圖片加載后,瀏覽器將處于就緒狀態(tài)。只需要將該容器元素作為對(duì)象傳遞。默認(rèn)地,循環(huán)會(huì)在找到第一個(gè)視口外的圖像時(shí)停止。但是某些頁(yè)面的布局不符合該假設(shè)。最差的情況是該值為實(shí)際圖片的數(shù)量。 今天開(kāi)始帶型帶秀專(zhuān)題 -- Lazy Load。先從使用比較廣泛的 jQuery Lazy Load 插件開(kāi)始,逐步深入。該插件已經(jīng)開(kāi)發(fā)到了第二版,有興趣的...

    wangzy2019 評(píng)論0 收藏0
  • 帶型帶秀專(zhuān)題 Lazy Load (二)

    摘要:參考文章使用及源碼分析關(guān)于插件的基本介紹和使用請(qǐng)看上一篇文章。顯示方法默認(rèn)為,也可以設(shè)置為,源碼中隱藏了一個(gè)配置屬性,用于設(shè)置動(dòng)畫(huà)運(yùn)行的時(shí)間。是否忽略隱藏的元素設(shè)置為時(shí)會(huì)忽略處理隱藏的元素。在觸發(fā)事件時(shí)執(zhí)行的回調(diào)。 參考文章:jQuery.lazyload使用及源碼分析 關(guān)于 jQuery lazyload 插件的基本介紹和使用請(qǐng)看上一篇文章。(水水一章啦-。-) Overview 讓...

    tigerZH 評(píng)論0 收藏0
  • JavaScript專(zhuān)題惰性函數(shù)

    摘要:專(zhuān)題系列第十五篇,講解惰性函數(shù)需求我們現(xiàn)在需要寫(xiě)一個(gè)函數(shù),這個(gè)函數(shù)返回首次調(diào)用時(shí)的對(duì)象,注意是首次。解決四惰性函數(shù)不錯(cuò),惰性函數(shù)就是解決每次都要進(jìn)行判斷的這個(gè)問(wèn)題,解決原理很簡(jiǎn)單,重寫(xiě)函數(shù)。 JavaScript 專(zhuān)題系列第十五篇,講解惰性函數(shù) 需求 我們現(xiàn)在需要寫(xiě)一個(gè) foo 函數(shù),這個(gè)函數(shù)返回首次調(diào)用時(shí)的 Date 對(duì)象,注意是首次。 解決一:普通方法 var t; functio...

    Jackwoo 評(píng)論0 收藏0
  • Spring專(zhuān)題Bean初始化源碼分析(1)

    摘要:初始化我們知道容器初始化后會(huì)對(duì)容器中非懶加載的,單例的以及非抽象的定義進(jìn)行的初始化操作,所以我們分析源碼的入口也就是在容器初始化的入口,分析容器初始化后在什么地方開(kāi)始第一次的初始化。 前言 Spring IOC容器在初始化之后會(huì)對(duì)容器中非懶加載的,單例的以及非抽象的bean定義進(jìn)行bean的初始化操作,同時(shí)會(huì)也涉及到Bean的后置處理器以及DI(依賴(lài)注入)等行為。對(duì)于Bean的初始化,...

    harryhappy 評(píng)論0 收藏0
  • react-lazy-load粗讀

    摘要:粗讀近來(lái)沒(méi)什么特別要做的事,下班回來(lái)的空閑時(shí)間也比較多,所以抽空看看懶加載是怎么實(shí)現(xiàn)的,特別是看了下的庫(kù)的實(shí)現(xiàn)。之先別關(guān)注,按他給注釋說(shuō)測(cè)試用。之是組件綁定事件時(shí)會(huì)觸發(fā)的函數(shù)。 react-lazy-load粗讀 近來(lái)沒(méi)什么特別要做的事,下班回來(lái)的空閑時(shí)間也比較多,所以抽空看看懶加載是怎么實(shí)現(xiàn)的,特別是看了下 react-lazy-load 的庫(kù)的實(shí)現(xiàn)。 懶加載 這里懶加載場(chǎng)景不是路由...

    dailybird 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<