天行健, 君子以自强不息
Sunny's Blog
Title

Sharing1 -- 2017我们该如何用icons(SVG)在项目中

Sharing这个系列是我在公司的一些技术分享,现在的项目中有很多使用icons的方式,哪种方式最灵活,使用最简单,消耗资源最少,扩展最方便。我们在最近的一个项目中用到了symbol,我觉得比较符合这些要求。

我只是搬运工,除了项目中的几位大神需要感谢之外,用到的一些文章链接如下:

使用SVG中的Symbol元素制作Icon

icomoon, 方便的提供了数量众多的svg及其代码

使用SVG中的Symbol元素制作Icon

言归正传,Sharing现在开始。。。

1.相比png而言,SVG的优势

                1)SVG是矢量图形文件,可以随意改变大小,而不影响图标质量。
                2)可以用CSS样式来自由定义图标颜色,比如颜色/尺寸等效果。
                3)所有的SVG可以全部在一个文件中,节省HTTP请求。
                4)使用SMIL、CSS或者是javascript可以制作充满灵性的交互动画效果。
                5)由于SVG也是一种XML节点的文件,所以可以使用gzip的方式把文件压缩到很小。
            

2.在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。
            

3.我的一点理解:合并简单,调用简单,查找简单

下面是一个完整的svg-symbol的写法

              HTML:
              ...
              <body>
              //2.调用简单,注意svg-symbol要hidden,这样DOM tree就不会render了,提高性能
              <div id="svg-symbol" class="hidden"></div>

              <div>svg symbol demo:</div>

              <svg class="icon icon-spades"><use xlink:href="#icon-spades"></use></svg>
              <svg class="icon icon-clubs"><use xlink:href="#icon-clubs"></use></svg>
    
              //2.调用简单,tag <use>通过id去映射,可以多次调用,这个id在symbol.html中对应
              <svg class="icon icon-diamonds"><use xlink:href="#icon-diamonds"></use></svg>
              <svg class="icon icon-diamonds"><use xlink:href="#icon-diamonds"></use></svg>
              <svg class="icon icon-diamonds"><use xlink:href="#icon-diamonds"></use></svg>
              <svg class="icon icon-IE"><use xlink:href="#icon-IE"></use></svg>
              <svg class="icon icon-camera"><use xlink:href="#icon-camera"></use></svg>

              <script type="text/javascript" src="js/jquery-1.11.2.min.js"></script>
              <script type="text/javascript" src="test.js"></script>
              </body>
              ...
            
              ==============================================================================
              
              test.js
              ...
              // 2.调用简单,返回的html直接查到#svg-symbol的tag中
              $.ajax({
                  // 1.合并简单,写在一个html里面,到专用网站查找,用多少加多少
                  // https://icomoon.io/app/#/select
                  url: './symbol/symbol.html',
                  type: 'POST',
                  dataType: 'html'
              })
              .done(function(data) {
                  $('#svg-symbol').append(data);
              })
              .fail(function() {
                  console.log("error");
              })
              ...
            
              ==============================================================================
              
              symbol.html
              
              //3.大量引用svg icon,最好下载对应的demo文件,方便以后用id进行查找
              <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
                <symbol id="icon-spades" viewBox="0 0 32 32">
                    <title>spades</title>
                    <path class="path1" d="M25.549 10.88c-6.049-4.496-8.133-8.094-9.549-10.88v0c-0 0-0-0-0-0v0c-1.415 2.785-3.5 6.384-9.549 10.88-10.314 7.665-0.606 18.365 7.93 12.476-0.556 3.654-2.454 6.318-4.381 7.465v1.179h12.001v-1.179c-1.928-1.147-3.825-3.811-4.382-7.465 8.535 5.889 18.244-4.811 7.93-12.476z"></path>
                </symbol>
                //2.调用简单,tag <use>通过id去映射,可以多次调用,这个id在symbol.html中对应
                <symbol id="icon-diamonds" viewBox="0 0 32 32">
                    <title>diamonds</title>
                    <path class="path1" d="M16 0l-10 16 10 16 10-16z"></path>
                </symbol>
                ...
              </svg>
              
            
地势坤,君子以厚德载物