我正在寻找一种方法,在检测到的情况下让旧版浏览器显示PNG图像作为SVG的替代。我的网站徽标目前是SVG格式,但旧版浏览器(特别是IE 8及以下版本)无法渲染它。我已经有了PNG格式的徽标。执行这个任务的最佳方法是什么?
谢谢。
我正在寻找一种方法,在检测到的情况下让旧版浏览器显示PNG图像作为SVG的替代。我的网站徽标目前是SVG格式,但旧版浏览器(特别是IE 8及以下版本)无法渲染它。我已经有了PNG格式的徽标。执行这个任务的最佳方法是什么?
谢谢。
<!--[if lte IE 8]><img src="logo.png" /><![endif]-->
<!--[if gt IE 8]><img src="logo.svg" /><![endif]-->
<!--[if !IE]> --><img src="logo.svg" /><!-- <![endif]-->
http://msdn.microsoft.com/en-us/library/ms537512%28v=vs.85%29.aspx
如果您还想处理非IE浏览器的情况,您可以使用JavaScript或PHP检查用户代理。<!--[if gte IE 9]><!--><img src="logo.svg" /><!--<![endif]-->
这段代码可以在IE 9及以上版本和非IE浏览器中正常工作,而不会重复使用<svg>标签。 - mcrumley<object type="image/svg+xml" data="image.svg">
<img src="image.png" alt="image"/>
</object>
background: transparent url(fallback-image.png) center center no-repeat;
background-image: -webkit-linear-gradient(transparent, transparent), url(vector-image.svg);
background-image: -moz-linear-gradient(transparent, transparent), url(vector-image.svg);
background-image: linear-gradient(transparent, transparent), url(vector-image.svg);
src
属性。例如:if (!Modernizr.svg) {
var imgs = document.getElementsByTagName('img');
var endsWithDotSvg = /.*\.svg$/
var i=0;
var l = imgs.length;
for (; i != l; ++i) {
if (imgs[i].src.match(endsWithDotSvg)) {
imgs[i].src = imgs[i].src.slice(0, -3) + "png";
}
}
}
onerror
(例如Chrome和FF 15+)。有关Firefox的更多信息,请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=528448 为了向后兼容,您可以在设置src
之前简单地添加this.onerror=null;
- SepehrM回复Adiabatic的评论:
您还可以将备用img路径设置为data属性。这样可以使备用路径更加灵活。
示例(HTML + JS):
<object type="image/svg+xml" data="image.svg" data-fallback="image.png"></object>
<script>
if (!Modernizr.svg) {
var imgs = document.getElementsByTagName('img');
var endsWithDotSvg = /.*\.svg$/
var i=0;
var l = imgs.length;
for (; i != l; ++i) {
if (imgs[i].src.match(endsWithDotSvg)) {
var fallback = imgs[i].getAttribute('data-fallback');
if(typeof fallback !== "undefined" && fallback !== "")
{
imgs[i].src = fallback;
}
}
}
}
</script>
<a class="site-logo" href="/">
<!--[if gte IE 9]><!--><img alt="Acme Supplies" src="logo.svg" data-fallback="logo.png" onerror="this.src=this.getAttribute('data-fallback');this.onerror=null;" /><!--<![endif]-->
<!--[if lt IE 9]><img alt="Acme Supplies" src="logo.png" /><![endif]-->
</a>
http://davidgoss.co.uk/2013/01/30/use-svg-for-your-logo-and-still-support-old-ie-and-android/
对于装饰性图片,我使用Pau Giner所描述的“透明渐变SVG回退技术”。
CSS:
.icon-file {
background: transparent url(../images/file.png) center center no-repeat;
background-image: -webkit-linear-gradient(transparent,transparent), url(../images-svg/file.svg);
background-image: -o-linear-gradient(transparent,transparent), url(../images-svg/file.svg);
background-image: -moz-linear-gradient(transparent,transparent), url(../images-svg/file.svg);
background-image: -ms-linear-gradient(transparent,transparent), url(../images-svg/file.svg);
background-image: linear-gradient(transparent,transparent), url(../images-svg/file.svg);
background-size: 100%;
}
http://pauginer.com/post/36614680636/invisible-gradient-technique
这个方法对我有效:
<?php
$browser = get_browser(null, true);
$extension = "png";
if ($browser['browser'] == "Chrome" && $browser['version'] >= 49){
$extension = "svg";
}else if($browser['browser'] == "Firefox" && $browser['version'] >= 57){
$extension = "svg";
}else if($browser['browser'] == "Opera" && $browser['version'] >= 49){
$extension = "svg";
}else if($browser['browser'] == "IE" && $browser['version'] >= 11){
$extension = "svg";
}else if($browser['browser'] == "Safari" && $browser['version'] >= 11){
$extension = "svg";
}
?>
默认情况下,您正在告诉变量"$extension"为PNG格式,但如果浏览器版本能够呈现SVG格式,则该变量将更改为SVG格式。
然后在您的HTML中,只需完成文件扩展名并回显该变量即可。
<img src="image.<?php echo $extension ?>">
现在您的网页将根据浏览器版本加载"image.png"或"image.svg"。
重要信息:
** 为了使此脚本正常工作,您需要设置文件browscap.ini,以便使用PHP函数“get_browser”。
** 关于SVG的浏览器功能是从此网站获取的: