看到一些大型網站,頁面如果有很多圖片的時候,當你滾動到相應的行時,當前行的圖片才即時加載的,這樣子的話頁面在打開只加可視區域的圖片,而其它隱藏的圖片則不加載,一定程序上加快了頁面加載的速度,跟着小編一起學習javascript實現圖片延遲加載吧
看到一些大型網站,頁面如果有很多圖片的時候,當你滾動到相應的行時,當前行的圖片才即時加載的,這樣子的話頁面在打開只加可視區域的圖片,而其它隱藏的圖片則不加載,一定程序上加快了頁面加載的速度,對於比較長的頁面來說,這個方案是比較好的。原理是這樣:頁面可見區域以下的圖片先不加載,等到用戶向下滾動到圖片位置時,再進行加載。這樣做的好處在哪里?——當頁面有好幾屏內容時,有可能用戶只看前幾屏的內容,這樣我們就可以只加載用戶需要看的圖片,減少服務器向用戶瀏覽器發送圖片文件所產生的負荷,下面通過三種方法給大家介紹js實現圖片延時加載。
js實現圖片延遲加載方法一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
>
<html>
<head>
<title>lazyImage2.html</title>
<meta http-equiv=
"keywords"
content=
"keyword1,keyword2,keyword3"
>
<meta http-equiv=
"description"
content=
"this is my page"
>
<meta http-equiv=
"content-type"
content=
"text/html; charset=UTF-8"
>
<!--<link rel=
"stylesheet"
type=
"text/css"
href=
"./styles.css"
mce_href=
"styles.css"
>-->
</head>
<body style=
"text-align:center"
mce_style=
"text-align:center"
>
<p> </p><p> </p><p> </p><p> </p><p> </p>
<div style=
"height:1290px;width:800px;border:1px;background:gray;"
></div>
<div style=
"height:150px;width:800px;border:1px;background:green;"
></div>
<img class=
"lazy"
src=
"images/sprite.gif"
mce_src=
"images/sprite.gif"
alt=
"images/lazyloadImg.jpg"
/>
<script type=
"text/javascript"
><!--
var
temp = -1;
//用來判斷是否是向下滾動(向上滾動就不需要判斷延遲加載圖片了)
window.onscroll =
function
() {
var
imgElements = document.getElementsByTagName(
"img"
);
var
lazyImgArr =
new
Array();
var
j = 0;
for
(
var
i=0; i<imgElements.length; i++) {
if
(imgElements[i].className ==
"lazy"
){
lazyImgArr[j++] = imgElements[i];
}
}
var
scrollHeight = document.body.scrollTop;
//滾動的高度
var
bodyHeight = document.body.offsetHeight;
//body(頁面)可見區域的總高度
if
(temp < scrollHeight) {
//為true表示是向下滾動,否則是向上滾動,不需要執行動作。
for
(
var
k=0; k<lazyImgArr.length; k++) {
var
imgTop = lazyImgArr[k].offsetTop;
//1305(圖片縱坐標)
if
((imgTop - scrollHeight) <= bodyHeight) {
lazyImgArr[k].src = lazyImgArr[k].alt;
lazyImgArr[k].className =
"notlazy"
}
}
temp = scrollHeight;
}
};
// --></script>
</body>
</html>
|
js實現網頁圖片延時加載方法二:
再沒貼代碼之前先給大家講下js實現圖片延時加載的原理。
實現原理:
把所有需要延時加載的圖片改成如下的格式:
1
|
<img lazy_src=
"圖片路徑"
border=
"0"
/>
|
然后在頁面加載時,把所有使用了lazy_src的圖片都保存到數組里,然后在滾動時計算可視區域的top,然后把延時加載的圖片中top小於當前可視區域(即圖片出現在可視區域內)的圖片的src的值用lazy_src的來替換(加載圖片):
JS代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
lazyLoad = (
function
() {
var
map_element = {};
var
element_obj = [];
var
download_count = 0;
var
last_offset = -1;
var
doc_body;
var
doc_element;
var
lazy_load_tag;
function
initVar(tags) {
doc_body = document.body;
doc_element = document.compatMode ==
'BackCompat'
? doc_body : document.documentElement;
lazy_load_tag = tags || [
"img"
,
"iframe"
];
};
function
initElementMap() {
var
all_element = [];
//從所有相關元素中找出需要延時加載的元素
for
(
var
i = 0,
len = lazy_load_tag.length; i < len; i++) {
var
el = document.getElementsByTagName(lazy_load_tag[i]);
for
(
var
j = 0,
len2 = el.length; j < len2; j++) {
if
(
typeof
(el[j]) ==
"object"
&& el[j].getAttribute(
"lazy_src"
)) {
element_obj.push(all_element[key]);
}
}
}
for
(
var
i = 0,
len = element_obj.length; i < len; i++) {
var
o_img = element_obj[i];
var
t_index = getAbsoluteTop(o_img);
//得到圖片相對document的距上距離
if
(map_element[t_index]) {
map_element[t_index].push(i);
}
else
{
//按距上距離保存一個隊列
var
t_array = [];
t_array[0] = i;
map_element[t_index] = t_array;
download_count++;
//需要延時加載的圖片數量
}
}
};
function
initDownloadListen() {
if
(!download_count)
return
;
var
offset = (window.MessageEvent && !document.getBoxObjectFor) ? doc_body.scrollTop : doc_element.scrollTop;
//可視化區域的offtset=document的高+
var
visio_offset = offset + doc_element.clientHeight;
if
(last_offset == visio_offset) {
setTimeout(initDownloadListen, 200);
return
;
}
last_offset = visio_offset;
var
visio_height = doc_element.clientHeight;
var
img_show_height = visio_height + offset;
for
(
var
key
in
map_element) {
if
(img_show_height > key) {
var
t_o = map_element[key];
var
img_vl = t_o.length;
for
(
var
l = 0; l < img_vl; l++) {
element_obj[t_o[l]].src = element_obj[t_o[l]].getAttribute(
"lazy_src"
);
}
delete
map_element[key];
download_count--;
}
}
setTimeout(initDownloadListen, 200);
};
function
getAbsoluteTop(element) {
if
(arguments.length != 1 || element ==
null
) {
return
null
;
}
var
offsetTop = element.offsetTop;
while
(element = element.offsetParent) {
offsetTop += element.offsetTop;
}
return
offsetTop;
}
function
init(tags) {
initVar(tags);
initElementMap();
initDownloadListen();
};
return
{
init: init
}
})();
|
使用方法:把頁面上需要延時加載的圖片src改成為lazy_src,然后把上面的js放到body最后面,然后調用:lazyLoad.init();
調戲的方法可以使用firebug來查看一時圖片是否是延時加載。
另外:
如果你的頁面上存在有內容切換的欄目的話,可能在切換時切換的內容里的圖片可能會不顯示,處理的方法是在內容時單獨圖片加載處理,如:
1
2
3
4
5
|
///切換內容的代碼…
chlid.find(
"img[init_src]"
).each(
function
(){
$(
this
).attr(
"src"
,$(
this
).attr(
"init_src"
));
$(
this
).removeAttr(
"init_src"
);
});
|
原生態js實現圖片延時加載方法三:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
<!doctype html>
<html>
<head>
<meta http-equiv=
"Content-Type"
content=
"text/html; charset=utf-8"
/>
<title>通過原生js延遲加載圖片</title>
<style type=
"text/css"
>
div{width:100px;height:100px;background:
#F00;margin-bottom:30px}
</style>
</head>
<body>
"
src=
"a.gif"
/></div>
"
src=
"a.gif"
/></div>
"
src=
"a.gif"
/></div>
"
src=
"a.gif"
/></div>
</body>
//以上圖片測試時可用復制多點
<script type=
"text/javascript"
>
(
function
(){
//common
function
tagName(tagName){
return
document.getElementsByTagName(tagName);
}
function
$(id){
return
document.getElementById(id);
}
function
addEvent(obj,type,func){
if
(obj.addEventListener){
obj.addEventListener(type,func,
false
);
}
else
if
(obj.attachEvent){
obj.attachEvent(
'on'
+type,func);
}
}
//這里可以按照需要配置些參數
var
v={
eleGroup:
null
,
eleTop:
null
,
eleHeight:
null
,
screenHeight:
null
,
visibleHeight:
null
,
scrollHeight:
null
,
scrolloverHeight:
null
,
limitHeight:
null
}
//對數據進行初始化
function
init(element){
v.eleGroup=tagName(element)
screenHeight=document.documentElement.clientHeight;
scrolloverHeight=document.body.scrollTop;
for
(
var
i=0,j=v.eleGroup.length;i<j;i++){
if
(v.eleGroup[i].offsetTop<=screenHeight && v.eleGroup[i].getAttribute(
'data-url'
)){
v.eleGroup[i].setAttribute(
'src'
,v.eleGroup[i].getAttribute(
'data-url'
));
v.eleGroup[i].removeAttribute(
'data-url'
)
}
}
}
function
lazyLoad(){
if
(document.body.scrollTop == 0){
limitHeight=document.documentElement.scrollTop+document.documentElement.clientHeight;
}
else
{
limitHeight=document.body.scrollTop+document.documentElement.clientHeight;
}
for
(
var
i=0,j=v.eleGroup.length;i<j;i++){
if
(v.eleGroup[i].offsetTop<=limitHeight && v.eleGroup[i].getAttribute(
'data-url'
)){
v.eleGroup[i].src=v.eleGroup[i].getAttribute(
'data-url'
);
v.eleGroup[i].removeAttribute(
'data-url'
)
}
}
}
init(
'img'
)
addEvent(window,
'scroll'
,lazyLoad);
})()
</script>
</html>
|