关于浏览器图标解决方案,一直就有很多 CSS Sprite,Icon Font,CSS Icon以及SVG.相对而言svg矢量图标以及支持浏览器自身解析的优点,很多团队都已经在使用了。这篇文章主要说明svg图标的使用和制作。

SVG Sprite

传统的做法

使用AI或者合并SVG图像,然后用background-postion;

打开AI,新建一个30 * 60(px)的画布,设置好网格和参考线.

用AI打开svg文件,然后复制路径到画布上调整大小

其他就和css-sprite没有差异了

.icon-bg{
display: inline-block;
width: 30px;
height: 30px;
background: url(./res/svg-sprite-background.svg);
background-size:100% 100%;
vertical-align: middle;
}
.icon-facebook-logo{
background-position: 0 0;
}
.icon-earth{
background-position: 0 -30px;
}
.icon-like{
background-position: 0 -60px;
}

html 中使用

<p class="btn-group">
<a href="#" class="btn btn-default"><span class="icon-bg icon-facebook-logo"></span></a>
<a href="#" class="btn btn-default"><span class="icon-bg icon-earth"></span></a>
<a href="#" class="btn btn-success"><span class="icon-bg icon-like2"></span></a>
</p>

效果如下:

使用photoshop进行合并

可能很多图标是图形形状。

  • 打开Photoshop 新建一个30 60 (px)的画布,我们计划30px 30px,设置好网格或者参考线

  • 用AI打开SVG文件,然后Ctrl+C 复制路径,然后复制到photoshop文档中,选择图层形状,然后再进行调整

  • 选择 '文件' ->'导出' -> '路径到illustrator'

  • 保存为SVG

效果如下:

如果这样做,这似乎浪费了SVG的很多特性.

SVG Sprite的另外一种实现思路 <symbol> + <use>

SVG <symbol>在svg中主要适用于定义可复用的符号,而这些定义在symbol元素的形状将不会被展示出来,而是通过use元素引用来显示。

在SVG中<use>可以在任何地方复用svg文件中定定义的的形,包括<g>和 <symbol>已经<defs>。

在使用 use 时,它必须要有一个id,这样 use 通过xlink:href的值找到该形状的引用。注意,一定要在前面加一个#,这样才能引用ID成功。

<svg width="300" height="300">
<defs>
<g id="shape">
<rect x="50" y="50" width="50" height="50" />
<circle cx="50" cy="50" r="50" />
</g>
</defs> <use xlink:href="#shape" x="50" y="50" />
<use xlink:href="#shape" x="200" y="50" />
</svg>

在使用 use 时,它必须要有一个id,这样 use 通过xlink:href的值找到该形状的引用.注意,一定要在前面加一个#,这样才能引用ID成功。

首先我们使用PS+AI生成带有symbol的 SVG。

前面步骤与生成背景的图类似

  • 打开Symbols面板,在Window菜单栏中,或Shift+Ctrl+F11启用。然后,选中单个元素,点击添加。

  • 给符号命名,该名称即为引用的ID

  • 保存为SVG时,实际上生成的SVG代码并非我们要使用的,太过臃肿,可以到 http://www.zhangxinxu.com/sp/svg.html 进行处理下,方便使用查看DEMO3处理后的代码

  • 在Html 里将SVG 放入,并隐藏;

<svg style="display:none;">
<symbol id="earth" ... </path></symbol>
</svg>

使用:

<svg class="icon icon-facebook"><use xlink:href="#facebook"></use></svg>

效果如下:

可以通过CSS去控制填充(fill)或者描边的颜色(stroke)

.icon-blue{
fill:#1ba1e2;
}

使用 icomoon 制作SVG Sprite [推荐]

icommon不仅可以生成icon fonts还可以生成SVG Sprite.

文件下载完成解压可以得到的文件夹里面会有demo.html 可以直接打开源码参考使用.

使用svgstore生成SVG Sprite

svgstore是 grunt的一个插件,用于自动获取文件中的SVG文件并自动合并。

npm install grunt-svgstore --save-dev

安装成功后,可以在 node_modules中看到grunt-svgstore文件夹

可以新建一个项目,svg-demo1

在文件中新建一个 src 文件夹,并把需要合并的svg文件中放进去

然后新建package.json

{
"name": "svg-store",
"version": "0.1.0",
"private": true,
"devDependencies": {
"grunt": "^0.4.5",
"grunt-svgstore": "~0.5.0"
}
}

然后新建Gruntfile.js,里面配置选项大致如下:

module.exports = function(grunt) {
// 配置
grunt.initConfig({
svgstore: {
options: {
prefix : 'icon-',
svg: {
viewBox : '0 0 100 100',
xmlns: 'http://www.w3.org/2000/svg'
},
includedemo:true,
},
default : {
files: {
'dest/dest-svg.svg': ['src/*.svg'],
},
} }
});
// 载入grunt-svgstore
grunt.loadNpmTasks('grunt-svgstore');
// 注册任务
grunt.registerTask('default', ['svgstore']);
};

接下来输入命令npm install;

自动加载依赖项目,再输入命令:

grunt

这个时候可以看到一个合并的dest-svg.svg文件和一个dest-svg-demo.html文件,打开网页文件,你可以快速的使用这些svg icon了.

一些常见的配置说明:

