SVG、SVG Symbol 组件化实践

5,323 阅读6分钟

前言

随着移动互联网的到来,各种高清屏幕移动设备的层出不穷,导致H5应用在移动设备retina屏幕下经常会遇到图标不清晰的问题。

为了解决屏幕分辨率对图标影响的问题,通常采用CSS Sprite,Icon Font,CSS Icon以及SVG以适应@x1屏、@2屏、@3屏,相对比较而言SVG矢量性、缩放无损等诸多优点,更应受前端设计师的青睐,可在许多公司的移动项目应用中却很鲜见,究其主因在于SVG开发学习成本比较高以及在绘制的性能上比PNG要差。此篇文章将从SVG快速导出到SVG、SVG Symbol组件化在项目中实战进行讲解,教你如何提高SVG开发效率减少成本。

SVG简介

SVG是一种开放标准的矢量图形语言,使用svg格式我们可以直接用代码来描绘图像,可以用任何文字处理工具打开svg图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来浏览。

SVG优缺点:

优点 缺点
1.缩放无损还原,显示清晰 1.SVG在绘制的性能上比PNG要差
2.语义性良好 2.局限性,对应单色或普通渐变没什么问题,但对不规则的渐变以及特效叠加效果显示不全
3.可用CSS控制图标样式以及动画 3.兼容性稍差,android4.1才开始支持
4.减少http请求 4.学习应用成本较高

Web应用中SVG的使用方式

1.使用img、object、embed 标签直接引用svg 此方法的缺点主要在于每个图标都需单独保存成一个 SVG 文件,使用时单独请求,增加了HTTP请求数量。


2.Inline SVG,直接把SVG写入 HTML 中

Inline SVG 作为HTML文档的一部分,不需要单独请求。临时需要修改某个图标的形状也比较方便。但是Inline SVG使用上比较繁琐,需要在页面中插入一大块SVG代码不适合手写,图标复用起来也比较麻烦。


	

	style="fill:#fecdddd;"/>

3.SVG Sprite

这里的Sprite技术,类似于CSS中的Sprite技术。图标图形整合在一起,实际呈现的时候准确显示特定图标。其实基础的SVG Sprite也只是将原来的位图改成了SVG而已,控制SVG大小、颜色需要重新合并SVG文件。

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


4.使用 SVG 中的 symbol,use 元素来制作SVG Sprite SVG Symbols的使用,本质上是对Sprite的进一步优化,通过元素来对单个svg元素进行分组,使用元素引用并进行渲染。这种方法的解决了上述三种方式带来的弊端,少量的http请求,图标能被缓存方便复用,每个SVG图标可以更改大小颜色,整合、使用以及管理起来非常简单。

①SVG Symbols作为body的第一个元素插入在HTML中使用:


    
        
            


    
         

        

②使用完整路径引用Icon(此方法涉及到跨域问题)

存在跨域问题,同域可以使用。


    
         

     
         

	//路径形式进行获取icon
        

③js控制svg写入body进行引用

推荐使用,有效分离结构和展现、解决缓存以及跨域问题。

svg.js:

var symbols = '
        
            

    ';
    document.body.insertAdjacentHTML("afterBegin",symbols)

svg.html:


	//脚本需在svg use引用之前引入
	
    
         

        

SVG快速导出

SVG导出工具:

Photoshop CC 2015 导出svg使用

Ps可以对矢量图层进行导出,即通过矢量工具绘制所在图层或图层文件夹进行导出,若对不是矢量图形进行导出,可能会引起错误或者导出的文件是位图。

SVG导出,建议图形一定要撑满整个画布,若存在间隙,网页使用时图标居中对齐就会比较麻烦。

1.批量导出SVG 批量导出SVG,只需在矢量图层或失落图层文件夹名后添加相应格式后缀(如.svg),依次点击菜单“文件->生成->图像资源”,确认该菜单项已被勾选。但是此方法会根据icon实际大小进行导出,若icon图标存在小数导出就不太适用,我们需要手动去调节。

批量导出SVG

2.设置导出为单个导出 设置导出为单个导出,选中矢量图层单击右键,依次点击“导出为->设置参数->导出”,此方法可以设置svg的图像实际大小,以及画布大小。

导出为: 批量导出SVG

设置导出svg图像实际大小,以及画布大小: 批量导出SVG

SVG Symbol自动化合并生成

Ps导出来的是单个svg文件,需要将这些单个svg文件进行合并生产symbol的SVG,这样才能通过symbol+use进行引用。可以使用手工合并,推荐使用工具,安利给大家一个专门用于处理SVG Symbols用的glup插件gulp-svg-symbols

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

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

assets
├── svg   //存放ps导出的大量svg文件
	├── xxx.svg  
	├── xxx.svg  
	├── xxx.svg  
	├── out  
├── gulpfile.js 
├── package.json 
├── index.html

安装gulp-svg-symbols插件,若没有预先安装gulp请先行安装:

npm i gulp-svg-symbols  --save

gulpfile.js写入如下执行任务:

'use strick';
const gulp = require("gulp");
const symbols = require("gulp-svg-symbols");
//转换svg
gulp.task('svg', () => {
  return gulp.src('./svg/**')
    .pipe(symbols())
    .pipe(gulp.dest('out/'))  
    });

执行任务导出svg-symbols:

gulp svg  //out文件夹,生成svg-symbols.svg,svg-symbols.css(此文件对应svg样式,基本无用)

SVG组件化实践

鉴于移动端全站规范的统一性,页面之间会存在许多的图标复用,为了引入svg图标复用性问题,引入了SVG组件化,SVG组件化主要包含三部分:SVG展示平台、SVG自动化工具、SVG Git仓库。 流程

设计师出图标规范 —-> Ps导出svg —-> 工具自动化合并svg symbol —-> 上传Git仓库管理 —-> SVG平台展示快速获取svg symbol

工具生成部分已上传Github,svgicon,快速生成svg symbol,对生产svg大小带小数进行预警

SVG展示平台,提供预览快速查找svg,点击下载使用。

参考资料: