懶加載的原因:
對于圖檔過多的場景,為了提高頁面的加載速度,降低伺服器的負載,增強使用者體驗,我們對還沒出現在視野的圖檔先不加載,當元素出現在我們視野中的時候再加載。
懶加載的原理:
我們先将img标簽中的src連結設定為一樣的圖檔(空白圖檔),将真正的圖檔連結放在自定義屬性中,如(data-src),當js監聽到圖檔元素進入到可視視窗的時候,将自定義屬性中的位址存儲到src中,達到懶加載的效果。
實作:
//判斷目标元素是否在可視視窗中
function checkShow($img) {
var scrollTop = $(window).scrollTop();//文檔滾動上去的高度
var windowTop = $(window).height();//網頁工作區域的高度
var offsetTop = $img.offset().top;//元素距離文檔頂端的偏移量
if (offsetTop > scrollTop && offsetTop < (scrollTop + windowTop)) {
return true;
} else {
return false;
}
}
//判斷元素是否已被加載過
function isLoaded($img) {
return $img.attr('src') === $img.attr('data-src');
}
//加載元素
function Loading($img) {
$img.attr('src', $img.attr('data-src'));
}
//周遊所有的圖檔元素
$('img').each(function () {
//在頁面還沒滾動之前,判斷目标元素是否在可視區域内并且還沒被加載
if (checkShow($(this)) && !isLoaded($(this))) {
Loading($(this));
}
//監聽當滾動的時候,再次周遊所有的元素,把目标元素加載在頁面上
$(window).on('scroll', function () {
$('img').each(function () {
if (checkShow($(this)) && !isLoaded($(this))) {
Loading($(this));
}
})
})
})
預加載:提前加載圖檔,當使用者需要檢視時可直接從本地緩存中渲染
預加載會增加伺服器的壓力,可以說是犧牲伺服器前端性能,換取更好的使用者體驗,這樣可以使使用者的操作得到最快的反映。
預加載實作方式:
1、純CSS進行圖檔預加載
body:after {
content: "";
display: block;
position: absolute;
background: url("../image/manage/help/help_item2_01.png?v=201707241359") no-repeat
-10000px -1000px,url("../image/manage/help/help_item2_02.png?v=201707241359") no-repeat
-10000px -1000px,url("../image/manage/help/help_item2_03.png?v=201707241359") no-repeat
-10000px -1000px,url("../image/manage/help/help_item2_04.png?v=201707241359") no-repeat
-10000px -1000px,url("../image/manage/help/help_item2_05.png?v=201707241359") no-repeat
-10000px -1000px,url("../image/manage/help/help_item2_06.png?v=201707241359") no-repeat
-10000px -1000px,url("../image/manage/help/help_item2_07.png?v=201707241359") no-repeat
-10000px -1000px,url("../image/manage/help/help_item2_01.png?v=201707241359") no-repeat
-10000px -1000px;
width: 0;
height: 0
}
2、純JavaScript進行圖檔預加載
//存放圖檔路徑的數組
var imgSrcArr = [
'imgsrc1',
'imgsrc2',
'imgsrc3',
'imgsrc4'
];
var imgWrap = [];
function preloadImg(arr) {
for(var i =0; i< arr.length ;i++) {
imgWrap[i] = new Image();
imgWrap[i].src = arr[i];
}
}
preloadImg(imgSrcArr);
//或者延遲的文檔加載完畢在加載圖檔
$(function () {
preloadImg(imgSrcArr);
})
3、使用css+js進行圖檔的預加載
.preload-img:after{
content:"",
background: url("../image/manage/help/help_item2_01.png?v=201707241359") no-repeat -10000px -1000px,url("../image/manage/help/help_item2_02.png?v=201707241359") no-repeat -10000px -1000px,url("../image/manage/help/help_item2_03.png?v=201707241359") no-repeat -10000px -1000px,url("../image/manage/help/help_item2_04.png?v=201707241359") no-repeat -10000px -1000px,url("../image/manage/help/help_item2_05.png?v=201707241359") no-repeat -10000px -1000px,url("../image/manage/help/help_item2_06.png?v=201707241359") no-repeat -10000px -1000px,url("../image/manage/help/help_item2_07.png?v=201707241359") no-repeat -10000px -1000px,url("../image/manage/help/help_item2_01.png?v=201707241359") no-repeat -10000px -1000px;
}
/*
比如我們寫了上面的這樣一個類,但是頁面中沒有用到,我們在文檔加載完畢之後,給某個元素添加該類
*/
$(function(){
$("#target").addClass("preload-img")
})
4、使用ajax的方式進行圖檔的預加載
$(function(){
$.get('圖檔的路徑');
})