Basierend auf der Antwort von @Weston habe ich eine allgemeinere jQuery-Lösung erstellt. Sie können JS und CSS einfach kopieren und einfügen und sich auf den HTML-Teil konzentrieren;)
CSS
... um sicherzustellen, dass Bilder beim Laden kaum sichtbar sind
.srcSet{
position: fixed;
z-index: 0;
z-index: -1;
z-index: -100;
/* you could probably also add visibility: hidden; */
}
JS / jQuery
Dieses Skript durchläuft alle Bilder mit srcSet
Klassen- und Bindungsereignissen load
, die ausgeführt werden currentSrc
(oder src
nicht unterstützt werden), und legt sie als background-image
CSS an das nächstgelegene übergeordnete Element mit bgFromSrcSet
Klasse weiter.
Das selbst würde nicht reichen! Daher wird auch eine Intervallprüfung für daswindow
load
Ereignis durchgeführt, um zu testen, ob die Ladeereignisse abgeschlossen wurden. Wenn nicht, werden sie ausgelöst. (Dasimg
load
Ereignis wird sehr oft nur beim erstmaligen Laden ausgelöst. Beimfolgenden Laden kann die Bildquelle aus dem Cache abgerufen werden, was dazu führt , dass das img-Ladeereignis NICHT ausgelöst wird! )
jQuery(function($){ //ON DOCUMENT READY
var $window = $(window); //prepare window as jQuery object
var $srcSets = $('.srcSet'); //get all images with srcSet clas
$srcSets.each(function(){ //for each .srcSet do...
var $currImg = $(this); //prepare current srcSet as jQuery object
$currImg
.load(function(){ //bind the load event
var img = $currImg.get(0); //retrieve DOM element from $currImg
//test currentSrc support, if not supported, use the old src
var src = img.currentSrc ? img.currentSrc : img.src;
//To the closest parent with bgFromSrcSet class,
//set the final src as a background-image CSS
$currImg.closest('.bgFromSrcSet').css('background-image', "url('"+src+"')");
//remove processed image from the jQuery set
//(to update $srcSets.length that is checked in the loadChecker)
$srcSets = $srcSets.not($currImg);
$currImg.remove(); //remove the <img ...> itself
})
;
});
//window's load event is called even on following loads...
$window.load(function(){
//prepare the checker
var loadChecker = setInterval(function(){
if( $srcSets.length > 0 ) //if there is still work to do...
$srcSets.load(); //...do it!
else
clearInterval(loadChecker); //if there is nothing to do - stop the checker
}, 150);
});
});
HTML
... könnte so aussehen:
<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>
Hinweis: Klasse bgFromSrcSet
darf nicht auf sich img
selbst gesetzt werden! Es kann nur auf die Elemente im img
übergeordneten DOM-Baum festgelegt werden.