前置き
てことで、情報も多く、画像遅延読み込みに有用なlazy-load
そして、今回紹介するのが、Unveil
Unveil⇒単語になじみがないですが、un-veil→ベールを取るってまんまの意味ですね。
設置方法
まずは、以下の2点のjavascriptを読み込む
で、イメージタグにアンベールを設定しておく。
$(document).ready(function() {
$("img").unveil();
}); |
$(document).ready(function() {
$("img").unveil();
});
で、HTML内ののイメージタグは、
srcにダミー表示の画像(くるくる回る画像など)を、
data-srcに遅延表示したい(実際に表示したい)画像を設定。
<img src="bg.png" data-src="img1.jpg" /> |
<img src="bg.png" data-src="img1.jpg" />
ソースを読もう!
ソース内にコメント書いときます
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
| ;(function($) {
$.fn.unveil = function(threshold, callback) {
var $w = $(window),
// 閾値の設定をチェック
th = threshold || 0,
// 画面のピクセル密度を判定して、高密度の場合はソースの切り替えが可能
retina = window.devicePixelRatio > 1,
attrib = retina? "data-src-retina" : "data-src",
images = this,
loaded;
this.one("unveil", function() {
//data-src(-retina)からsrcに上書き⇒画像表示
var source = this.getAttribute(attrib);
source = source || this.getAttribute("data-src");
if (source) {
this.setAttribute("src", source);
if (typeof callback === "function") callback.call(this);
}
});
function unveil() {
var inview = images.filter(function() {
var $e = $(this),
wt = $w.scrollTop(), //画面に表示されてるトップの座標
wb = wt + $w.height(), //画面に表示されてるボトムの座標
et = $e.offset().top, //画像のトップの座標
eb = et + $e.height(); //画像のボトムの座標
/* 画像ボトム >= 画面トップの座標-閾値 && 画像のトップ座標 <= 画面ボトム+閾値
* という条件が成り立つならtrue
*/
return eb >= wt - th && et <= wb + th;
});
loaded = inview.trigger("unveil");
images = images.not(loaded);
}
$w.scroll(unveil); // ウインドウのスクロールに対してトリガー
$w.resize(unveil); // ウインドウのリサイズに対してトリガー
//1回やっとく
unveil();
return this;
};
})(window.jQuery || window.Zepto); |
;(function($) {
$.fn.unveil = function(threshold, callback) {
var $w = $(window),
// 閾値の設定をチェック
th = threshold || 0,
// 画面のピクセル密度を判定して、高密度の場合はソースの切り替えが可能
retina = window.devicePixelRatio > 1,
attrib = retina? "data-src-retina" : "data-src",
images = this,
loaded;
this.one("unveil", function() {
//data-src(-retina)からsrcに上書き⇒画像表示
var source = this.getAttribute(attrib);
source = source || this.getAttribute("data-src");
if (source) {
this.setAttribute("src", source);
if (typeof callback === "function") callback.call(this);
}
});
function unveil() {
var inview = images.filter(function() {
var $e = $(this),
wt = $w.scrollTop(), //画面に表示されてるトップの座標
wb = wt + $w.height(), //画面に表示されてるボトムの座標
et = $e.offset().top, //画像のトップの座標
eb = et + $e.height(); //画像のボトムの座標
/* 画像ボトム >= 画面トップの座標-閾値 && 画像のトップ座標 <= 画面ボトム+閾値
* という条件が成り立つならtrue
*/
return eb >= wt - th && et <= wb + th;
});
loaded = inview.trigger("unveil");
images = images.not(loaded);
}
$w.scroll(unveil); // ウインドウのスクロールに対してトリガー
$w.resize(unveil); // ウインドウのリサイズに対してトリガー
//1回やっとく
unveil();
return this;
};
})(window.jQuery || window.Zepto);
https://github.com/luis-almeida/unveil/blob/master/jquery.unveil.js
閾値の考え方はこんな感じ
HTMLでは、y座標が下にいくほどプラスなので、混乱しますが…
https://github.com/luis-almeida/unveil