当前位置: 首页 > 编程日记 > 正文

使用SVG中的Symbol元素制作Icon

前言

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

而随着各种高清视网膜屏幕的出现,现在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

原文出处: 腾讯ISUX

转载于:https://www.cnblogs.com/Alisa098/p/7458937.html

相关文章:

【JOURNAL】恭喜发财

刚写完上一条blog不久&#xff0c;南京城里开始响彻了鞭炮声&#xff0c;人见人爱、极具亲和力的财神来了。上海的一个朋友发短信来说那个国际化大都市也被对财神的膜拜感染得热闹喧天。这是好的。昨天给老婆表亲家的孩子压岁钱&#xff0c;对方说免了吧&#xff0c;我坚持让他…

[树形dp] Jzoj P5233 概率博弈

Description 小A和小B在玩游戏。这个游戏是这样的&#xff1a;有一棵n个点的以1为根的有根树&#xff0c;叶子有权值。假设有m个叶子&#xff0c;那么树上每个叶子的权值序列就是一个1->m 的排列。一开始在1号点有一颗棋子。两人轮流将这颗棋子移向其当前位置的一个儿子。假…

ASP.NET获取IP的6种方法

服务端&#xff1a; //方法一HttpContext.Current.Request.UserHostAddress; //方法二HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];//方法三stringstrHostName System.Net.Dns.GetHostName();stringclientIPAddress System.Net.Dns.GetHostAddresse…

软件工程实践第一次作业

准备篇 一、回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的&#xff1f; 在读到博文B时&#xff0c;博客B[1]的作者说道&#xff1a;“ 那时&#xff0c;对其他学校认知的匮乏让自己无助起来&#xff0c;最后的抉择&#xff0c;是希望选择一个…

VC 6.0不老

最近做的几个项目&#xff0c;客户都是要求使用Vc 6开发&#xff0c;我用的是VC 6.0 Sp6。VC 6 装上插件之后发现使用方便多了&#xff0c;下面是转载[url]http://hi.baidu.com/linuxtoys/blog/item/5f4251a9f12a53fd1e17a272.html[/url] 的一篇关于VC6的小插件的文章&#xff…

[03] 处理注解:反射

1、AnnotatedElement接口如果没有用来读取注解的方法和工作&#xff0c;那么注解也就不会比注释更有用处了。使用注解的过程中&#xff0c;很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API&#xff0c;以帮助程序员快速的构造自定义注解处理器。Java用An…

P2261 [CQOI2007]余数求和

我是题面 题意还是很清晰&#xff0c;很容易理解 1e9范围明显不能暴力&#xff0c;除非你能把常数优化到\(\frac1 {10}\)&#xff0c;但我实在想象不到用了这么多取模怎么把常数优化下去 我们可以把\(k\%i\)变成\(k-k/i*i\)(整除) 那么总的和也就从\(\sum_{i1}^{n}k\%i\)变成了…

Windows Server 2008正式版[微软官方下载地址+官方语言包]

Windows Server 2008(包含 Standard Enterprise Datacenter)32http://download.microsoft.com/download/d/d/b/ddb17dc1-a879-44dd-bd11-c0991d292ad7/6001.18000.080118-1840_x86fre_Server_en-us-KRMSFRE_EN_DVD.iso64http://download.microsoft.com/download/d/d/b/ddb17dc1…

线性代数-矩阵-【5】矩阵化简 C和C++实现

点击这里可以跳转至 【1】矩阵汇总&#xff1a;http://www.cnblogs.com/HongYi-Liang/p/7287369.html 【2】矩阵生成&#xff1a;http://www.cnblogs.com/HongYi-Liang/p/7275278.html 【3】矩阵加减&#xff1a;http://www.cnblogs.com/HongYi-Liang/p/7287403.html 【4】矩阵…

哈佛管理论丛:谁背上了令人讨厌的猴子

先说说我的读后感想&#xff1a; 在团队管理中&#xff0c;应该尽量明晰的界定每一位团队成员在当前的任务中充当的角色和应该负责的职责。 实际的执行方法就是&#xff1a;约定好给猴子喂食的时间&#xff0c;并且确定在喂食时间到来时&#xff0c;猴子应该长成什么样子。 所以…

json_encode 中文不乱码

echo json_encode("中文", JSON_UNESCAPED_UNICODE);//"中文" 转载于:https://www.cnblogs.com/zxqblogrecord/p/10300244.html

Android-room的学习

目录 关于ROOM 1.Room有3个主要的组件 2.Room 不同组件之间的关系如图所示 3.导入ROOM&#xff08;使用 Room 需要添加依赖&#xff09; 4.&#xff08;实现数据库操作的步骤&#xff09;以下代码段包含具有一个实体和一个 DAO 的示例数据库配置 实例demo 1.Student.java …

JDK5中的控制台输入

Scanner类是JDK5新添加的一个类&#xff0c;主要作用是处理输入流、文件和文本内容等 。这个类在java.util包里面&#xff0c;实现了Iterator接口&#xff0c;而且io处理采用了jdk1.4才发布的nio。由于这个类实现了Iterator接口&#xff0c;如果全部是string的话&#xff0c;就…

[BZOJ3779]重组病毒(LCT+DFS序线段树)

同[BZOJ4817]树点涂色&#xff0c;只是多了换根操作&#xff0c;分类讨论下即可。 1 #include<cstdio>2 #include<algorithm>3 #define lc ch[x][0]4 #define rc ch[x][1]5 #define ls (x<<1)6 #define rs (ls|1)7 #define lson ls,L,mid8 #define rson rs,m…

