响应式设计:不同屏幕尺寸使用不同的图片

11
我们的客户想在小屏幕和大屏幕上显示不同的横幅图片。不仅仅是缩小/拉伸以适应屏幕大小,而是实际替换成另一张图片。完整尺寸的图片相当复杂,包括几个人、两个标志和一些装饰文本。因此,他们想从小图像中裁剪掉一些人物,去掉标志等等。因此,他们希望在桌面设备上使用最大、最复杂的图像,在中型设备上使用较小、更简单的图像,在最小的设备上使用更小、更简单的图像。

那么,最好的方法是什么?

我首先想到的是将所有三个图像都包含在内,并使用 @media min/max 宽度来在任何给定的尺寸下使其中两个图像不可见。例如:

@media (max-width: 400px) { .smallimg {display: block} .midimg {display: none} .bigimg {display: none} }
@media (min-width: 401px) and (max-width: 700px)  { .smallimg {display: none} .midimg {display: block} .bigimg {display: none} }
@media (min-width: 701px)  { .smallimg {display: none} .midimg {display: none} .bigimg {display: block} }

这种方法看起来是可行的,但每次都会下载全部三张图片,这似乎浪费了带宽。我可以将这些图片从img标签改为CSS背景图像,这样会更好吗?它是否能避免下载全部三张图片,还是仍然会下载?

我曾考虑通过编写一些JavaScript代码来根据屏幕尺寸动态更新img标签中的URL,但这似乎会增加很多复杂性。

我曾简要想过将标志和文本分开制作成不同的图片,并将实际图片分解成多个部分,然后将它们组合成重叠的图片。但是这听起来需要很多工作来做到完美,而且我必须确保它在所有可能的尺寸下都能正确显示,如缩小或拉伸等,这并不容易。虽然在这种特殊情况下可能是可行的,但我更喜欢一个通用的解决方案,以便将来可以使用。

有没有人做过类似于这样的事情,并且对如何最好地完成它有一些想法?


为什么不测试一下呢?只需将一些图像设置为背景并隐藏它们。然后您可以从浏览器中检查是否实际请求了隐藏的div。 - Francisco Presencia
2
@FranciscoPresencia 使用背景图像会在块隐藏时不会加载图像(请参见https://dev59.com/x2ct5IYBdhLWcg3wWMFF)。 - Albert Xing
@Jay 如果较小的图像是最大图像的“裁剪”,您可以将最大图像加载为横幅的背景,然后使用背景大小和背景定位来适应不同的屏幕尺寸,以防止加载多个图像。 - Arbel
你能否更改每个图像的z-index或opacity?这样它们不必因为“display:none”而重新加载。只是一个想法。 - Kevin
1
http://mobile.smashingmagazine.com/2013/07/22/simple-responsive-images-with-css-backgrounds/ - Stephen Thomas
显示剩余2条评论
2个回答

4

媒体查询中,您可以使用CSS的background属性。仅当CSS需要加载图像时才会加载它们,因此如果没有任何选择器与其匹配,则不会加载该图像。

这篇文章肯定会对您有所帮助。


可能是 https://dev59.com/kmkx5IYBdhLWcg3wAvmn 的重复问题。 - Karan Thakkar
在哪个设备或浏览器上?@Jay - Karan Thakkar
@Jay 属性 backgroud-image 在所有浏览器中都得到支持,如 FF、Chrome、Opera、Android、IOS 等等。我猜在 IE8 以下版本可能会有问题。请查看 http://caniuse.com/#feat=background-img-opts。 - Karan Thakkar
1
等一下,我帖子中的关键词是“打印”。是的,今天所有主要浏览器都支持background-image。但是当用户打印图像时,而不是在屏幕上显示它时,至少某些浏览器的默认行为是不打印背景图像。我推断这是因为“真正的”背景图像是装饰性的背景,往往会使打印页面变得混乱。 - Jay
使用<div>标签而不是图像标签,在较小的三星设备和iPhone设备上无法正常工作。图像将无法适应屏幕,右侧将被裁剪。 - AnKr
显示剩余3条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接