最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript實(shí)現(xiàn)圖片懶加載的兩種方式

 更新時(shí)間:2024年04月19日 08:24:21   作者:挖稀泥的工人  
現(xiàn)在的科技發(fā)達(dá),圖片的資源占比越來越大,對(duì)圖片在頁(yè)面的優(yōu)化已經(jīng)成為前端開發(fā)必備的技術(shù)之一,難的圖片懶加載方法咱們看著頭大,簡(jiǎn)單,易懂的才適合我們程序員,所以本文給大家介紹了JavaScript實(shí)現(xiàn)圖片懶加載的兩種方式,需要的朋友可以參考下

引言

現(xiàn)在的科技發(fā)達(dá),圖片的資源占比越來越大,對(duì)圖片在頁(yè)面的優(yōu)化已經(jīng)成為前端開發(fā)必備的技術(shù)之一,難的圖片懶加載方法咱們看著頭大,簡(jiǎn)單,易懂的才適合我們程序員。

很好,開始第一步將圖片的標(biāo)簽放好,設(shè)定一個(gè)data-origin標(biāo)簽在img當(dāng)中,這樣使用data-的命名方式是為了與HTML5的自定義數(shù)據(jù)屬性約定保持一致。

簡(jiǎn)單的方式

思路就是

  • 先獲取到可視區(qū)域,我們使用clientHeight,它可以獲取到html元素的客戶端高度。
  • 獲取到帶有data-origin標(biāo)簽的全部img屬性
  • 獲取每張圖片相對(duì)視窗口的高度,使用getBoundingClientRect,其中包含各種元素相對(duì)于視口的信息和元素本身的信息。
  • 一旦圖片相對(duì)于視窗頂部的距離小于可視區(qū)域高度,那就將data-origin標(biāo)簽的url賦給src,最后清除data-origin標(biāo)簽。
<style>
        img{
            height: 300px;
            width: 300px;
            margin-bottom: 50px;
            display: block;
        }
    </style>
</head>
<body>
    <img src="" data-origin="https://t7.baidu.com/it/u=2604797219,1573897854&fm=193&f=GIF" alt="">
    <img src="" data-origin="https://img1.baidu.com/it/u=435134468,1942448903&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=889" alt="">
    <img src="" data-origin="https://img0.baidu.com/it/u=3628503530,464378779&fm=253&fmt=auto&app=120&f=JPEG?w=1200&h=800">
    <img src="" data-origin="https://img2.baidu.com/it/u=855369075,175194576&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500" alt="">
    <img src="" data-origin="https://img2.baidu.com/it/u=2004708195,3393283717&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500" alt="">
    <img src="" data-origin="https://img1.baidu.com/it/u=1331863463,2594844301&fm=253&fmt=auto?w=1067&h=800" alt="">
    <img src="" data-origin="https://img1.baidu.com/it/u=1331863463,2594844301&fm=253&fmt=auto?w=1067&h=800" alt="">
    <img src="" data-origin="https://img0.baidu.com/it/u=2788901948,3907873318&fm=253&fmt=auto?w=500&h=281" alt="">
    <img src="" data-origin="https://img2.baidu.com/it/u=811993169,635123395&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=889" alt="">
    <img src="" data-origin="https://img0.baidu.com/it/u=924031950,2251460669&fm=253&fmt=auto&app=138&f=JPEG?w=1105&h=500" alt="">

<script>
    //獲取可視區(qū)域的高度    offsetHeight包含外部高度(邊框)
    const viewHeight = document.documentElement.clientHeight  //window.innerHeight
    // console.log(viewHeight);
    function lazyLoad(){
        const imgs = document.querySelectorAll('img[data-origin]') //屬性選擇
        console.log(imgs);
        imgs.forEach(item =>{
            let res = item.getBoundingClientRect()
            // console.log(res);
            if(res.top < viewHeight){
                item.src = item.dataset.origin
                item.removeAttribute('data-origin')
            }
        })

        // 獲取可視區(qū)域的高度
    // const viewHeight = document.documentElement.clientHeight
    // const io = new IntersectionObserver(
    //   (entries) => {
    //     entries.forEach(entry => {
    //       if (entry.isIntersecting) {
    //         entry.target.src = entry.target.dataset.original || ''
    //         entry.target.removeAttribute('data-original')
    //         io.unobserve(entry.target)
    //       }
    //     })
    //   },
    //   {
    //     threshold: 0
    //   }
    // )
    // const imgs = document.querySelectorAll('img[data-original]')
    // imgs.forEach(item => {
    //   io.observe(item)
    // })



    }

    document.addEventListener('scroll',lazyLoad)

    lazyLoad()

</script>

</body>

第二個(gè)方法

