<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
懶載入也可以叫做延遲載入,當存取一個頁面的時候,先把img元素伙食其他元素的背景圖片路徑替換成一張大小為1*1px圖片的路徑(這樣只需要請求一次,俗稱佔點陣圖);
只有當圖片出現在瀏覽器的可視區域內時,才這隻圖片真正的路徑,讓圖片顯示出來,這就是圖片懶載入。
當頁面很多,內容很豐富的時候,頁面很長,圖片較多,比如各個商城頁面,要是頁面載入就一次性載入完畢,就需要等很長的時間
按需載入,頁面載入速度快,節約流量,使用者體驗感好,減少伺服器壓力
頁面中的img元素,如果沒有src屬性, 瀏覽器就不會發出請求去下載圖片,只有通過javascript設定了圖片路徑,瀏覽器才會傳送請求。
懶載入的原理就是先在頁面中把所有的圖片統一使用一張佔點陣圖進行佔位,把真正的路徑存在元素的"data-url"(這個名字起個自己認識好記的就行)屬性裡,要用的時候就取出來放在src裡面
<ul> <li><img src="../img/loading.gif" alt="" data-src="../img/1.jpg"></li> <li><img src="../img/loading.gif" alt="" data-src="../img/2.jpg"></li> <li><img src="../img/loading.gif" alt="" data-src="../img/3.jpg"></li> <li><img src="../img/loading.gif" alt="" data-src="../img/4.jpg"></li> <li><img src="../img/loading.gif" alt="" data-src="../img/5.jpg"></li> <li><img src="../img/loading.gif" alt="" data-src="../img/6.jpg"></li> <li><img src="../img/loading.gif" alt="" data-src="../img/7.jpg"></li> <li><img src="../img/loading.gif" alt="" data-src="../img/8.jpg"></li> </ul>
方式1:通過 元素距離頂部的高度 - 卷軸捲動的高度 < =視窗視覺化區域高度 進行判斷;
/*元素距離頂部的高度-頁面被捲去的高度<=瀏覽器可視區域的高度 如果條件滿足,就可以替換圖片的src屬性 */ //獲取圖片 const imgArr = document.querySelectorAll("img"); //初始化執行 lazyLoad(); //監聽使用者是否捲動卷軸,但是這高觸發事件,所以需要結合節流優化 window.addEventListener("scroll", throttle(lazyLoad, 2000)); function lazyLoad() { imgArr.forEach(item => { //1、獲取圖片距離頂部的高度 const imgOffsetTop = item.offsetTop; //2、獲取瀏覽器的可視區域的高度 const wHeight = window.innerHeight; //3、獲取頁面被捲去的高度 const scrollHeight = document.documentElement.scrollTop; //判斷圖片是否將要出現 if (imgOffsetTop - scrollHeight <= wHeight) { item.src = item.getAttribute("data-src"); } }) } //節流 function throttle(fun, time = 250) { let lastTime = 0;//最後一次執行的時間 return function (...args) { const now = new Date().getTime();//獲取當前的時間 if (now - lastTime >= time) { fun(); lastTime = now; } } }
方式2:getBoundingClientRect()
const imgArr = document.querySelectorAll("img"); //初始化執行 lazyLoad() //監聽使用者是否捲動卷軸,但是這高觸發事件,所以需要結合節流優化 //監聽使用者是否捲動卷軸,但是這高觸發事件,所以需要結合節流優化 window.addEventListener("scroll", throttle(lazyLoad, 2000)); function lazyLoad() { imgArr.forEach(item => { //獲取圖片和頂部的高度 const imgTop = item.getBoundingClientRect().top; //獲取瀏覽器視覺化區域高度 const wHeight = window.innerHeight; //圖片和頂部的高度小於瀏覽器視窗視覺化區域的高度 if (imgTop <= wHeight) { //getAttribute獲取自定義屬性 // item.src = item.getAttribute("data-src"); //也可以使用dataset來獲取自定義屬性的值 item.src = item.dataset.src; } }) } //節流 function throttle(fun, time = 250) { let lastTime = 0;//最後一次執行的時間 return function (...args) { const now = new Date().getTime();//獲取當前的時間 if (now - lastTime >= time) { fun(); lastTime = now; } } }
方式3:IntersectionObserver(callback)建構函式
callback回撥觸發兩次,看見了觸發,看不見也觸發。
範例有兩個方法:
const callback = (res) => { //res是一個陣列,所以還需要遍歷 console.log(res); res.forEach(item => { //isIntersecting是否在可視區域展示 if (item.isIntersecting) { //獲取圖片的自定義屬性並賦值給src item.target.src = item.target.dataset.src; //替換為真是src地址後取消對它的觀察 observe.unobserve(item.target); } }) } //1、範例化建構函式 const observe = new IntersectionObserver(callback); const imgArr = document.querySelectorAll("img"); //遍歷所有的圖片,給每個圖片新增觀察 imgArr.forEach(item => { //觀察圖片 observe.observe(item) })
資源預載入是另一個效能優化技術,我們可以使用該技術來預先告知瀏覽器某些資源可能在將來會被使用到。預載入簡單來說就是將所有所需的資源提前請求載入到本地,這樣後面在需要用到時就直接從快取取資源。
在網頁全部載入之前,對一些主要內容進行載入,以提供給使用者更好的體驗,減少等待的時間。否則,如果一個頁面的內容過於龐大,沒有使用預載入技術的頁面就會長時間的展現為一片空白,直到所有內容載入完畢。
<div> <p></p> <img src="../img/1.jpg" alt=""> </div> <script type="text/javascript"> const imgArr = ["../img/2.jpg", "../img/3.jpg", "../img/4.jpg", "../img/5.jpg", "../img/6.jpg", "../img/7.jpg"] const img = document.querySelector("img"); const p = document.querySelector("p"); //定義預設的index的值 let index = 0; p.innerHTML = `實現預載入的效果,我是第${index + 1}張圖片`; img.addEventListener("click", (e) => { if (index < imgArr.length) { img.src = imgArr[index]; index++; p.innerHTML = `實現預載入的效果,我是第${index + 1}張圖片`; if (index < imgArr.length) { //切換圖片後,同時讓瀏覽器提前載入下一張圖片 preLoad(imgArr[index]) } } else { confirm("沒有圖片了") } }, false) //呼叫預載入函數,頁面一開始就載入陣列的第一個元素 preLoad(imgArr[0]) //定義預載入函數 function preLoad(src) { //當圖片失去焦點後 img.addEventListener("load", () => { //建立一個新的img標籤 const imgNew = document.createElement("img"); //給img標籤新增src屬性為我們傳進來的src imgNew.src = src; }) } </script>
到此這篇關於JavaScript懶載入與預載入原理與實現詳解的文章就介紹到這了,更多相關JS懶載入與預載入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45