options.includedemo // 是否生成一个demo的html文件 一般还是写上比较好
options.cleanup //是否支持css 控制图标的fill和stroke属性等,可以传入一个数组实现自定义 ['fill','stroke-width' ...]
options.svg // 添加svg的一些属性在生成的svg文件中 viewBox: '0,0,100,100'

更多选项:参考这里

小结

借助第三方工具我们可以快速的制作svg sprite,相对其他方案,svg更加灵活,可控制,矢量显示等优点,在移动端以及部分pc站点上非常适用于图标解决方案。

扩展阅读: http://events.jackpu.com/svg/demo.html

本文转载于:SVG Sprite 入门(SVG图标解决方案)

SVG Sprite 入门(SVG图标解决方案)的更多相关文章

  1. 自制按钮图标的两种方法: image sprite和svg字体文件

    用image sprite和svg字体文件这两种方法,都能够极大地减少小图形文件的数量, 从而减少服务器请求和带宽需求.提高网页的响应速度. 一.建立SVG字体文件 iconmoon 是一个在线工具, ...

  2. 在vue中使用svg sprite

    概述 这几天研究了一下在vue中使用svg sprite,有些心得,记录下来,供以后开发时参考,相信对其它人也有用. 在vue中导入svg 在vue中导入svg的方法有很多种,比如在img标签的src ...

  3. SVG Sprite 使用Symbol元素制作ICON

    介绍 SVG是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法.之前写过两篇关于CSS icon在页面显示的博客,后来了解到现在大多数前端团队和项目都在使用SVG Sprite这种方 ...

  4. SVG 新手入门

    svg 入门新认知 一.第一步创建设置svg <svg width="100%" height="500"> </svg> 设置粗细 5 ...

  5. 突袭HTML5之SVG 2D入门1 - SVG综述////////////////zzzzzzzz

    以二次贝塞尔曲线的公式为例: js函数: //p0.p1.p2三个点,其中p0为起点,p2为终点,p1为控制点 //它们的坐标用数组表示[x,y] //t的范围是0-1 function qBerzi ...

  6. 将svg文件化成字体图标的步骤

     一 前提摘要     有一个活就是按照需求在现有的项目中新增几个项目和修改几个项目,是很简单的,但当中遇到了一个小问题,就是tabs中图标选中和被选中的颜色问题,如果是新开发的,目前掌握的有两种办法 ...

  7. REM+SVG Sprite,web app案例

    REM+SVG Sprite,构建新时代web app <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&quo ...

  8. svg图标(svg实现的QQ图标)

    与传统的图片相比,用svg实现的图标要更好控制. 比如.若要改变图标的颜色,如果用图片的话,就需要UI设计人员调整图片,而如果用svg的话,就不用那么麻烦,开发人员改样式就行了. 附一个svg实现的Q ...

  9. 使用icomoon把svg图片生成字体图标

    今天看了使用icomoon来将svg转换成图标字体,本来是不会使用别人给的svg,也不清楚具体的好处是什么,查了svg以后,越来越懵,svg挺好的为什么要转成图标字体呢. 一.SVG介绍 SVG 是一 ...

随机推荐

  1. kibana命令复制索引

    POST _reindex { "source": { "index": "原索引名称" }, "dest": { &q ...

  2. JZ-065-矩阵中的路径

    矩阵中的路径 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路 ...

  3. HBase面试

    宕机问题: MapReduce读写HBase HBase特点: 1.大:一个表可以有上亿行,上百万列 2.面向列:面向列表(蔟)的存储和权限控制,列(蔟)独立检索 3.稀疏:对于为空(NULL)的列, ...

  4. ansible二进制部署kubernetes集群

    kubernetes版本1.21.5 需要的资源文件请自行到我的阿里云盘下载 https://www.aliyundrive.com/s/zVegF78ATDV 修改主机信息 #根据自己的主机信息自行 ...

  5. 专业3 Cookie 和Session的使用及原理

    Cookie的使用及原理 什么是cookie cookie是一种用来跟踪和识别用户上网信息的会话控制技术,它将跟踪后的信息存储在客户端的浏览器上 cookie如何使用 第一步:设置cookie即可(告 ...

  6. 浅识 npm 与 cnpm

    npm是什么? Node Package(包) Manager(管理器) 的简称. 在 GitHub 还没有兴起的年代,前端是通过网址来共享代码.比如你想使用 jQuery,那么你点击 jQuery ...

  7. vue+echarts可视化大屏,全国地图下钻,页面自适应

    之前写过一篇关于数据大屏及地图下钻的文章 https://www.cnblogs.com/weijiutao/p/13977011.html ,但是存在诸多问题,如地图边界线及行政区划老旧,无法自适应 ...

  8. ArcGIS修路问题(最优路径问题)

    1 前言 修路问题,辅助减少花费.用栅格进行路径分析. 2 问题阐述 根据题目要求,找出一条从学校通往某目的地的道路,实现以下操作: (1)坡度在30度以上的地形不适合修建道路,适合修路的坡度相等间隔 ...

  9. MySQL基础_索引

    MySQL 索引(入门): 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些 ...

  10. case 函数语法与使用

    case 函数是聚合函数的一种,为统计函数. case表达式: CASE selector WHEN value1 THEN action1; WHEN value2 THEN action2; WH ...