svg sprite

概述

SVG(Scalable Vector Graphics)是一种矢量图格式。Adobe Illustrator是专门编辑、制作矢量图的软件。

随着高清视网膜屏幕的出现,Web设计需要根据屏幕输出不同分辨率的图片。在开发中需要准备两套不同的图片应对,一套在普通屏幕上显示;一套在高清屏幕上显示。

现在流行的icon font字体图标,其实质上是SVG的封装。

SVG的优势

  • SVG是矢量图形文件,无限放大不失真。
  • 可以用CSS样式来自由定义图标颜色,比如颜色/尺寸等效果。
  • 所有的SVG可以全部在一个文件中,节省HTTP请求 。
  • 使用SMIL、CSS或者是javascript可以制作充满灵性的交互动画和滤镜效果。
  • 由于SVG也是一种XML节点的文件,所以可以使用gzip的方式把文件压缩到很小。

Adobe Illustrator

Adobe Illustrator能直接把文件保存成SVG格式:

1-1保存-选择SVG(svg)
1-2格式类型选择 SVG 1.1

浏览器支持

浏览器支持统计

在所有浏览器中支持,可以采用以下方式:David Bushell

  • 使用 JavaScript if there’s an error:
    <img src="image.svg" onerror="this.onerror=null; this.src='image.png'">

  • 使用Modernizr检测,JQuery做降级处理:
    <pre>
    if (!Modernizr.svg) {
    $('img[src$=".svg"]').each(function() {
    $(this).attr('src', $(this).attr('src').replace('.svg', '.png'));
    });
    }
    </pre>

  • 使用Modernizr检测,CSS降级处理:
    Modernizr在检测到不支持SVG时,会在HTML上加了no-svgCSS类
    <pre>
    .icon-logo
    {
    background: url(logo.svg) no-repeat top left;
    background-size: contain;
    }
    </pre>

    <pre>
    .no-svg .main-header
    {
    background-image: url(logo.png);
    }
    </pre>

  • 使用SVGeezy插件

SVG的使用

  • 使用imgobject标签直接引用svg。这种方法的缺点主要在于要求每个图标都单独保存成一个SVG文件,使用时也是单独请求的,增加了HTTP请求。

    • 最简单的用法:
      <img src="image.svg">

    • 使用object标签:
      <object type="image/svg+xml" data="image.svg">
      <img src="fallback.png">
      </object>

    • 使用object标签,Data URL 方式
      <object type="image/svg+xml" data="data:image/svg+xml;base64,[data]">
      <img src="fallback.png">
      </object>

    • object+css:不能加载svg时,会渲染内部 div的样式

      html:
      <object id="logo" type="image/svg+xml" data="logo.svg">
      <div>logo description</div>
      </object>
      css:
      #logo div
      {
      width: 300px;
      height: 50px;
      background-image: url("logo.png");
      }

  • Inline SVG,直接把SVG写入 HTML 中,这种方法简单直接,而且具有非常好的可调性。Inline SVG 作为HTML文档的一部分,不需要单独请求。临时需要修改某个图标的形状也比较方便。但是Inline SVG使用上比较繁琐,需要在页面中插入一大块SVG代码不适合手写,图标复用起来也比较麻烦。

     <!--[if (gt IE 8)]><!--><svg></svg><!--<![endif]-->
    
  • SVG Sprite。这里所说的Sprite技术,没错,类似于CSS中的Sprite技术。图标图形整合在一起,实际呈现的时候准确显示特定图标。其实基础的SVG Sprite也只是将原来的位图改成了SVG而已。

  • 使用svg中的<symbol>元素来制作icon。SVG本身的定义是允许你可以使用<use>的方式直接引用SVG中的某一部分。

