对于 css 背景图像是否有一个 srcset 等价物

具有 srcset属性的 img看起来像是一种处理响应图像的好方法。在 cssbackground-image属性中是否有等效的语法?

超文本标示语言

<img src="small.jpg" srcset="medium.jpg 1000w, large.jpg 2000w" alt="yah">

CSS

.mycontainer {
background: url('what goes here?');
}
73306 次浏览

我很确定:

background: -webkit-image-set( url('path/to/image') 1x, url('path/to/high-res-image') 2x );

浏览器会检查图片,看哪个最合适,然后使用那个。

image-set is the equivalent CSS feature. We should add equivalent srcset functionality (defining resources according to their dimensions) to the spec.

目前在所有主流浏览器(Firefox,Chrome,Safari,Edge)中都使用了 -webkit-前缀。Safari 只支持 x描述符。

对于 polyfill,您可以使用带 srcset 的 img 作为下载正确图像大小的机制,然后使用 JS 隐藏它并设置父元素的背景图像。

这是小提琴: http://jsbin.com/garetikubu/edit?html,output

使用 onload并将 JS 作为阻塞脚本放在 <head>中非常重要。如果稍后放置脚本(比如在 <body>的末尾) ,则可以得到浏览器尚未设置 img.currentSrc 的竞态条件。最好等它上膛。

这个例子允许你看到原始的 img 被下载。你可以很容易地用一些 CSS 来隐藏它。

使用 <picture>元素的类似解: 这里是教程

教程案例:

我怀疑如果我在小屏幕上使用相同的图像, 我的主要主题的图像可能变得太小尺寸。我想 中显示不同的图像(更集中于主题) 不同的屏幕大小,但我仍然希望显示单独的资产 相同的图像基于设备像素比例,我想定制 基于 viewport 的图像的高度和宽度。

示例代码:

<picture>


<source media="(max-width: 20em)" srcset="images/small/space-needle.jpg 1x,
images/small/space-needle-2x.jpg 2x, images/small/space-needle-hd.jpg 3x">


<source media="(max-width: 40em)" srcset="images/medium/space-needle.jpg 1x,
images/medium/space-needle-2x.jpg 2x, images/medium/space-needle-hd.jpg 3x">


<img src="space-needle.jpg" alt="Space Needle">


</picture>

基于 @ Weston的回答,我已经构建了一个更通用的 jQuery 解决方案,你基本上只需要复制粘贴 JS 和 CSS,然后专注于 HTML 部分;)

DR 小提琴: https://jsfiddle.net/dpaa7oz6/

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) ,并将其作为 background-image CSS 放置到最接近的具有 bgFromSrcSet类的父类。

这本身是不够的!因此它还在 window load事件上放置了一个间隔检查器来测试负载事件是否已经完成,如果没有,它将触发它们。(img load事件经常触发 只有在第一次装载的时候,在以下负载时,可以从高速缓存 导致 img 加载事件 < strong > NOT 被触发!中检索图像源)

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 父树中的元素。

另一种方法,坦率地说更加健壮,是将背景图像的特征和选项适应具有 srcset 属性的图像。

要做到这一点,请将图像设置为宽度: 100% ; 高度: 100% ; 对象匹配: 覆盖或包含。

这里有一个例子:

.pseudo-background-img-container {
position: relative;
width:400px;
height: 200px;
}
.pseudo-background-img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
<div class="pseudo-background-img-container">


<img class="pseudo-background-img" src="https://cdn3.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep.jpg" srcset="https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep.jpg 640w, https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep-280x175.jpg 280w, https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep-432x270.jpg 432w, https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep-216x135.jpg 216w" sizes="(max-width: 640px) 100vw, 640px">


</div>

这可能不是最好的方法为每个人,但我想它会得到最理想的结果没有任何 javascript 工作区。

You can use media queries for your purpose. It's easy as this:

.mycontainer {
background-image:url("img/image-big.jpg"); // big image
}


@media(max-width: 768px){
.mycontainer {
background-image:url("img/image-sm.jpg"); // small image
}
}

我认为它适用于每一个支持媒体查询的浏览器;)

如果您使用的是 Foundation 框架(https://foundation.zurb.com/) ,那么您可以使用 Interchange 插件:

<div data-interchange="[assets/img/interchange/small.jpg, small],
[assets/img/interchange/medium.jpg, medium],
[assets/img/interchange/large.jpg, large]">
</div>

Https://foundation.zurb.com/sites/docs/interchange.html#use-with-background-images

根据 CSSTricksimage-set()应该在2021年用于这个目的。

下面是它推荐的支持所有现代浏览器版本的完整代码片段:

.hero {
/* Fallback */
background-image: url("platypus.png");


/* Chrome/Edge/Opera/Samsung, Safari will fallback to this as well */
background-image: -webkit-image-set(url("platypus.png") 1x, url("platypus-2x.png") 2x);


/* Standard use */
background-image: image-set(url("platypus.png") 1x, url("platypus-2x.png") 2x);
}

我已经使用了 懒惰大小的插件称为 bg-set为背景图像添加响应。它的工作方式与 srcset 类似,并根据设备宽度提供一组多个背景图像。

<div class="lazyload" data-bgset="image-200.jpg 200w, image-300.jpg 300w, image-400.jpg 400w" data-sizes="auto">

The images in the data-bgset are the same, we are just providing the width specified image which the browser will be able to choose from.