前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Using SVG

Using SVG

作者头像
icepy
发布于 2019-06-24 09:55:33
发布于 2019-06-24 09:55:33
2.4K00
代码可运行
举报
文章被收录于专栏:子曰五溪子曰五溪
运行总次数:0
代码可运行

原文地址: https://css-tricks.com/using-svg/ 原文作者: Chris Coyier 翻译作者: chenmf

SVG是一种向量图的图片格式,即可伸缩向量图(Scalable Vector Graphics),可以在Adobe Illustrator里面生成。在Web中使用SVG很简单,但是也有一些需要知道的事情。

为什么用SVG

  • 压缩后文件体积小
  • 可以无损伸缩到任意尺寸(除非尺寸特别小)
  • 在retina屏幕上可以完美显示
  • 设计可控,比如交互和滤镜

怎么生成SVG

可以在Adobe Illustrator里设计并且得到SVG。下面是一个站在椭圆上的奇异鸟:

留意到画板刚好贴着设计主体的边缘,画布的大小在SVG里面的重要性和在PNG和JPG里面是一样的。

然后可以直接在Adobe Illustrator里面保存成SVG文件。

保存的时候,可以在duihua对话框里面选择SVG选项。完整的参考可以看SVG 介绍。这里选SVG 1.1就可以了。

当点击'OK'或者'SVG Code...'的时候,就会打开文本编辑器,显示SVG的编码。

<img>标签里面使用SVG

如果把SVG保存成文件之后,可以直接在<img>标签里面使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML
<img src="kiwi.svg" alt="Kiwi standing on oval">

在Illustrator里面,画板的大小是612px ✕ 502px:

这正是图片在页面中的大小。可以选择<img>标签并且改变widthheight来改变它的尺寸,就像PNG和JPG一样,比如:

前往codepen查看

浏览器支持

<img>标签里面使用需要有浏览器支持。基本上在IE8以上和Android 2.3以上都可以用。 如果你想要在不支持的浏览器里面使用,可以这样:

  1. 使用Modernizr来替换<img>src属性:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jQuery

if (!Modernizr.svg) {
  $(".logo img").attr("src", "images/logo.png");
}
  1. David Bushell提供了一个更简单的操作:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML

<img src="image.svg" onerror="this.onerror=null; this.src='image.png'">
  1. 使用SVGeezy

background-image里面使用SVG

可以在CSSbackground-image里面使用SVG。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML

<a href="/" class="logo">
  Kiwi Corp
</a>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CSS

.logo {
  display: block;
  text-indent: -9999px;
  width: 100px;
  height: 82px;
  background: url(kiwi.svg);
  background-size: 100px 82px;
}

注意把background-size设置成我们想要的尺寸,否则只能看到很大的原始SVG图片的左上角。这个尺寸设置成了跟原始尺寸保持宽高比,如果在不知道原始尺寸的情况下想要保持宽高比,可以把background-size设置成contain

浏览器支持

background-image里面使用SVG也需要看浏览器支持,基本上跟在<img>中使用是一样的。

如果要在不支持的浏览器里面使用:

  1. 用Modernizr把background-image替换成一个支持的格式。它会在不支持SVG的情况下加上一个no-svg的class,注意它也是只会发送一个图片的HTTP请求,不会发两个。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CSS

.main-header {
  background: url(logo.svg) no-repeat top left;
  background-size: contain;
}

.no-svg .main-header {
  background-image: url(logo.png);
}
  1. 另一个更方便的方法,就是利用多个背景(background),SVG的浏览器支持和多背景的很接近。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CSS

body {
  background: url(fallback.png);
  background-image: url(image.svg), none;
}

使用<img>background-image的问题

<img>background-image里面使用SVG,没法利用CSS对SVG内部进行控制,所以接着看下面的两种其他方式。

使用内联(inline)SVG

在保存SVG的时候可以获取SVG的代码(也可以直接在文本编辑器里面打开SVG文件),直接把SVG的代码复制到HTML里面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML

<body>

   <!--SVG的代码复制到这里就可以显示图片了  -->

</body>

这样做的好处是把图片的内容直接写在文档里面,不需要额外发送HTTP请求获取,它和使用Data URI的好处是一样的,坏处也一样:导致文档变得臃肿,难以抓取和缓存。

如果使用后端语言的话,可以获取文件并且插入到文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PHP

<?php echo file_get_contents("kiwi.svg"); ?>

说到PHP,这里用file_get_contents()方法比较合适,而不是include()include_once(),因为SVG有时候会以<?xml version="1.0" encoding="UTF-8"?>开头,导致PHP编译有问题。

先优化SVG

Adobe Illustrator里面导出的SVG可能不是最优的,会包含一些冗余信息,比如DOCTYPE和生成信息。我们可以进一步优化,减少体积。Peter Collingridge给出了在线的SVG 优化,把需要优化的SVG上传,然后下载新的就可以了。 如果你是硬核玩家,可以直接用这个NodeJS工具自己优化。

用CSS来控制SVG

SVG的代码看起来是不是很像HTML?因为它们都是基于XML的。我们的SVG里面包含了两个元素:<ellipse><path>,可以直接在代码里面给它们加上class,就像HTML元素一样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SVG

<svg ...>
  <ellipse class="ground" .../>
  <path class="kiwi" .../>
</svg>

然后就可以用特殊的SVG CSS来控制这些元素了。SVG元素由着特殊的CSS属性,比如它没有background-color,而是用fill,但是也可以使用一些其他的普通属性,比如:hover

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CSS

.kiwi {
  fill: #94d31b; 
}
.kiwi:hover {
  fill: #ace63c; 
}

更厉害的是,SVG可以使用滤镜(filter),比如模糊滤镜。比如在SVG代码里面可以加上一个滤镜:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SVG

<svg ...>
  ...
  <filter id="pictureFilter" >
    <feGaussianBlur stdDeviation="5" />
  </filter> 
</svg>

然后可以在CSS里面使用这个滤镜

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CSS

<svg ...>
  ...
  <filter id="pictureFilter" >
    <feGaussianBlur stdDeviation="5" />
  </filter> 
</svg>

下面是一个完整的例子:

前往codepen查看

更多阅读:

  • SVG滤镜的更多应用
  • SVG CSS属性大全(针对Opera)
  • SVG滤镜效果演示(由Microsoft提供)
浏览器支持

内联SVG的浏览器支持看这里,基本和前面的一样。兼容的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML

<svg> ... </svg>
<div class="fallback"></div>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CSS

.fallback { 
  display: none;
  /* Make sure it's the same size as the SVG takes up */
}
.no-svg .fallback { 
  background-image: url(logo.png); 
}

<object>里面使用SVG

如果想要通过CSS控制SVG,但是又想避免内联SVG的弊端,可以在<object>里面使用SVG。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML

<object type="image/svg+xml" data="kiwi.svg" class="logo">
  Kiwi Logo <!-- fallback image in CSS -->
</object>

同样可以使用Modernizr来兼容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CSS

.no-svg .logo {
  width: 200px;
  height: 164px;
  background-image: url(kiwi.png);
}

这种情况下,如果想要用CSS控制SVG,就不能用外部的样式或者文档里面的<style>了,要用SVG文件内部的<style>:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SVG

<svg ...>
  <style>
    /* SVG specific fancy CSS styling here */
  </style>
  ...
</svg>
<object> SVG里使用外部样式

可以在SVG文件开头的<svg>标签前面引入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML

<?xml-stylesheet type="text/css" href="svg.css" ?>

如果把这个放在HTML里面,页面会崩溃没法渲染,如果把这个放在<img>或者background-image的SVG里面,页面不会崩溃,但是也不起作用。

在Data URL里面使用SVG

还可以把SVG转换成Data URL,转换之后可能不止原来的文件大小,但是它很方便,因为不需要额外产生网络请求。 Mobilefish.com上面有一个base64在线转换器,可以转成base64编码,但是这种方式不太推荐。记得去掉换行:

它可以在上述的所有场景里面使用,除了内联SVG。

个人比较推荐这个在线转换器,因为转换之后可读性比较强。

  • 用在<img>里面
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML

<img src="data:image/svg+xml;base64,[data]">
  • CSS里面
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CSS

.logo {
  background: url("data:image/svg+xml;base64,[data]");
}
  • <object>里面
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML

<object type="image/svg+xml" data="data:image/svg+xml;base64,[data]">
  fallback
</object>

如果,SVG在base64编码之前有嵌套的<style>,那么它依然可以在<object>里面起作用。

Data URI格式

上面的例子都是base64编码的,但是也不一定要转换成base64编码,实际上对于SVG最好不要转成base64编码。因为SVG的原始格式文本重复性比较高,gzip压缩效果更好。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTML

<!-- base64 -->
data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL...

<!-- UTF-8, not encoded -->
data:image/svg+xml;charset=UTF-8,<svg ...> ... </svg>

<!-- UTF-8, optimized encoding for compatibility -->
data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://...'

<!-- Fully URL encoded ASCII -->
data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A//...
自动化工具
  • grunticon

从CSS的角度来看比较易用,为每个icon生成一个class,不用CSS sprites。grunticon输入一个SVG/PNG文件的目录,然后输出对应的3种格式的CSS:SVG data url,png data url和一个引用普通的png图片的兼容性CSS文件。

  • iconizr

一个PHP命令行工具,把SVG图片转换成CSS icon,支持图片优化和SASS输出。

