`
liuguofeng
  • 浏览: 450147 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用SVG中的Symbol元素制作Icon

    博客分类:
  • css
 
阅读更多
 

前言

随着大屏幕分辨率的普及以及各种移动设备层出不穷的移动互联网时代的到来,我们在网站设计时更应该关心内容在各种设备上的阅读性和显示效果。我们都希望能在任何时间,任何设备上都能清楚的,高效的传递信息给用户。

而随着各种高清视网膜屏幕的出现,现在web设计也需要考虑各种高清屏幕的显示效果,同样前端在代码实现的时候也需要根据屏幕的不同来输出不同分辨率的图片。为了使我们的网页能够适配视网膜屏幕上的高分辨率,在前端开发中一般需要准备两套不同尺寸的图片来应对,一套在普通屏幕上显示;一套在高清屏幕上显示。

为了解决屏幕分辨率对图标影响的问题,字体图标即icon font顺势而生。字体图标是一种全新的设计方式。更重要的是相比图片而言,使用字体来制作图标可以不受于屏幕分辨率的影响,这对于现在各种分辨率屏幕的移动互联网时代,比起用图片来说确实有很大的优势。所以现在在web开发中,使用字体来制作icon应用的也越来越多。

难道我们只有这一种选择么?No,追根溯源,其实字体图标也是一种基于矢量图形的一种技术封装而已。这篇文章我们就来看看使用正宗的矢量图形SVG来制作icon的应用,看过之后相信你会有一种“拈花微笑,飞叶伤人”的感觉。

SVG优势

随着高清屏幕的普及,相比使用png等位图而言,使用SVG等矢量图形是一种全新的设计方式。更重要的是相比位图而言,SVG有着无可比拟的优势。这里我总结一下SVG具体的一些优势:
  1. SVG是矢量图形文件,可以随意改变大小,而不影响图标质量。
  2. 可以用CSS样式来自由定义图标颜色,比如颜色/尺寸等效果。
  3. 所有的SVG可以全部在一个文件中,节省HTTP请求 。
  4. 使用SMIL、CSS或者是javascript可以制作充满灵性的交互动画效果。
  5. 由于SVG也是一种XML节点的文件,所以可以使用gzip的方式把文件压缩到很小。

其中使用SVG来制作动画更是令人神往,由于SVG是一种类似DOM节点组成的文本文档,所以我们可以很精细的控制SVG图形的每一个部分,并且可以使用CSS3或者是javascript来制作动画效果。下面我们就来看一个使用SVG制作的动画,如下图所示:

想看它在web上的真实效果么,请扫描下面的二维码:

 

开始之前,可以先下载基本的html和svg代码,下载地址

使用方法

在web开发中,SVG主要有下面几种使用方法:

  1. 使用img和object标签直接引用svg。这种方法的缺点主要在于要求每个图标都单独保存成一个SVG文件,使用时也是单独请求的,增加了HTTP请求。
  2. Inline SVG,直接把SVG写入 HTML 中,这种方法简单直接,而且具有非常好的可调性。Inline SVG 作为HTML文档的一部分,不需要单独请求。临时需要修改某个图标的形状也比较方便。但是Inline SVG使用上比较繁琐,需要在页面中插入一大块SVG代码不适合手写,图标复用起来也比较麻烦。
  3. SVG Sprite。这里所说的Sprite技术,没错,类似于CSS中的Sprite技术。图标图形整合在一起,实际呈现的时候准确显示特定图标。其实基础的SVG Sprite也只是将原来的位图改成了SVG而已。
  4.  最后就是本文的主角啦。使用svg中的<symbol>元素来制作icon。

现在,我们着重介绍的是使用svg中的<symbol>元素来制作icon,在上面说到的SVG Sprite中,我们需要使用相对位置来控制哪个图标被显示出来,但是SVG本身的定义是允许你可以使用<use>的方式直接引用SVG中的某一部分。

那么<symbol>元素是什么呢?按字面意思的话是符号的意思,如果把一个SVG文件比喻成一个书柜的话,那么<symbol>则就表示书柜中一本本不同类别的书籍。这些一本本不同类别的书本就是我们要使用的<symbol>图标。

下面的代码就是将多个SVG图标整合成一个SVG文件之后的样子,可以看到代码中有不同类别的<symbol>元素,它们就是我们要引用的图标:


每个Symbol设置一个id作为引用时的名字。使用id引用这个SVG中的Icon有两种方法。

第一种,将上述SVG作为body的第一个元素插入在HTML中, 此后,在需要显示某个 Icon 的地方插入下面的代码即可:

第二种是,是使用完整路径引用Icon。 也就是:

这种方法不需要像Sprite那样繁琐的设置图片的位移。使用id命名图标并使用时直接使用id引用既直观又简单。

自动化合并工具

问题来啦,如果碰到很多的图标,难道我们都要手动去合并为一个SVG吗?当然不用。

这里介绍一个专门用于处理SVG Symbols用的glup插件gulp-svg-symbols

下面我们就来以一个实例一步一步来使用下这个插件。

首先新建一个文件夹,目录结构如下图所示:

svg文件夹是用来存放svg格式文件的。

当然首先是你得有glup环境,至于glup环境的安装这里就不再阐述了,详细的安装使用教程可以去这篇文章看看。

然后在你的项目目录下运行下面的命令安装插件:

最后在你的项目目录新建一个**gulpfile.js**文件,写入下面的代码:

ok。基本的环境搭好啦,正所谓,巧妇难为无米之炊。上哪找svg图标去呢? 这里推荐去icomoon.io 这个专门提供矢量图标网站下载矢量图像,重要的是它提供SVG格式的图形下载。

我们这里就以icomoon.io为例,首先是点击你需要下载的图形,选中它,然后点击下载按钮:

点击下载svg:

然后按照我们上面的配置文件,我们把下载好的svg图标放到svg文件夹中。

一切准备就绪,在你的项目目录中,运行gulp sprites命令:

运行命令之后,它会在你的目录中生成一个svg文件,用你常用的代码编辑器打开svg文件,可以看到svg图标都被合并到一个文件中。并且根据对应SVG文件的名称生成了ID,如下图所示:

那怎么使用呢它们呢?直接在html文件中使用,并且可以直接使用css来定义宽高、填充颜色等属性。如下代码所示:

不过由于浏览器安全策略限制的原因,我们不能在本地直接打开html文件来预览我们引用的svg文件,需要以服务器的形式来打开,用gulp也很容易搞定一个简单的服务器环境。首先我们需要安装gulp-connect这个模块,运行下面的命令:

然后修改下gulpfile.js文件中的配置项:

运行gulp webserver命令,打开localhost:8080,就可以看到我们引入的svg图标了:

 

源代码下载

为了更能直接体现使用SVG来作为图形格式的优势,我分别把上面的三个图标放大到十种不同的尺寸,具体结果请毫不犹豫拿起你的手机,扫描下面的二维码。会发现依然清晰可见:

总结

综上所述,使用SVG Symbols的方式来制作图标比使用字体图标有着无可比拟的优势。更重要的是SVG中的每一个path元素都可以单独控制,这可以给我们带来什么呢?点击下面的图片你就知道使用SVG来制作图形元素带来的魅力啦。

我觉的在移动端完全可以普及使用了,主流的安卓和苹果的浏览器都支持SVG。

参考文章:

Gulp as a Development Web Server
SVG symbol a Good Choice for Icons
Inline SVG vs Icon Fonts
replace-icon-fonts-with-svg

分享到:
评论

相关推荐

    svg-icon:正确的终极SVG图标集,开箱即用有10,000多个SVG图标

    SVG图标 终极SVG图标集DONE RIGHT,开箱即用,共有10,000多个SVG图标。 下载 您可以在根据需要下载...svg-icon url="http://leungwensen.github.io/svg-icon/dist/sprite/symbol/logos.svg" type="si-logos-javascri

    svg-symbol-loader

    使用Svg-Symbol-Loader,你需要在Webpack配置中添加这个加载器,并设置相应的规则来匹配SVG文件。配置完成后,你可以像这样引用SVG图标: ```html &lt;svg&gt; &lt;use xlink:href="#icon-name"&gt; &lt;/svg&gt; ``` 其中`#icon-...

    将阿里iconfont下载后包含多个svg图标的文件转换为单个svg文件

    这个过程涉及到的主要工具有Node.js环境,因为我们需要使用一个名为`iconfont-svgs2svg`的npm包,这也是压缩包中的文件`iconfont-svgs2svg-master`。首先,确保已安装Node.js,并在命令行中进入项目目录: ```bash ...

    svg在web调用,svg在web调用,svg在web调用

    2. **SVG作为背景图像**:通过CSS的`background-image`属性,可以将SVG文件作为元素的背景图片,使用`url()`引用SVG文件。 ```css div { background-image: url('image.svg'); background-size: cover; } ``` 3....

    svg-man:gulp 将svg 转iconfont和symbol,可以实现就近管理svg图片,对于抽取的通用组件很友好

    fontName: 'ft-icon', prefix: 'ft' }) 配置 fontName:字符串 前缀:字符串 startUnicode:十六进制整数 步骤1 右键单击gulpfile.js 单击“ Show Gulp Tasks 第2步 运行gen-iconfont 你会得到一些字体文件 ...

    SVG图画基于HTML5

    在本项目"html5-svg-face-icon"中,我们看到的是一个使用SVG制作的页面,该页面可能包含了一系列用于表示脸部特征的小图标,比如眼睛、鼻子、嘴巴等。这些图标可能是独立的SVG元素,通过CSS或JavaScript进行组合和...

    svg-sprite-loader.rar

    本教程将重点介绍如何在Vue项目中使用SVG Sprite,特别是结合`svg-sprite-loader`来实现。 首先,我们需要了解`svg-sprite-loader`。它是一个Webpack loader,专门用于处理SVG文件,并将其转换为Sprite模式。这样,...

    前端开源库-svg-classic-sprite-loader

    每个图标作为一个&lt;symbol&gt;元素被包含在&lt;svg&gt;根元素内,通过id属性来区分不同的图标。 3. **模板注入**:生成一个HTML模板,其中包含一个引用精灵图的&lt;svg&gt;元素,以及通过JavaScript动态插入的元素。元素通过 xlink:...

    用于vue引入SVG入门的学习材料

    例如,`vue-svg-icon`库允许你将SVG图标作为Vue组件导入,然后在模板中使用,这样可以方便地管理和复用图标。 4. **SVG Symbol引用**:另一种方法是将SVG图标转化为`&lt;symbol&gt;`,存放在一个单独的SVG文件中,然后...

    在 React、Vue项目中使用SVG的方法

    例如,将所有绘制 SVG 的代码放到 svg-icon.vue 文件中,所有图标的绘制代码使用 symbol 标签分隔开并单独命名,避免错乱,然后将这个文件当做是一个组件导出,在主页面中引入此组件,接着,在需要使用 SVG 图标的...

    一个工具用来创建svg图标的组件vue2x

    7. **性能优化**:通过内联SVG图标或使用Symbol方法来优化图标在页面上的渲染速度。 8. **响应式设计**:确保SVG图标在不同设备和屏幕尺寸上都能正确显示。 9. **国际化支持**:对于多语言网站,可能会有图标名称...

    meteor-entypo:Entypo 图标打包为 SVG sprite,便于模板在 Meteor 中使用

    这将公开一个entypo模板助手供您在您的应用程序中使用。 模板助手接受一个参数:图标 slug 名称(取自原始 SVG id属性)。 用法 例子: {{ &gt; entypo 'flower'}} 会产生: &lt; svg class =" icon icon-flower " ...

    9、Jquerycss3实现点击svg图标动画特效

    在本主题中,我们将深入探讨如何使用jQuery和CSS3来实现SVG(可缩放矢量图形)图标的点击动画特效。SVG是一种基于XML的图像格式,它允许在网页上创建和显示高质量、可伸缩的矢量图形。结合jQuery的交互性和CSS3的...

    前端开源库-gulp-svgstore

    inlineSvg: true, // 将每个SVG图标内联到&lt;symbol&gt;元素中 removeTitle: true, // 移除SVG图标中的元素,防止命名冲突 })) .pipe(gulp.dest('dist')); // 输出合并后的SVG文件到dist目录 }); gulp.task('...

    icomoon (1)_NEW_icon_

    4. **svgxuse.js**:这是一个JavaScript库,主要用于处理SVG符号的使用元素(),确保外部链接的SVG符号能够正确显示。如果你的图标是通过元素引用的,那么这个脚本是必要的。 5. **selection.json**:这是一个配置...

    svgsprites:使用 node.js 和 grunt 创建 svg 精灵

    SVG精灵(SVG Sprites)是一种优化SVG图形在网页中使用的方法,它将多个SVG图标组合成一个单一的SVG文件,从而减少HTTP请求,提高页面加载速度,并简化代码管理。在这个项目中,我们将探讨如何利用Node.js和Grunt...

    vue使用自定义icon图标的方法

    本文主要介绍了在 Vue 中使用自定义的 Icon 图标的方法。自定义 Icon 图标可以丰富 Vue 项目的视觉体验,为用户提供更加直观的交互方式。下面将详细介绍两种使用自定义 Icon 图标的方法:使用 Iconfont 和使用 ...

    svg-icon-system-boilerplate:通过链接的外部SVG Sprite构建自定义图标系统的样板

    sprite.svg是主文件,其中包含使用SVG 内的&lt;symbol&gt;包含的每个SVG的sprite。 该系统通过以下方式实现SVG图标访问单个图标。 默认情况下,图标是其原始颜色(请参见参考页),但可以使用CSS进行编辑。 如果使用子...

    core-iconset:允许定义图像图标集的自定义元素

    通过定义图标集,开发者可以轻松地在多个组件中使用同一套图标,只需通过简单的属性设置即可完成。 使用 core-iconset 的步骤大致如下: 1. 创建一个 core-iconset 元素,设置 `icons` 属性,列出所有图标名称。 2...

Global site tag (gtag.js) - Google Analytics