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ó srcSet
lớp và load
sự kiện ràng buộc nhận currentSrc
(hoặc src
nếu không được hỗ trợ) và đặt nó dưới dạng background-image
CSS cho cha mẹ gần nhất với bgFromSrcSet
lớ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
load
sự 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
load
sự 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 bgFromSrcSet
phải không được thiết lập để img
chính nó! Nó chỉ có thể được đặt thành các phần tử trong img
cây mẹ DOM.