相关参考

  • David Bushell: 一个前端SVG Hacking的更好方法
  • David Bushell: 使用不依赖于分辨率的SVG
  • MDN on SVG
  • SVG相关的浏览器支持
  • Peter Gasston: 使用Fragment Identifiers更好地实现SVG Sprites
  • simuari: SVG栈
  • SVG.js - "轻量的第三方库,可以操作SVG,还可以实现动画"
  • Emmet:一种直接从文本编辑器里面生成SVG data URI的方式
  • Compass Inline Data Helpers.
  • Adobe: 给SVG添加样式
  • Andrew J. Baker: 驯服SVG
  • 除了Illustrator的其他编辑工具: Inkscape, Sketch
  • Krister Kari: 在移动端浏览器中使用SVG图片
  • Kyle Foster: 更优的SVG工作流
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 子曰五溪 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
web图像的常见应用策略与技巧
文章主要讲述了如何通过修改SVG的src属性来加载不同版本的SVG文件,并介绍了两种回退策略:使用image-set和动态设置src。同时,也介绍了一些关于加载优化的技巧,例如使用data uri和base64编码。在总结中,提到了这些技术的使用场景和注意事项,以帮助读者更好地理解和应用这些技术。
练小习
2017/12/01
1.6K0
该如何正确的使用SVG sprites?
    大家好,这里是@IT·平头哥联盟,我是`首席填坑官`——苏南,今天要给大家分享的是SVG sprite(也叫雪碧图),所谓雪碧图,当然就不是我们常喝的雪碧饮料(Sprites)哦,哈哈~
苏南
2018/12/07
2.2K0
该如何正确的使用SVG sprites?
位图和SVG用法比较
位图,亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。然而,如果从稍远的位置观看它,位图图像的颜色和形状又显得是连续的。 提到SVG,我想大多数人的第一印象是矢量缩放。是的,SVG是制作Logo、图标及按钮的理想选择。和位图不同,SVG可以在不失真情况下进行任意的缩放。同时,和传统Web字体不同的是,SVG可以使用多种颜色、渐变甚至
葡萄城控件
2018/01/10
3K0
位图和SVG用法比较
网页中如何使用SVG
① 如果文件中的根元素 带有明确的 height 和 width 属性,则它们会被用作文件的固有尺寸; ② 如果只指定 height 或者 width ,并且 带有 viewBox 属性,那么将用 viewBox 计算宽高比,图像会被缩放已匹配指定的尺寸; ③ 如果 带有 viewBox 属性而没有尺寸,则 viewBox 的 height 和 width 将被视为像素长度。 ④ 没有如何尺寸,浏览器应该为嵌入内容应用默认 HTML 尺寸,通常是 150 像素高,300 像素宽。
奋飛
2021/08/31
1.9K0
网页中如何使用SVG
全栈之前端 | 9.CSS3基础知识之图像元素样式学习
描述: 好久没更新此《#前端学习之路》专栏文章了,不知道学习前端看友们想不想我,所以这一段时间又开始整理更新了。通过前面几章的学习,相信大家已经对CSS有了一个简单的了解吧,现在我们又回到使用频率较高的 文本 text、图像 images、媒体 media、表单 table 等元素CSS样式的设置,此章节主要讲解针对图像的相关CSS属性以其使用的示例演示。
全栈工程师修炼指南
2023/12/18
2570
全栈之前端 | 9.CSS3基础知识之图像元素样式学习
网页中如何使用SVG
① 如果文件中的根元素 <svg> 带有明确的 height 和 width 属性,则它们会被用作文件的固有尺寸; ② 如果只指定 height 或者 width ,并且 <svg> 带有 viewBox 属性,那么将用 viewBox 计算宽高比,图像会被缩放已匹配指定的尺寸; ③ 如果<svg> 带有 viewBox 属性而没有尺寸,则 viewBox 的 height 和 width 将被视为像素长度。 ④ 没有如何尺寸,浏览器应该为嵌入内容应用默认 HTML 尺寸,通常是 150 像素高,300 像素宽。
奋飛
2021/02/16
1.2K0
网页中如何使用SVG
FinClip小程序里如何安全使用SVG
网上零零散散有一些关于在小程序中如何使用SVG的内容,但不是语焉不详,就是信息不完整。在此整理一下,供哪怕是此前从来没有接触过SVG的开发者也可以参考,迅速利用。首先SVG可以被视为一种DSL(Domain Specific Language),也就是说它并不仅仅是JPEG、PNG、GIF之外的又一种图片格式,它还是一种“代码”;也因此,它既有无比的潜力让开发者发挥创意作出有意思的应用,它也有潜在安全风险。在小程序中,起码至目前为止,它的使用方式和在普通网页并不完全一样。
Onegun
2022/05/07
2.2K0
FinClip小程序里如何安全使用SVG
神奇的CSS,几行代码就可以让照片变老照片的效果
本文将回顾如何仅使用 CSS 在任何图片上创建旧照片效果。无需 Photoshop 或任何其他图像编辑器。只需几行代码!
前端达人
2023/02/17
3.1K0
神奇的CSS,几行代码就可以让照片变老照片的效果
高清ICON SVG解决方案(下) - 腾讯ISUX
在上一篇文章中,我们讲述了字体渲染机制和导致iconfont出现锯齿的原因,以及如何才能出绘制高质量SVG ICON,并且提供了一套AI模版供大家参考使用。下文将讲诉前端侧我们如何用SVG来做成高清ICON,并且良好支持PC下的各个浏览器,并兼容IE6+以上的浏览器。 从上一篇文章中我们得知SVG 做的图标在IE9+的浏览器渲染效果相当的差,所以在IE下我们我们不使用SVG ICON,我们可以将SVG转成一倍的png图片来进行替代。首先来简单的普及一下SVG ICON的几个使用方法: 第一种Inline S
腾讯ISUX
2018/06/29
1.2K0
在小程序中 SVG 的打开方式
第一种,也是最简单直观的方式,即把svg后缀的文件视作为和PNG、JPEG、GIF类似的图片:
pak
2022/08/11
2K0
微信小程序开发之SVG的使用
因为工作的原因,最近开始接触并且了解微信小程序。太久没有写或者看过前端相关的代码,加上小程序本身的bug也比较多,中间发现坑还是不少,后面逐渐整理总结一下。这一篇先总结一下svg在小程序中的使用。 SVG 简介 什么是SVG SVG是”Scalable Vector Graphics”的简称。中文可以理解成“可缩放矢量图形”。是一个基于XML的图形描述语言。它是可以用于描述静态图、动画,以及用户界面的一种图形格式。1999年由万维网联盟发布。于2013年成为W3C推荐标准。 SVG有哪些优势 与其他图像格式
子勰
2018/05/22
13.7K0
浅谈两种前端截图方式:Canvas截图 vs SVG截图
如今很多网站都引入截图功能,可用于问题反馈、内容分享等实用需求,而前端截图也不知不觉成为了首选。今天为大家推荐两种前端截图方式,虽然有些局限,但是也能应付大部分项目需求。
JowayYoung
2020/04/01
13.7K2
网站图标开发指南
图标是网站中非常友好的附加物,许多网站都会使用各种图标来美化页面样式,给用户提供更好的指引。本文将会和大家一起学习页面图标的发展历史,以及最优的解决方案。
疯狂的技术宅
2020/09/01
1.8K0
网站图标开发指南
【译】Web中的图像技术总结,前端开发中各种图片引入的优点缺点及实例
前端开发人员在构建网站时需要做出的决定之一就是添加图片的技术。它可以是HTML <img>,也可以是通过CSS背景生成的图片,也可以是SVG <image>。选择正确的技术很重要,并且可以在性能和可访问性方面发挥巨大作用。
张张
2020/04/27
5.6K0
【译】Web中的图像技术总结,前端开发中各种图片引入的优点缺点及实例
SVG 在前端的7种使用方法,你还知道哪几种?
技术一直在演变,在网页中使用 SVG 的方法也层出不穷。每个时期都有对应的最优解。
德育处主任
2022/09/07
5.9K0
SVG 在前端的7种使用方法,你还知道哪几种?
前端水印svg生成方案&svg动态宽高计算
参考文章6. 前端水印生成方案 的svg方案是ES6语法的,项目问题,我把它改写成ES5语法了。 js代码如下:
celineWong7
2023/10/16
4590
前端水印svg生成方案&svg动态宽高计算
SVG 图标在React项目中的优化
官方文档:https://webpack.docschina.org/loaders/url-loader/
javascript.shop
2019/09/04
3.7K0
SVG 图标在React项目中的优化
为你重新系统梳理下, Web 体验优化中和图有关的那些事(万字长文)
Web 页面性能优化,解决了图片相关,问题就解决了大半。本文从 Web 常见的图片格式入手,引出与图片优化相关的有效方案,期望对大家能有一点帮助。
lucifer210
2019/11/15
1.3K0
前端运用图片的技巧总结
原文 | https://ishadeed.com/article/image-techniques/
前端老道
2022/03/29
2.6K0
前端运用图片的技巧总结
关于移动端适配,你必须要知道的
上面这些问题可能我们在开发中已经知道如何解决,但是问题产生的原理,以及解决方案的原理可能会模糊不清。在解决这些问题的过程中,我们往往会遇到非常多的概念:像素、分辨率、 PPI、 DPI、 DP、 DIP、 DPR、视口等等,你真的能分清这些概念的意义吗?
ConardLi
2019/05/23
2K0
相关推荐
web图像的常见应用策略与技巧
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验