摘要:如果加載不成功,就提示圖片加載錯(cuò)誤。綠色表示已加載,白色表示未加載。假設(shè)所有的圖片地址已經(jīng)存在一個(gè)數(shù)據(jù)中,每次讀取張圖片地址,加載它們之后,插入到現(xiàn)有的瀑布流末尾。避免因?yàn)榧虞d緩沖區(qū)的速度太快,在沒(méi)有告訴它加載完要怎么辦時(shí),它已經(jīng)加載完了。
主要做了兩種圖片加載的效果
一種是遇到頁(yè)面圖片比較多的時(shí)候,帶讀條效果的加載提示(為了驗(yàn)證正確加載,設(shè)置了1秒鐘的加載間隔時(shí)間)
另外一種是根據(jù)滑塊的位置進(jìn)行圖片的預(yù)加載,在用戶不察覺(jué)的情況下,實(shí)現(xiàn)瀑布流的加載效果
主要思路:
HTML的img標(biāo)簽中,將正確的地址存在data-src屬性中,給所有圖片設(shè)置一個(gè)轉(zhuǎn)圈圈的loading圖片作為background
js中,依次讀取每一個(gè)img,將data-src中的地址替換到src中,去掉background
每成功加載一張圖片,進(jìn)度條的百分比進(jìn)行相應(yīng)的變化。
如果加載不成功,就提示圖片加載錯(cuò)誤。
HTML結(jié)構(gòu)很簡(jiǎn)單,就是一個(gè)div.picList包裹了所有img,然后加上一個(gè)簡(jiǎn)單的進(jìn)度條div#loadBar
css(使用的scss,編譯時(shí)會(huì)自動(dòng)加上各種兼容前綴)
.picList{ img{ width: 100px; height: 100px; position: relative; /*加載失敗時(shí)顯示灰底文字*/ &: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%;//這個(gè)數(shù)值顯示沒(méi)有加載成功的圖片 height: 100%; background-color: beige; position: absolute; right: 0; } }
css里面需要注意的地方有兩個(gè):
一個(gè)是把圖片加載錯(cuò)誤時(shí)顯示的灰底文字放在了img的after偽類中,當(dāng)圖片加載失敗,又去掉了background的gif圖片之后,就會(huì)顯示這個(gè)部分的內(nèi)容及樣式。
一個(gè)是進(jìn)度條的樣式。寫得很簡(jiǎn)單,主要是一層帶漸變的綠色和一層白色疊在一起。綠色表示已加載,白色表示未加載。顯示的時(shí)候,直接控制白色那層的寬度即可。
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標(biāo)簽已經(jīng)事先寫在html中,所以此時(shí)的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動(dòng)畫 countPic(); } //圖片獲得的src地址不正確時(shí),執(zhí)行下面的onerror操作 self[0].onerror = function(){ /*this.style.background = "url(pic/compressed/picList18.jpg) center no-repeat";*/ countPic(); } },1000*index); }) } /*根據(jù)onload的執(zhí)行情況來(lái)計(jì)算當(dāng)前的圖片加載進(jìn)度.每onload一次,activePic就增加1*/ function countPic(){ activePic++; var leftPic = totalPic - activePic; var percentPic = Math.ceil(leftPic/totalPic*100);//沒(méi)有加載的圖片百分比,和loadBarMask的寬度占比配合 console.log("已加載"+(100-percentPic)+"%"); loadBarMask.css("width",percentPic+"%"); if(percentPic==0){ $("#loadBar").hide(); } }二 瀑布流加載
主要思路:
監(jiān)聽(tīng)窗口滾動(dòng)情況,當(dāng)已經(jīng)加載的圖片的最后一張快要進(jìn)入窗口的時(shí)候,開(kāi)始加載下面的圖片。
假設(shè)所有的圖片地址已經(jīng)存在一個(gè)json數(shù)據(jù)中,每次讀取10張圖片地址,加載它們之后,插入到現(xiàn)有的瀑布流末尾。
如此往復(fù),直到加載完所有圖片。
HTML和前面部分相同,只是把src寫成正常地址即可。
css完全一樣。
js部分
var lazyPic = $("img.lazy"); var loadBarMask = $("#loadBarMask"); var picList = $(".picList"); var scrollTop, clientHeight, scrollHeight; var threshold = 200; //最后一張圖片距離窗口200px的時(shí)候開(kāi)始加載圖片 var src = []; var activePic = 0; var totalPic = lazyPic.length; //待加載的圖片數(shù)據(jù) 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", ]}; //加載次數(shù)計(jì)數(shù)器 var scrollIndex = 0; $(function(){ /*監(jiān)聽(tīng)窗口滾動(dòng)情況*/ $(window).on("scroll",function(){ scrollTop = $(window).scrollTop();//$(window).scrollTop()==document.body.scrollTop clientHeight = $(window).height(); scrollHeight = picList.last().height();//picList.last()[0].clientHeight /*目標(biāo)與窗口的距離達(dá)到閾值時(shí)開(kāi)始加載*/ if(scrollHeight-clientHeight-scrollTop < threshold){ scrollPic(10); } }) }) /*根據(jù)滾動(dòng)程度加載圖片,每次加載perAmount張*/ function scrollPic(perAmount = 10){ var totalAmount = perAmount * (scrollIndex+1); //考慮到最后一次加載的時(shí)候,剩余的圖片數(shù)量有可能達(dá)不到限定的每次加載的數(shù)量,這時(shí)候需要更改totalAmount的值 if(totalAmount>picData.imgSrc.length){ totalAmount = picData.imgSrc.length; } for(scrollIndex;scrollIndex比較捉急的就是scrollTop、height那幾個(gè)值的取值對(duì)象,總是記不清楚,所以按照js和jquery都寫上了,以后可以直接用。將數(shù)值關(guān)系搞定之后,只要滿足條件就觸發(fā)加載即可。
三 后記·兼容性問(wèn)題拿到IE8之下運(yùn)行時(shí),發(fā)現(xiàn)img.onload后面的function打死都不執(zhí)行,IE8智障到不能完成 img.onload = function(){}這么初級(jí)的代碼么?
去查了資料之后,發(fā)現(xiàn)IE8雖然白癡,但還算沒(méi)有智障到無(wú)藥可救。
onload是可以調(diào)用的,但是要放在src的賦值之前。簡(jiǎn)單來(lái)說(shuō),就是要先告訴瀏覽器圖片加載完要怎么處理,再讓它去加載圖片。避免因?yàn)榧虞d緩沖區(qū)的速度太快,在沒(méi)有告訴它加載完要怎么辦時(shí),它已經(jīng)加載完了。而其它瀏覽器則是從緩沖區(qū)讀取到圖片時(shí)就執(zhí)行onload。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/50761.html
摘要:如果加載不成功,就提示圖片加載錯(cuò)誤。綠色表示已加載,白色表示未加載。假設(shè)所有的圖片地址已經(jīng)存在一個(gè)數(shù)據(jù)中,每次讀取張圖片地址,加載它們之后,插入到現(xiàn)有的瀑布流末尾。避免因?yàn)榧虞d緩沖區(qū)的速度太快,在沒(méi)有告訴它加載完要怎么辦時(shí),它已經(jīng)加載完了。 主要做了兩種圖片加載的效果一種是遇到頁(yè)面圖片比較多的時(shí)候,帶讀條效果的加載提示(為了驗(yàn)證正確加載,設(shè)置了1秒鐘的加載間隔時(shí)間)另外一種是根據(jù)滑塊的...
摘要:前言最近在整理基礎(chǔ)知識(shí),接觸到了幾個(gè)常用的頁(yè)面特效,其中覺(jué)得用原生實(shí)現(xiàn)瀑布流的案例十分有趣,于是與大家分享一下。瀑布流瀑布流,又稱瀑布流式布局。通過(guò)定位的方式是我們實(shí)現(xiàn)瀑布流的最基本的原理,只要我們動(dòng)態(tài)的設(shè)置它的值值,就能讓它排列。 showImg(https://segmentfault.com/img/remote/1460000012621941?w=1052&h=542); 前...
摘要:無(wú)非就是獲取用戶輸入的獲取圖片信息組裝填充頁(yè)面數(shù)據(jù)瀑布流布局處理在頁(yè)面滾動(dòng)時(shí)判斷最后一張圖片是否可見(jiàn),如果是則重復(fù)以上內(nèi)容查看源碼 開(kāi)始 做一個(gè)小項(xiàng)目,算是對(duì)js和jQuery的一次練習(xí)吧。 圖片資源來(lái)自這個(gè)網(wǎng)站(上面有很多高清圖片關(guān)鍵還是免費(fèi)下載的):https://unsplash.com/ 項(xiàng)目具體效果可以點(diǎn)這里:https://bjw1234.github.io/ima......
摘要:是最流行的瀑布流插件之一,配置簡(jiǎn)單,功能強(qiáng)大,在上收獲了。如果你想使用瀑布流提升網(wǎng)站體驗(yàn),將是不錯(cuò)的選擇。瀑布流,又稱瀑布流式布局。需要注意的是,如果你需要加載圖片,不會(huì)在圖片加載完后重新布局,這可能會(huì)影響你的布局效果,建議配合使用插件。 Masonry是最流行的瀑布流插件之一,配置簡(jiǎn)單,功能強(qiáng)大,在Github上收獲了1w+ stars。如果你想使用瀑布流提升網(wǎng)站體驗(yàn),Masonry...
摘要:完整代碼請(qǐng)戳我們回到小程序,此時(shí)接口返回的數(shù)據(jù)如下可以看到每個(gè)圖片都有高度了,接下來(lái)我們實(shí)現(xiàn)瀑布流布局,等下,我們搞下瀑布流布局的懶加載,關(guān)于小程序的懶加載,猛戳了解更多。 效果圖 來(lái)來(lái)來(lái),看啊看,外面的世界多好看, showImg(https://segmentfault.com/img/remote/1460000014887454?w=371&h=580); 效果圖展示的是瀑布流...
閱讀 2096·2021-11-23 09:51
閱讀 2839·2021-11-22 15:35
閱讀 2937·2019-08-30 15:53
閱讀 1038·2019-08-30 14:04
閱讀 3276·2019-08-29 12:39
閱讀 1802·2019-08-28 17:57
閱讀 1086·2019-08-26 13:39
閱讀 551·2019-08-26 13:34