第二個(gè)方法就相對(duì)更復(fù)雜一些,通過判斷某個(gè)元素和父元素交叉比例來判斷是否需要懶加載。是異步監(jiān)聽的。當(dāng)交叉比例達(dá)到某個(gè)值就會(huì)觸發(fā)回調(diào)函數(shù)。我們這里使用的是IntersectionObserver方法,用一個(gè)外部box包裹所有圖片,讓圖片超出box就滾動(dòng)??戳松厦娴姆椒ǎ@個(gè)方法也就明白在干什么了。

    #box{
      width: 100vw;
      height: 100vh;
      overflow: scroll;
    }
    img{
      height: 300px;
      margin-bottom: 50px;
      display: block;
    }


    const viewHeight = document.documentElement.clientHeight
    const io = new IntersectionObserver(
      (entries) => {
        entries.forEach(entry => {
        //判斷是否進(jìn)入可視區(qū)
          if (entry.isIntersecting) {
            entry.target.src = entry.target.dataset.original || ''
            //移除標(biāo)簽
            entry.target.removeAttribute('data-original')
            io.unobserve(entry.target)
          }
        })
      },
      {
      取值范圍從0~1,表示交叉比例
        threshold: 0
      }
    )
    
    //監(jiān)聽每一張圖片
    const imgs = document.querySelectorAll('img[data-original]')
    imgs.forEach(item => {
      io.observe(item)
    })

到此這篇關(guān)于JavaScript實(shí)現(xiàn)圖片懶加載的兩種方式的文章就介紹到這了,更多相關(guān)JavaScript圖片懶加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)視頻播放器發(fā)送彈幕

    微信小程序?qū)崿F(xiàn)視頻播放器發(fā)送彈幕

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)視頻播放器發(fā)送彈幕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • js三種排序算法分享

    js三種排序算法分享

    近來無(wú)聊,翻出來大學(xué)時(shí)候的數(shù)據(jù)結(jié)構(gòu)教材來看。突然想起,大學(xué)時(shí)候就想過用js實(shí)現(xiàn)基本的排序算法的事情,反正閑來無(wú)事,便寫出來后記錄于此
    2012-08-08
  • js腳本加載失敗問題解決辦法

    js腳本加載失敗問題解決辦法

    在項(xiàng)目中經(jīng)常會(huì)用到動(dòng)態(tài)加載js,下面這篇文章主要給大家介紹了關(guān)于js腳本加載失敗問題的解決辦法,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Javascript 繪制 sin 曲線過程附圖

    Javascript 繪制 sin 曲線過程附圖

    這篇文章主要介紹了Javascript 繪制 sin 曲線過程,需要的朋友可以參考下
    2014-08-08
  • JS動(dòng)態(tài)修改iframe內(nèi)嵌網(wǎng)頁(yè)地址的方法

    JS動(dòng)態(tài)修改iframe內(nèi)嵌網(wǎng)頁(yè)地址的方法

    這篇文章主要介紹了JS動(dòng)態(tài)修改iframe內(nèi)嵌網(wǎng)頁(yè)地址的方法,涉及javascript動(dòng)態(tài)修改iframe中src屬性的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 深入理解選擇框腳本[推薦]

    深入理解選擇框腳本[推薦]

    選擇框是通過<select>和<option>元素創(chuàng)建的,又稱為下拉列表框。為了方便與這個(gè)控件交互,除了所有表單字段共有的屬性和方法外,javascript還提供了一些屬性和方法。本文將詳細(xì)介紹選擇框腳本
    2016-12-12
  • JavaScript實(shí)現(xiàn)函數(shù)執(zhí)行攔截的多種方法

    JavaScript實(shí)現(xiàn)函數(shù)執(zhí)行攔截的多種方法

    函數(shù)執(zhí)行攔截是JavaScript中強(qiáng)大的元編程技術(shù),可以實(shí)現(xiàn)日志記錄、性能監(jiān)控、權(quán)限控制等功能,本文將深入探討多種函數(shù)攔截方法,從基礎(chǔ)到高級(jí),幫助您全面掌握這一技術(shù),需要的朋友可以參考下
    2025-06-06
  • Bootstrap基本樣式學(xué)習(xí)筆記之表單(3)

    Bootstrap基本樣式學(xué)習(xí)筆記之表單(3)

    這篇文章主要介紹了Bootstrap學(xué)習(xí)筆記之表單基本樣式的相關(guān)資料,為大家分享了三種表單樣式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 原生JS實(shí)現(xiàn)的簡(jiǎn)單輪播圖功能【適合新手】

    原生JS實(shí)現(xiàn)的簡(jiǎn)單輪播圖功能【適合新手】

    這篇文章主要介紹了原生JS實(shí)現(xiàn)的簡(jiǎn)單輪播圖功能,結(jié)合實(shí)例形式分析了基于javascript定時(shí)器控制頁(yè)面元素動(dòng)態(tài)變換實(shí)現(xiàn)輪播圖的相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08
  • 微信小程序?qū)崿F(xiàn)文字長(zhǎng)按復(fù)制與一鍵復(fù)制功能全過程

    微信小程序?qū)崿F(xiàn)文字長(zhǎng)按復(fù)制與一鍵復(fù)制功能全過程

    微信小程序開發(fā)是依托微信的,所以他的代碼是嵌入在微信的原始代碼之中的,這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)文字長(zhǎng)按復(fù)制與一鍵復(fù)制功能的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評(píng)論

抚州市| 乃东县| 舒兰市| 剑河县| 吴江市| 宁都县| 博乐市| 大田县| 孟州市| 沈阳市| 闸北区| 西充县| 桃源县| 溆浦县| 南宁市| 商丘市| 泰安市| 高唐县| 南乐县| 奉化市| 玉龙| 威宁| 会同县| 莱芜市| 房产| 舟曲县| 乌鲁木齐县| 民权县| 贡山| 邓州市| 新营市| 清新县| 门源| 安徽省| 迁西县| 景泰县| 纳雍县| 昔阳县| 尚义县| 桑日县| 怀安县|