摘要:如果加載不成功,就提示圖片加載錯誤。綠色表示已加載,白色表示未加載。假設所有的圖片地址已經存在一個數據中,每次讀取張圖片地址,加載它們之后,插入到現有的瀑布流末尾。避免因為加載緩沖區(qū)的速度太快,在沒有告訴它加載完要怎么辦時,它已經加載完了。
主要做了兩種圖片加載的效果
一種是遇到頁面圖片比較多的時候,帶讀條效果的加載提示(為了驗證正確加載,設置了1秒鐘的加載間隔時間)
另外一種是根據滑塊的位置進行圖片的預加載,在用戶不察覺的情況下,實現瀑布流的加載效果
主要思路:
HTML的img標簽中,將正確的地址存在data-src屬性中,給所有圖片設置一個轉圈圈的loading圖片作為background
js中,依次讀取每一個img,將data-src中的地址替換到src中,去掉background
每成功加載一張圖片,進度條的百分比進行相應的變化。
如果加載不成功,就提示圖片加載錯誤。
HTML結構很簡單,就是一個div.picList包裹了所有img,然后加上一個簡單的進度條div#loadBar
css(使用的scss,編譯時會自動加上各種兼容前綴)
.picList{ img{ width: 100px; height: 100px; position: relative; /*加載失敗時顯示灰底文字*/ &:after{ content: "( ⊙ o ⊙ )加載失敗"; font-size: 6px; font-family: FontAwesome; color: rgb(100, 100, 100); display: flex; justify-content: center; align-items: center; position: absolute; top: 0; left: 0; width: 100px; height: 100px; background-color: #ffffd; } } } .lazy{ background: url(../pic/loading.gif) center no-repeat; border: 1px solid black; } #loadBar{ width: 200px; height: 15px; background: linear-gradient(90deg,#187103,#81b50b,#187103); border: 10px solid white; position: absolute; top: 150px; left: 50%; margin-left: -100px; #loadBarMask{ width: 70%;//這個數值顯示沒有加載成功的圖片 height: 100%; background-color: beige; position: absolute; right: 0; } }
css里面需要注意的地方有兩個:
一個是把圖片加載錯誤時顯示的灰底文字放在了img的after偽類中,當圖片加載失敗,又去掉了background的gif圖片之后,就會顯示這個部分的內容及樣式。
一個是進度條的樣式。寫得很簡單,主要是一層帶漸變的綠色和一層白色疊在一起。綠色表示已加載,白色表示未加載。顯示的時候,直接控制白色那層的寬度即可。
js部分(直接執(zhí)行l(wèi)oadPicPerSecond()即可)
var lazyPic = $("img.lazy"); var loadBarMask = $("#loadBarMask"); var picList = $(".picList"); var activePic = 0; var totalPic = lazyPic.length; /*每秒加載一張圖片*/ function loadPicPerSecond(){ lazyPic.each(function(index){ var self = $(this); //console.log(self[0].complete); /*img標簽已經事先寫在html中,所以此時的complete狀態(tài)全部都是true*/ setTimeout(function(){ src[index] = self.attr("data-src"); self.attr("src",src[index]); self.removeClass("lazy"); //圖片獲得正確src地址之后,可以執(zhí)行下面的onload操作 self[0].onload = function(){ //加載讀條loadBar動畫 countPic(); } //圖片獲得的src地址不正確時,執(zhí)行下面的onerror操作 self[0].onerror = function(){ /*this.style.background = "url(pic/compressed/picList18.jpg) center no-repeat";*/ countPic(); } },1000*index); }) } /*根據onload的執(zhí)行情況來計算當前的圖片加載進度.每onload一次,activePic就增加1*/ function countPic(){ activePic++; var leftPic = totalPic - activePic; var percentPic = Math.ceil(leftPic/totalPic*100);//沒有加載的圖片百分比,和loadBarMask的寬度占比配合 console.log("已加載"+(100-percentPic)+"%"); loadBarMask.css("width",percentPic+"%"); if(percentPic==0){ $("#loadBar").hide(); } }二 瀑布流加載
主要思路:
監(jiān)聽窗口滾動情況,當已經加載的圖片的最后一張快要進入窗口的時候,開始加載下面的圖片。
假設所有的圖片地址已經存在一個json數據中,每次讀取10張圖片地址,加載它們之后,插入到現有的瀑布流末尾。
如此往復,直到加載完所有圖片。
HTML和前面部分相同,只是把src寫成正常地址即可。
css完全一樣。
js部分
var lazyPic = $("img.lazy"); var loadBarMask = $("#loadBarMask"); var picList = $(".picList"); var scrollTop, clientHeight, scrollHeight; var threshold = 200; //最后一張圖片距離窗口200px的時候開始加載圖片 var src = []; var activePic = 0; var totalPic = lazyPic.length; //待加載的圖片數據 var dirtSrc = "pic/compressed/picList"; var picData = {imgSrc:[ dirtSrc + "20.jpg", dirtSrc + "21.jpg", dirtSrc + "22.jpg", dirtSrc + "23.jpg", dirtSrc + "24.jpg", dirtSrc + "25.jpg", dirtSrc + "26.jpg", dirtSrc + "27.jpg", dirtSrc + "28.jpg", dirtSrc + "29.jpg", dirtSrc + "30.jpg", dirtSrc + "31.jpg", dirtSrc + "32.jpg", dirtSrc + "33.jpg", dirtSrc + "34.jpg", dirtSrc + "35.jpg", dirtSrc + "36.jpg", dirtSrc + "37.jpg", dirtSrc + "38.jpg", dirtSrc + "39.jpg", dirtSrc + "40.jpg", dirtSrc + "41.jpg", dirtSrc + "42.jpg", dirtSrc + "43.jpg", dirtSrc + "44.jpg", dirtSrc + "45.jpg", dirtSrc + "46.jpg", dirtSrc + "47.jpg", dirtSrc + "48.jpg", dirtSrc + "49.jpg", ]}; //加載次數計數器 var scrollIndex = 0; $(function(){ /*監(jiān)聽窗口滾動情況*/ $(window).on("scroll",function(){ scrollTop = $(window).scrollTop();//$(window).scrollTop()==document.body.scrollTop clientHeight = $(window).height(); scrollHeight = picList.last().height();//picList.last()[0].clientHeight /*目標與窗口的距離達到閾值時開始加載*/ if(scrollHeight-clientHeight-scrollTop < threshold){ scrollPic(10); } }) }) /*根據滾動程度加載圖片,每次加載perAmount張*/ function scrollPic(perAmount = 10){ var totalAmount = perAmount * (scrollIndex+1); //考慮到最后一次加載的時候,剩余的圖片數量有可能達不到限定的每次加載的數量,這時候需要更改totalAmount的值 if(totalAmount>picData.imgSrc.length){ totalAmount = picData.imgSrc.length; } for(scrollIndex;scrollIndex比較捉急的就是scrollTop、height那幾個值的取值對象,總是記不清楚,所以按照js和jquery都寫上了,以后可以直接用。將數值關系搞定之后,只要滿足條件就觸發(fā)加載即可。
三 后記·兼容性問題拿到IE8之下運行時,發(fā)現img.onload后面的function打死都不執(zhí)行,IE8智障到不能完成 img.onload = function(){}這么初級的代碼么?
去查了資料之后,發(fā)現IE8雖然白癡,但還算沒有智障到無藥可救。
onload是可以調用的,但是要放在src的賦值之前。簡單來說,就是要先告訴瀏覽器圖片加載完要怎么處理,再讓它去加載圖片。避免因為加載緩沖區(qū)的速度太快,在沒有告訴它加載完要怎么辦時,它已經加載完了。而其它瀏覽器則是從緩沖區(qū)讀取到圖片時就執(zhí)行onload。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82947.html
摘要:如果加載不成功,就提示圖片加載錯誤。綠色表示已加載,白色表示未加載。假設所有的圖片地址已經存在一個數據中,每次讀取張圖片地址,加載它們之后,插入到現有的瀑布流末尾。避免因為加載緩沖區(qū)的速度太快,在沒有告訴它加載完要怎么辦時,它已經加載完了。 主要做了兩種圖片加載的效果一種是遇到頁面圖片比較多的時候,帶讀條效果的加載提示(為了驗證正確加載,設置了1秒鐘的加載間隔時間)另外一種是根據滑塊的...
摘要:前言最近在整理基礎知識,接觸到了幾個常用的頁面特效,其中覺得用原生實現瀑布流的案例十分有趣,于是與大家分享一下。瀑布流瀑布流,又稱瀑布流式布局。通過定位的方式是我們實現瀑布流的最基本的原理,只要我們動態(tài)的設置它的值值,就能讓它排列。 showImg(https://segmentfault.com/img/remote/1460000012621941?w=1052&h=542); 前...
摘要:無非就是獲取用戶輸入的獲取圖片信息組裝填充頁面數據瀑布流布局處理在頁面滾動時判斷最后一張圖片是否可見,如果是則重復以上內容查看源碼 開始 做一個小項目,算是對js和jQuery的一次練習吧。 圖片資源來自這個網站(上面有很多高清圖片關鍵還是免費下載的):https://unsplash.com/ 項目具體效果可以點這里:https://bjw1234.github.io/ima......
摘要:是最流行的瀑布流插件之一,配置簡單,功能強大,在上收獲了。如果你想使用瀑布流提升網站體驗,將是不錯的選擇。瀑布流,又稱瀑布流式布局。需要注意的是,如果你需要加載圖片,不會在圖片加載完后重新布局,這可能會影響你的布局效果,建議配合使用插件。 Masonry是最流行的瀑布流插件之一,配置簡單,功能強大,在Github上收獲了1w+ stars。如果你想使用瀑布流提升網站體驗,Masonry...
閱讀 1410·2021-11-22 09:34
閱讀 1381·2021-09-22 14:57
閱讀 3411·2021-09-10 10:50
閱讀 1389·2019-08-30 15:54
閱讀 3693·2019-08-29 17:02
閱讀 3476·2019-08-29 12:54
閱讀 2618·2019-08-27 10:57
閱讀 3322·2019-08-26 12:24