Dựa trên câu trả lời của @Weston , tôi đã xây dựng một giải pháp jQuery tổng quát hơn, về cơ bản bạn có thể chỉ cần sao chép & dán JS và CSS và tập trung vào phần HTML;)
CSS
... để đảm bảo hình ảnh sẽ khó được nhìn thấy trong khi tải
.srcSet{
position: fixed;
z-index: 0;
z-index: -1;
z-index: -100;
}
JS / jQuery
Tập lệnh này sẽ đi qua tất cả các hình ảnh có srcSetlớp và loadsự kiện ràng buộc nhận currentSrc(hoặc srcnếu không được hỗ trợ) và đặt nó dưới dạng background-imageCSS cho cha mẹ gần nhất với bgFromSrcSetlớp.
Chính điều đó sẽ không đủ! Vì vậy, nó cũng đặt một trình kiểm tra khoảng thời gian trênwindow loadsự kiện để kiểm tra xem các sự kiện tải đã được hoàn thành hay chưa, nếu chưa, nó sẽ kích hoạt chúng. (img loadsự kiện rất thường chỉ được kích hoạt khi tải lần đầu , ở những lần tải sau, nguồn hình ảnh có thể được truy xuất từ bộ nhớ đệm, dẫn đến sự kiện tải img KHÔNG được kích hoạt! )
jQuery(function($){
var $window = $(window);
var $srcSets = $('.srcSet');
$srcSets.each(function(){
var $currImg = $(this);
$currImg
.load(function(){
var img = $currImg.get(0);
var src = img.currentSrc ? img.currentSrc : img.src;
$currImg.closest('.bgFromSrcSet').css('background-image', "url('"+src+"')");
$srcSets = $srcSets.not($currImg);
$currImg.remove();
})
;
});
$window.load(function(){
var loadChecker = setInterval(function(){
if( $srcSets.length > 0 )
$srcSets.load();
else
clearInterval(loadChecker);
}, 150);
});
});
HTML
... có thể trông như thế này:
<div class="bgFromSrcSet">
<img class="srcSet"
alt=""
src="http://example.com/something.jpeg"
srcset="http://example.com/something.jpeg 5760w, http://example.com/something-300x200.jpeg 300w, http://example.com/something-768x512.jpeg 768w, http://example.com/something-1024x683.jpeg 1024w, http://example.com/something-1000x667.jpeg 1000w"
sizes="(max-width: 2000px) 100vw, 2000px"
>
Something else...
</div>
Lưu ý: lớp bgFromSrcSetphải không được thiết lập để imgchính nó! Nó chỉ có thể được đặt thành các phần tử trong imgcây mẹ DOM.