首先使用<symbol>方式,将SVG文件组装起来。注意每个<symbol>都必须有唯一的id。
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="circle-cross" viewBox="0 0 32 32">
<title>circle-cross icon</title>
<path d="M16 1.333q2.99 0 5.703 1.161t4.677 3.125 3.125 4.677 1.161 5.703-1.161 5.703-3.125 4.677-4.677 3.125-5.703 1.161-5.703-1.161-4.677-3.125-3.125-4.677-1.161-5.703 1.161-5.703 3.125-4.677 4.677-3.125 5.703-1.161zm0 2.667q-2.438 0-4.661.953t-3.828 2.557-2.557 3.828-.953 4.661.953 4.661 2.557 3.828 3.828 2.557 4.661.953 4.661-.953 3.828-2.557 2.557-3.828.953-4.661-.953-4.661-2.557-3.828-3.828-2.557-4.661-.953zm3.771 6.885q.552 0 .948.391t.396.943-.396.948l-2.833 2.833 2.833 2.823q.396.396.396.938 0 .552-.396.943t-.948.391-.938-.385l-2.833-2.823-2.823 2.823q-.385.385-.948.385-.552 0-.943-.385t-.391-.938q0-.563.385-.948l2.833-2.823-2.833-2.833q-.385-.385-.385-.938t.391-.948.943-.396.948.396l2.823 2.833 2.833-2.833q.396-.396.938-.396z"/>
</symbol>
<symbol id="circle-check" viewBox="0 0 32 32">
<title>circle-check icon</title>
<path d="M16 1.333q2.99 0 5.703 1.161t4.677 3.125 3.125 4.677 1.161 5.703-1.161 5.703-3.125 4.677-4.677 3.125-5.703 1.161-5.703-1.161-4.677-3.125-3.125-4.677-1.161-5.703 1.161-5.703 3.125-4.677 4.677-3.125 5.703-1.161zm0 2.667q-2.438 0-4.661.953t-3.828 2.557-2.557 3.828-.953 4.661.953 4.661 2.557 3.828 3.828 2.557 4.661.953 4.661-.953 3.828-2.557 2.557-3.828.953-4.661-.953-4.661-2.557-3.828-3.828-2.557-4.661-.953zm4.49 7.99q.552 0 .943.391t.391.943-.396.948l-5.656 5.656q-.385.385-.938.385-.563 0-.948-.385l-2.833-2.823q-.385-.385-.385-.948 0-.552.391-.943t.943-.391.948.396l1.885 1.885 4.708-4.719q.396-.396.948-.396z"/>
</symbol>

</svg>

1.  将SVG的XML文档插入到HTML中,直接用id引用icon:
        <svg class="icon">
            <use xlink:href="#circle-cross"></use>
        </svg>

2.  使用外部链接文件的形式引用icon:
        <svg class="icon">
            <use xlink:href:"/asssets/svg-symbols.svg#circle-cross"></use>
        </svg>

3.  支持fallback:
         <svg class="icon" viewBox="0 0 50 41"> 
            <switch> 
                <use xlink:href="#twitter-icon"></use>     
                <foreignObject> 
                    <img class="icon" src="img/twitter-icon.png" alt="Twitter"> 
                </foreignObject> 
            </switch> 
        </svg>

自动合并生成工具gulp-svg-symbols

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279

推荐阅读更多精彩内容

  • 演示地址 代码 SVG Sprite 传统的做法使用AI或者合并SVG图像,然后用background-posti...
    饥人谷_米弥轮阅读 1,295评论 0 0
  • 转载请声明 原文链接地址 关注公众号获取更多资讯 第一部分 HTML 第一章 职业规划和前景 职业方向规划定位...
    程序员poetry阅读 16,465评论 32 459
  • 本文为译文,原文标题:inline SVG VS icon font,链接:via 。 如果你正在为网站构建图标系...
    张未舟阅读 9,876评论 1 12
  • 我入微信比较晚,也一直认为微信是很私密的东西,在入互联网之前我是不加陌生人的。这个还是源自于一种态度吧,比如我之前...
    farewell兔too阅读 113评论 0 0
  • 我想我要彻底离开泪水满面的神话。并且努力寻找自己所期待的快乐,但我一天天尝到的是一个小小的幸福和苦难在相互变换。因...
    守望天边阅读 774评论 0 0