js實(shí)現(xiàn)圖片加載淡入淡出效果
本文實(shí)例為大家分享了js圖片加載淡入淡出效果展示的具體代碼,供大家參考,具體內(nèi)容如下
HTML代碼
首先是圖片標(biāo)記的寫法:
<img data-src="/path/to/image.jpg" alt="">
需要將圖片的地址放到 data-src 屬性里,而src值填寫默認(rèn)的一張圖片。
CSS代碼
所有具有data-src屬性的圖片,我們將其初始顯示狀態(tài)為不可見,通過(guò)透明度來(lái)調(diào)節(jié):
img {
opacity: 1;
transition: opacity 0.3s;
}
img[data-src] {
opacity: 0;
}
這樣寫的作用是什么?等當(dāng)圖片加載時(shí),你就能看的效果了。
JavaScript代碼
我們最終會(huì)將 data-src 屬性去掉,換成src屬性,但這是圖片加載成功后的動(dòng)作:
[].forEach.call(document.querySelectorAll('img[data-src]'), function(img) {
img.setAttribute('src', img.getAttribute('data-src'));
img.onload = function() {
img.removeAttribute('data-src');
};
});
相比起其它各種的圖片延遲加載技術(shù),這種方法非常的簡(jiǎn)單,它幾乎不要求其它任何條件,可以用在任何地方,使用起來(lái)非常靈活。
當(dāng)然,簡(jiǎn)單有簡(jiǎn)單的好壞,也會(huì)因?yàn)楹?jiǎn)單而不足。它不具有圖片圖片滾動(dòng)到可視窗口內(nèi)再加載的功能。最終使用哪種技術(shù),還是要看場(chǎng)景而定。
下面是lazyload.js
var lazyLoad = {
init: function() {
var that = this;
that.onerrorImgUrl = "data-error"; //圖片加載失敗用什么圖片替換
that.srcStore = "data-src"; //圖片真實(shí)地址存放的自定義屬性
that.class = "lazy-img"; //惰性加載的圖片需要添加的class
that.sensitivity = 50; //該值越小,惰性越強(qiáng)(加載越少)
minScroll = 5,
slowScrollTime = 200;
document.addEventListener("scroll", function() {
that.changeimg();
});
setTimeout(function() {
that.trigger();
}, 100);
},
scanImage: function() {
var that = this;
var imgList = [];
var allimg = [].slice.call(document.querySelectorAll('img.' + that.class + ''));
allimg.forEach(function(ele) {
if (!that.isLoadedImageCompleted(ele)) {
imgList.push(ele);
}
});
that.imglistArr = imgList;
},
isLoadedImageCompleted: function(ele) {
return (ele.getAttribute('data-loaded') == '1')
},
trigger: function() {
var that = this;
eventType = that.isPhone && "touchend" || "scroll";
that.fireEvent(document, eventType);
//$(window).trigger(eventType);
},
fireEvent: function(element, event) {
// 其他標(biāo)準(zhǔn)瀏覽器使用dispatchEvent方法
var evt = document.createEvent('HTMLEvents');
// initEvent接受3個(gè)參數(shù):
// 事件類型,是否冒泡,是否阻止瀏覽器的默認(rèn)行為
evt.initEvent(event, true, true);
return !element.dispatchEvent(evt);
},
changeimg: function() {
function loadYesOrno(img) {
var windowPageYOffset = window.pageYOffset,
windowPageYOffsetAddHeight = windowPageYOffset + window.innerHeight,
imgOffsetTop = img.getBoundingClientRect().top + window.pageYOffset;
return imgOffsetTop >= windowPageYOffset && imgOffsetTop - that.sensitivity <= windowPageYOffsetAddHeight;
}
function loadImg(img, index) {
var imgUrl = img.getAttribute(that.srcStore);
img.setAttribute("src", imgUrl);
img.onload || (img.onload = function() {
img.classList.remove(that.class);
img.setAttribute('data-loaded', 1)
img.removeAttribute('data-src');
//$(this).removeClass(that.class).getAttribute('data-loaded',1),
that.imglistArr[index] = null;
img.onerror = img.onload = null;
},
img.onerror = function() {
img.src = img.getAttribute(that.onerrorImgUrl);
img.classList.remove(that.class);
img.classList.add("lazy-err");
img.setAttribute('data-loaded', 0);
//$(this).removeClass(that.class).getAttribute('data-loaded',0),
that.imglistArr[index] = null,
img.onerror = img.onload = null
});
var newImgStack = [];
that.imglistArr.forEach(function(ele) {
//img標(biāo)簽可見并且加載未完成
if (!that.isLoadedImageCompleted(ele)) {
newImgStack.push(ele);
}
});
that.imglistArr = newImgStack;
}
var that = this;
that.scanImage();
that.imglistArr.forEach(function(val, index) {
if (!val) return;
var img = val;
if (!loadYesOrno(img) || that.isLoadedImageCompleted(img)) return;
if (!img.getAttribute(that.srcStore)) return;
loadImg(img, index);
})
}
};
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js中async函數(shù)結(jié)合promise的小案例淺析
這篇文章主要介紹了js中async函數(shù)結(jié)合promise的小案例淺析,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
js遍歷map javaScript遍歷map的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇js遍歷map javaScript遍歷map的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
JS打斷點(diǎn)的六種常用姿勢(shì)你用過(guò)幾種
JS斷點(diǎn)調(diào)試,即是在瀏覽器開發(fā)者工具中為JS代碼添加斷點(diǎn),讓JS執(zhí)行到某一特定位置停住,方便開發(fā)者對(duì)該處代碼段的分析,這篇文章主要介紹了JS打斷點(diǎn)的六種常用姿勢(shì)的相關(guān)資料,需要的朋友可以參考下2025-04-04
JavaScript 實(shí)現(xiàn)鼠標(biāo)拖動(dòng)元素實(shí)例代碼
這篇文章主要介紹了JavaScript 實(shí)現(xiàn)鼠標(biāo)拖動(dòng)元素實(shí)例代碼,需要的朋友可以參考下2014-02-02
js實(shí)現(xiàn)刷新頁(yè)面后回到記錄時(shí)滾動(dòng)條的位置【兩種方案可選】
本文主要介紹了頁(yè)面的div中有滾動(dòng)條,js實(shí)現(xiàn)刷新頁(yè)面后回到記錄時(shí)滾動(dòng)條的位置的兩種方案,需要的朋友可以看下2016-12-12
javascript運(yùn)行機(jī)制之執(zhí)行順序理解
這篇文章主要介紹了javascript運(yùn)行機(jī)制之執(zhí)行順序理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

