img
属性的 srcset
看起来像是处理自适应图像的好方法。是否存在适用于css background-image
属性的等效语法?
HTML
<img src="small.jpg" srcset="medium.jpg 1000w, large.jpg 2000w" alt="yah">
CSS
.mycontainer {
background: url(?something goes here?);
}
答案 0 :(得分:66)
image-set
是等效的CSS功能。我们应该在规范中添加等效的srcset功能(根据其维度定义资源)。
目前它仅在Safari,Chrome和Opera中使用-webkit-
前缀实现,并且它仅支持x
描述符。
答案 1 :(得分:19)
非常确定:
background: -webkit-image-set( url('path/to/image') 1x, url('path/to/high-res-image') 2x );
以同样的方式工作。浏览器将检查图像,查看最适合的图像并使用该图像。
答案 2 :(得分:8)
对于polyfill,您可以使用带有srcset的img作为下载正确图像大小的机制,然后使用JS隐藏它并设置父元素的背景图像。
这是一个小提琴:http://jsbin.com/garetikubu/edit?html,output
使用onload
并将JS作为阻止脚本放在<head>
中非常重要。如果您稍后放置脚本(例如在<body>
末尾),则可能会出现竞争条件,其中浏览器尚未设置img.currentSrc。最好等待它加载。
该示例允许您查看正在下载的原始img。您可以使用一些CSS轻松隐藏它。
答案 3 :(得分:5)
另一种坦率地说更健壮的方法是使背景图像的特征和选项适应具有srcset属性的图像。
要执行此操作,请将图像设置为宽度:100%;身高:100%;和物体贴合:覆盖或包含。
以下是一个例子:
<div class="psuedo-background-img-container">
<img class="psuedo-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>
&#13;
EnableCdn="true"
&#13;
对于每个人来说,这可能不是最好的方法,但我认为如果没有任何javascript解决方法,它将获得最理想的结果。
答案 4 :(得分:5)
您可以将媒体查询用于您的目的。这很容易:
SELECT dT.ID, dT.Name, dT.A_Whatever
,(SELECT DATEDIFF(dd, A2.ADATE, A2.BDATE)
FROM A AS A2
WHERE dT.ID = A2.ID --the primary key
) AS [DateDiff]
--AND SO ON........
FROM (
SELECT DISTINCT ID,
NAME,
CASE WHEN A.ID IS NULL THEN 'NOT EX.'
ELSE A.Whatever
END AS A_Whatever,
D.Z1 AS A.P
--AND SO ON......
FROM A
INNER JOIN A ON A.ID= B.ID AND A.Nb= B.Nb
LEFT JOIN T AS T2_ID ON T2_D.Z= A.Z
LEFT JOIN L1 ON A.NR = L1.NR AND A.S = L1.S
LEFT JOIN LF ON LF.NR = L1.LNR
--AND SO ON.......
) AS dT
我认为它适用于支持媒体查询的每个浏览器;)
答案 5 :(得分:3)
使用<picture>
元素的类似解决方案:
Tutorial here
教程案例:
我怀疑如果我使用相同的图像来缩小屏幕尺寸, 我的图像的主要主题可能会变得太小。我想要 显示不同的图像(更侧重于主要主题) 不同的屏幕尺寸,但我仍然想显示单独的资产 基于设备像素比率的相同图像,我想自定义 基于视口的图像高度和宽度。
示例代码:
<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>
答案 6 :(得分:2)
基于@Weston的答案,我已经构建了一个更通用的jQuery解决方案,你基本上只需复制和粘贴JS和CSS并专注于HTML部分;)
...确保加载时图像几乎不可见
.srcSet{
position: fixed;
z-index: 0;
z-index: -1;
z-index: -100;
/* you could probably also add visibility: hidden; */
}
此脚本将浏览具有srcSet
类和绑定load
事件的所有图片,该事件需要currentSrc
(如果不支持,则为src
)并将其作为{{ {1}} CSS与background-image
类最近的父级。
这本身就不够了! 所以它还会在bgFromSrcSet
window
事件上放置一个间隔检查器来测试加载事件是否有已完成,如果没有,它会触发它们。 (load
img
事件通常仅在第一次加载时触发 ,在后续加载时,可以从缓存中检索图像源,导致img加载事件不被解雇了!)
load
......看起来像这样:
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);
});
});
注意:类<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
DOM父树中的元素。
答案 7 :(得分:2)
如果您使用的是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