UVA - 1594 Ducci Sequence

/*做这题时的心路历程其实挺有趣的一开始看到说Ducci序列最终要么全0&#xff0c;要么循环&#xff0c;我在想&#xff1a;要怎么判断循环呢&#xff1f;是不是还得记录下循环节什么的&#xff1f;是该用数组记录循环节吗&#xff1f;还是想要让我们利用STL来记录&#xff1f;后…

RTF密码破解

有一个RTF文件带密码&#xff0c;用文本编辑器察看&#xff0c;有类似“password”字样。为了编辑它&#xff0c;有两个方法&#xff1a; 1、用word2000打开该文件&#xff0c;Tools--〉Unprotect Document&#xff0c;执行后&#xff0c;文件就可以正常编辑了。如果有多个文件…

Android 数据存储-内外部存储测试

案例分析&#xff1a;FilePersistenceTest 在EditText中输入文本内容&#xff0c;退出应用程序或者 单击“保存”按钮时 保存EditText中的数据到名 为“data”的文件中。 打开Device File Explorer&#xff0c;该文件应该存于 /data/data/cn.edu.hunnu.filepersistencetest/…

微软以后要是也开源也免费,java还竞争过.NET吗?

上次参加招聘会&#xff0c;看得到好多大公司都要求精通java&#xff0c;可惜上大学大一就学了.NET,而java到大三才开&#xff0c;并且草草地只讲了些基本知识。有时我就在想难道学当初选择.NET真的错了吗&#xff1f;java确实比.NET存在很多优势。开源、跨平台、免费、开发工具…

Android Studio开发环境及第一个项目

1. 在你的电脑上搭建Android平台开发环境。 2. 新建项目&#xff0c;实现以下基本内容&#xff1a; (1) 修改默认的APP的名称和图标&#xff08;任意的&#xff0c;非默认的&#xff09;。 (2) 显示个人信息&#xff0c;包括&#xff1a;照片、专业、姓名、学号等基本信息。…

去除inline-block元素间距

转载于:https://www.cnblogs.com/keepitreal/p/10301199.html

C#ListView控件添加Checkbox复选框并获取选中的数目,检查checkbox是否勾选

[转载]原地址&#xff1a;http://blog.csdn.net/lucky51222/article/details/41892429 具体方法 1、添加复选框 并且如下设置 listView1.CheckBoxes true; 2、选中listview并获取选中的数目&#xff1a; 具体代码 private void listView1_ItemChecked(object sender, ItemChec…

weblogic学习笔记(1)

weblogic安装、配置和启动 1、weblogic安装转载于:https://blog.51cto.com/pengchenga/66424

react 从使用 看定义

如果你创建了一个类似元素做出反应Twitter的下面&#xff0c;你会的组件定义Twitter的样子&#xff1f; <Twitter usernametylermcginnis33>{(user) > user null? <Loading />: <Badge info{user} />} </Twitter> import React, { Component, Pro…

Android 活动与活动间数据传递

实验内容 综合运用基本组件完成一个注册与登录的应用程序设计。要求基于基础控件&#xff0c;综合使用Intent实现Android的Activity之间信息交换。系统包含启动页、注册页、登录页3个页面&#xff0c;具体要求如下&#xff1a; 1.注册页面和功能的实现。 –界面要求包含用户…

Selenium-js弹窗浮层

学习过js的小伙伴会发现&#xff0c;我们在一些实例中用到了alert()方法、prompt()方法、prompt()方法&#xff0c;他们都是在屏幕上弹出一个对话框&#xff0c;并且在上面显示括号内的内容&#xff0c;使用这种方法使得页面的交互性更精彩&#xff0c;实际上我们经常会在进行网…

JAVA基础(JAVA 执行环境) 第一天

JAVA程序有3中执行环境。 &#xff08;1&#xff09;能够单独运行的程序&#xff0c;称为Java Application(Java应用程序)。 &#xff08;2&#xff09;在Internet浏览器中运行的程序&#xff0c;称为 Java Applet&#xff08;JAVA小用用程序&#xff09;。Applet是一个在WEB浏…

ERP图形目录

这些天正在研究ERP&#xff0c;老师要求我们自己制作一个ERP出来。找了不少资料&#xff0c;就这个图形目录比较有学习价值。这个图形目录是PDF文件&#xff0c;包括销售管理、采购管理、库存管理、制作标准管理、计划管理、车间管理、JIT生产管理、质量管理、财务管理、人力资…

JSP学习笔记(五):日期处理、页面重定向、点击量统计、自动刷新和发送邮件...

一、JSP 日期处理&#xff1a; 使用JSP最重要的优势之一&#xff0c;就是可以使用所有Java API。本节讲述Java中的Date类&#xff0c;它在java.util包下&#xff0c;封装了当前日期和时间。 Date类有两个构造函数。第一个构造函数使用当前日期和时间来初始化对象&#xff1a;D…

完善登录注册页面

实验内容 综合运用基本组件完成一个注册与登录的应用程序设计。要求基于基础控件&#xff0c;综合使用Intent实现Android的Activity之间信息交换。系统包含启动页、注册页、登录页3个页面&#xff0c;具体要求如下&#xff1a; 在第2周上机作业的基础上&#xff0c;完善登录注…