Основываясь на ответе @Weston, я создал более общее решение jQuery, вы можете просто скопировать и вставить JS и CSS и сосредоточьтесь на части HTML;)
CSS
...чтобы изображения были едва видны при загрузке
.srcSet{
position: fixed;
z-index: 0;
z-index: -1;
z-index: -100;
/* you could probably also add visibility: hidden; */
}
JS/JQuery
Этот скрипт просматривает все изображения с классом srcSet
и связывает событие load
, которое принимает currentSrc
(или src
, если не поддерживается) и помещает его как CSS background-image
для ближайшего родителя с классом bgFromSrcSet
.
Этого самого по себе недостаточно! Поэтому он также помещает средство проверки интервала в событие window
load
, чтобы проверить, были ли завершены события загрузки, и если нет, то оно их запускает. (img
load
событие очень часто срабатывает только при первой загрузке, при последующих загрузках источник изображения может быть извлечен из кеша, что приводит к событию загрузки img НЕ уволен!)
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
... может выглядеть так:
<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>
Примечание: класс bgFromSrcSet
не должен быть установлен на сам img
! Его можно установить только для элементов в родительском дереве img
DOM.
person
jave.web
schedule
14.08.2017