CSS 的后备图片
Fallback image with CSS
我有一个显示远程图像的 <img>
。
我希望它 回退到另一个本地图像,以防无法访问远程图像。
<img class="cc_image fallback" src="http://www.iconarchive.com/download/i82888/limav/flat-gradient-social/Creative-Commons.ico">
.cc_image {
width: 256px;
height: 256px;
}
.cc_image.fallback {
/* this URL here is theoretically a local one (always reachable) */
background-image: url('https://cdn2.iconfinder.com/data/icons/picons-basic-3/57/basic3-010_creative_commons-256.png');
}
它的工作原理是当找不到 src 图像时将显示背景图像。
缺点是:
- 它将始终加载背景图像(额外的 HTTP 请求)
- 它在原始图像的位置显示了一个 not-found-icon(Safari 上的问号),显示在背景图像上方(不是大问题,但我想摆脱它)
我该如何解决这些问题?
或者:是否有其他技术可以达到同样的效果?
我找到了 this question 但给定的解决方案依赖于 Javascript 或 <object>
(这似乎不适用于 Chrome)。我想要一个纯粹的 CSS/HTML 解决方案,如果可能,没有 Javascript。
我知道多个 background-image
但我不确定它是否是一个好的选择(浏览器支持?它会回退到无法访问的图像吗?)。
或者我正在考虑将 SVG 图像嵌入为 data-uri.
关于最灵活(和兼容)方法的建议?
不幸的是,如果没有 Javascript 或对象标签,您将无法同时实现这两者。
您可以这样做以避免丢失图像图标:
将您的图像放入一个容器中(它可能已经在一个容器中)。
使容器的宽度和高度与图像相同。
- 将后备图像设置为容器的背景图像。
- 将远程图像设置为您的 img 标签的背景图像。
- 加载一个 1x1 像素的透明 png 作为图像的 src(请参阅代码了解如何在没有额外 HTTP 请求的情况下完成)。
代码:
HTML
<!-- you could use any other tag, such as span or a instead of div, see css below -->
<div class="cc_image_container fallback">
<img class="cc_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" style="background-image: url(*your remote image*)"/>
</div>
CSS
.fallback {
background-image: url(*fallback image here*);
display: inline-block; /*to ensure it wraps correctly around the image, even if it is a a or span tag*/
min-width: specify a minimum width (could be the width of the fallback image) px;
min-height: specify a minimum height (could be the height of the fallback image) px;
background-position: center center; // fallback for older browsers
background-size: cover;
background-repeat: no-repeat;
}
.cc_image {
min-width: same as container px;
min-height: same as container px;
background-position: center center; // fallback for older browsers
background-size: cover;
background-repeat: no-repeat;
}
min-width
和 max-width
确保背景图像保持可见。
background-position
确保图像的中心部分保持可见并且对于旧浏览器来说是一种优雅的退化
background-size
调整背景图像的大小以填充元素背景。 cover
值表示图像将调整大小以完全覆盖元素(图像的一些外边缘可能会被裁剪)
- img src标签中的base64数据是透明的1px png
- 这将有一个额外的好处,即普通用户和一些机器人可能无法保存您的图像(基本的图像保护)
- 唯一的缺点是,您仍然会有一个备用图像的额外 HTTP 请求。
在Codepen上找到了解决办法,分享给大家:
https://codepen.io/anon/pen/Eqgyyo
我更喜欢这个解决方案,因为它适用于真实的图像标签,而不是背景图像。
body {
color: #2c3e50;
font-family: 'verdana';
line-height: 1.35em;
padding: 30px;
}
h1 {
margin-bottom: 40px;
}
ul {
list-style: none;
padding: 0;
}
* {
box-sizing: border-box;
}
img {
color: #95a5a6;
font-size: 12px;
min-height: 50px;
position: relative;
}
img:before {
background: #f1f1f1;
border: 1px solid #ccc;
border-radius: 3px;
content: 'F517' ' broken image of 'attr(alt);
display: block;
left: 0;
padding: 10px;
position: absolute;
top: -10px;
width: 100%;
}
<h1>Broken image fallback CSS</h1>
<img src="no-image-here" alt="Cats with synthesizers in the space " />
<br /><br />
<ul>
<li>✓ Firefox</li>
<li>✓ Chrome</li>
<li>✓ Opera</li>
<li>✗ Safari (desktop, mobile)</li>
<li>✗ iOS webview</li>
</ul>
我有一个显示远程图像的 <img>
。
我希望它 回退到另一个本地图像,以防无法访问远程图像。
<img class="cc_image fallback" src="http://www.iconarchive.com/download/i82888/limav/flat-gradient-social/Creative-Commons.ico">
.cc_image {
width: 256px;
height: 256px;
}
.cc_image.fallback {
/* this URL here is theoretically a local one (always reachable) */
background-image: url('https://cdn2.iconfinder.com/data/icons/picons-basic-3/57/basic3-010_creative_commons-256.png');
}
它的工作原理是当找不到 src 图像时将显示背景图像。
缺点是:
- 它将始终加载背景图像(额外的 HTTP 请求)
- 它在原始图像的位置显示了一个 not-found-icon(Safari 上的问号),显示在背景图像上方(不是大问题,但我想摆脱它)
我该如何解决这些问题? 或者:是否有其他技术可以达到同样的效果?
我找到了 this question 但给定的解决方案依赖于 Javascript 或 <object>
(这似乎不适用于 Chrome)。我想要一个纯粹的 CSS/HTML 解决方案,如果可能,没有 Javascript。
我知道多个 background-image
但我不确定它是否是一个好的选择(浏览器支持?它会回退到无法访问的图像吗?)。
或者我正在考虑将 SVG 图像嵌入为 data-uri.
关于最灵活(和兼容)方法的建议?
不幸的是,如果没有 Javascript 或对象标签,您将无法同时实现这两者。
您可以这样做以避免丢失图像图标:
将您的图像放入一个容器中(它可能已经在一个容器中)。 使容器的宽度和高度与图像相同。
- 将后备图像设置为容器的背景图像。
- 将远程图像设置为您的 img 标签的背景图像。
- 加载一个 1x1 像素的透明 png 作为图像的 src(请参阅代码了解如何在没有额外 HTTP 请求的情况下完成)。
代码:
HTML
<!-- you could use any other tag, such as span or a instead of div, see css below -->
<div class="cc_image_container fallback">
<img class="cc_image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" style="background-image: url(*your remote image*)"/>
</div>
CSS
.fallback {
background-image: url(*fallback image here*);
display: inline-block; /*to ensure it wraps correctly around the image, even if it is a a or span tag*/
min-width: specify a minimum width (could be the width of the fallback image) px;
min-height: specify a minimum height (could be the height of the fallback image) px;
background-position: center center; // fallback for older browsers
background-size: cover;
background-repeat: no-repeat;
}
.cc_image {
min-width: same as container px;
min-height: same as container px;
background-position: center center; // fallback for older browsers
background-size: cover;
background-repeat: no-repeat;
}
min-width
和max-width
确保背景图像保持可见。background-position
确保图像的中心部分保持可见并且对于旧浏览器来说是一种优雅的退化background-size
调整背景图像的大小以填充元素背景。cover
值表示图像将调整大小以完全覆盖元素(图像的一些外边缘可能会被裁剪)- img src标签中的base64数据是透明的1px png
- 这将有一个额外的好处,即普通用户和一些机器人可能无法保存您的图像(基本的图像保护)
- 唯一的缺点是,您仍然会有一个备用图像的额外 HTTP 请求。
在Codepen上找到了解决办法,分享给大家: https://codepen.io/anon/pen/Eqgyyo
我更喜欢这个解决方案,因为它适用于真实的图像标签,而不是背景图像。
body {
color: #2c3e50;
font-family: 'verdana';
line-height: 1.35em;
padding: 30px;
}
h1 {
margin-bottom: 40px;
}
ul {
list-style: none;
padding: 0;
}
* {
box-sizing: border-box;
}
img {
color: #95a5a6;
font-size: 12px;
min-height: 50px;
position: relative;
}
img:before {
background: #f1f1f1;
border: 1px solid #ccc;
border-radius: 3px;
content: 'F517' ' broken image of 'attr(alt);
display: block;
left: 0;
padding: 10px;
position: absolute;
top: -10px;
width: 100%;
}
<h1>Broken image fallback CSS</h1>
<img src="no-image-here" alt="Cats with synthesizers in the space " />
<br /><br />
<ul>
<li>✓ Firefox</li>
<li>✓ Chrome</li>
<li>✓ Opera</li>
<li>✗ Safari (desktop, mobile)</li>
<li>✗ iOS webview</li>
</ul>