次のような画像タグがあるとします。
<img src="myimage.jpg" />
それに「非同期」を追加すると:
<img async src="myimage.jpg" />
画像は非同期でロードされますか?
次のような画像タグがあるとします。
<img src="myimage.jpg" />
それに「非同期」を追加すると:
<img async src="myimage.jpg" />
画像は非同期でロードされますか?
コンテンツを非同期ロード (遅延ロード) する方法は、'src' 属性を設定せず、DOM 対応が起動されたら画像をロードするスクリプトを実行することです。
<img data-lazysrc='http://www.amazingjokes.com/images/20140902-amazingjokes-title.png'/>
そしてjQuery(またはプレーンなJavaScriptでも可能)では、以下のコードを使用します(ここで提案されているように):
<script>
function ReLoadImages(){
$('img[data-lazysrc]').each( function(){
//* set the img src from data-src
$( this ).attr( 'src', $( this ).attr( 'data-lazysrc' ) );
}
);
}
document.addEventListener('readystatechange', event => {
if (event.target.readyState === "interactive") { //or at "complete" if you want it to execute in the most last state of window.
ReLoadImages();
}
});
</script>
var img = new Image(),
url = "myimg.jpg",
container = document.getElementById("holder-div");
img.onload = function () { container.appendChild(img); };
img.src = url;
これにより、スクリプト内で要求するとすぐに画像の読み込みが開始され、画像の読み込みが完了するたびに、画像が取得されて追加されます。
これを行う方法は他にもたくさんあります...
これは、単一の画像の非同期読み込みの非常に単純な例です。
しかし、教訓は次のとおりです
。非同期読み込みを機能させるには、JavaScript で読み込み、onload を使用するか、src
属性なしでページに画像タグを含め ( HTML でwidth
andheight
を指定します)、ある時点で戻ります。 JS、画像の URL を設定します。
画像を非同期でロードするもう 1 つの方法は Promise
、JavaScript を使用することです。これは、非同期で処理する目的に役立ちます。
function asyncImageLoader(url){
return new Promise( (resolve, reject) => {
var image = new Image()
image.src = url
image.onload = () => resolve(image)
image.onerror = () => reject(new Error('could not load image'))
})
}
// then use it like this
var image = asyncImageLoader(url)
image.then( res => {
console.log(res)
})
<img async src="myimage.jpg" />
イメージ タグは、非同期属性をサポートしていません。
http://www.w3.org/TR/html5/embedded-content-0.html#the-img-element
jQuery を使用している場合は、次のように単純でありながら効果的なことを行いました。
HTML
<div data-lazy-load-image="/Images/image-name.png" data-image-classname="pop-in"></div>
JavaScript
$(function () {
$("[data-lazy-load-image]").each(function (index, element) {
var img = new Image();
img.src = $(element).data("lazy-load-image");
if (typeof $(element).data("image-classname" !== "undefined"))
img.className = $(element).data("image-classname");
$(element).append(img);
});
});
CSS
@-webkit-keyframes pop-in {
0% { opacity: 0; -webkit-transform: scale(0.5); }
100% { opacity: 1; -webkit-transform: scale(1); }
}
@-moz-keyframes pop-in {
0% { opacity: 0; -moz-transform: scale(0.5); }
100% { opacity: 1; -moz-transform: scale(1); }
}
@keyframes pop-in {
0% { opacity: 0; transform: scale(0.5); }
100% { opacity: 1; transform: scale(1); }
}
これを拡張して、各画像に追加のオプション属性を含めることができますが、アイデアはわかります。
これは、DOM の準備が整うまで待機し、data-lazy-load-image
属性でマークした要素に画像を動的に (非同期に) ロードします。読み込まれたときに画像が「ポップイン」されるように CSS を含めました。
@Norguard の例は非常に単純で、画像を 1 つか 2 つ使用するのに十分簡単ですが、echo.js は遅延読み込みに非常に便利であることがわかりました ( https://github.com/toddmotto/echo )。
data-* 属性を使用して画像を遅延読み込みし、他にもいくつかの優れた機能を備えています。
<img data-echo="img/photo.jpg">
<script src="dist/echo.js"></script>
<script>
echo.init();
</script>
jQueryで次のアプローチを使用しました。
まず、画像タグで「src」属性を使用しないでください。ただし、次のように、ソースを別の属性に入れます。
<img async-src="/mydirectory/myimage.jpg" />
次に、jQuery ドキュメント対応関数内で、次のコードを使用して要素の async-src を要素の実際の src にコピーします。
$("img[async-src]").each(function(index) {
$(this).attr("src", $(this).attr("async-src"));
});
ノート:
jQuery の .each 関数は、HTML/DOM でコーディングされている順序でタグを処理する場合がありますが、画像のサイズとネットワークの問題により、実際には画像が順番に読み込まれない場合があります。つまり、最初の async-src イメージの読み込みが完了する前に、3 つ目の async-src イメージが画面に表示される場合があります。
ページ レイアウトがその画像ファイルのピクセル サイズに依存している場合 (たとえば、タグ属性、CSS、または親要素を介して画像のサイズを定義していない場合)、元のファイル ポイントで「src」属性を使用する必要がある場合があります。必要なサイズの空白の白または透明な GIF に変換します。
最後に、画像の非同期読み込み後にコードを処理する場合 (たとえば、フェード効果を処理したり、要素に関連する CSS タグを変更したりする場合)、jQuery を次のように展開します。
$("img[async-src]").each(function(index) {
$(this).load(function() {
// code to run after loading
});
$(this).attr("src", $(this).attr("async-src"));
});