使用SVG symbols建立图标系统完整指南

更新日期: 2019-07-21阅读: 3k标签: svg

从最开始的使用img图片,到后来的使用css sprite来减少服务器请求,再到流行的图形字体化图标Iconfont。现在,一种全新的图标使用方式开始流行了起来——SVG symbols图标。


工作原理

SVG symbols的工作原理:symbol元素用来定义一个图形模板对象,它可以用一个use元素实例化。

symbol元素对图形的作用是在同一文档中多次使用,symbol元素本身是不呈现的。只有symbol元素的实例(亦即,一个引用了symbol的use元素)才能呈现:

<svg>
  <symbol viewBox="0 0 24 24" id="heart">
    <path fill="#E86C60" d="M17,0c-1.9,0-3.7,0.8-5,2.1C10.7,0.8,8.9,0,7,0C3.1,0,0,3.1,0,7c0,6.4,10.9,15.4,11.4,15.8 c0.2,0.2,0.4,0.2,0.6,0.2s0.4-0.1,0.6-0.2C13.1,22.4,24,13.4,24,7C24,3.1,20.9,0,17,0z">
    </path>
  </symbol>
  <symbol viewBox="0 0 32 32" id="arrow">
    <path fill="#0f0f0f" d="M16,0C7.2,0,0,7.2,0,16s7.2,16,16,16s16-7.2,16-16S24.8,0,16,0z M22.8,13.6l-6,8C16.6,21.9,16.3,22,16,22 s-0.6-0.1-0.8-0.4l-6-8c-0.2-0.3-0.3-0.7-0.1-1S9.6,12,10,12h12c0.4,0,0.7,0.2,0.9,0.6S23,13.3,22.8,13.6z">
    </path>
  </symbol>
</svg>

这段代码使用SVG symbols定义了两个图标,每个symbol元素定义一个图标,图标id分别是heart和arrow,将其放在html文件的body元素内。

通过以下代码引用id为heart的图标:

<svg>
    <use xlink:href="#heart"/>
</svg>

xlink:href属性值就是‘#’加symbol的id名称,那么只需改变这个属性值就可以引用不同的图标。


gulp自动化处理

如果你使用gulp构建项目,推荐使用一个专门用于处理SVG Symbols用的glup插件 gulp-svg-symbols ,它不但能生成SVG Symbols文件,还能生成一个demo文件方便查看图标和复制代码。

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

npm install gulp-svg-symbols  --save-dev

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

const gulp = require('gulp')
const svgSymbols = require('gulp-svg-symbols')

gulp.task(`sprites`, function() {
  return gulp
    .src(`assets/svg/*.svg`)
    .pipe(svgSymbols())
    .pipe(gulp.dest(`assets`))
})

现在生成SVG symbols文件了,那怎么将它引入到页面呢?如果是多页应用推荐使用 svg4everybody.js 为所有浏览器添加了SVG外部内容支持。这样就能直接使用外部的SVG symbols文件。

在文档中包含该脚本:

<script src="/path/to/svg4everybody.js"></script>
<script>svg4everybody(); // run it now or whenever you are ready</script>

使用外部的SVG symbols文件时,通过以下代码引用图标(map.svg是外部的SVG symbols文件,codepen是图标id):

<svg>
  <use xlink:href="map.svg#codepen"/>
</svg>

如果是单页应用,使用svg4everybody.js就感觉太繁琐了,能不能一步搞定啊?当然可以,将将SVG symbols文件转成js文件就好了,推荐使用 gulp-svg-symbols2js 将SVG symbols文件转成js文件。

安装gulp-svg-symbols2js插件:

npm install gulp-svg-symbols2js --save-dev

修改gulpfile.js文件:

const gulp = require('gulp')
const svgSymbols = require('gulp-svg-symbols')
const svgSymbols2js = require('gulp-svg-symbols2js');

gulp.task(`sprites`, function() {
  return gulp
    .src(`assets/svg/*.svg`)
    .pipe(svgSymbols())
    .pipe(svgSymbols2js())
    .pipe(gulp.dest(`assets`))
})

现在只要引入生成的js文件,就可以在页面中使用以下代码引用图标:

<svg>
  <use xlink:href="#codepen"/>
</svg>


webpack自动化处理

如果你的项目使用webpack进行打包,可以考虑使用 svg-sprite-loader 插件自动生成SVG symbols文件。

安装svg-sprite-loader:

npm install svg-sprite-loader --save-dev

将svg图标放到src/icons目录下,在webpack配置文件中添加svg-sprite-loader的配置:

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test: /\.svg$/,
        loader: 'svg-sprite-loader',
        include: [path.resolve(__dirname, 'src/icons')], // 仅处理src/icons目录下的svg文件
        options: {
          symbolId: 'icon-[name]'
        }
      }
    ]
  }
}

在打包文件(index.js)中引入单个图标:

import cloud from './icons/cloud.svg'

这样引入的好处是只引入需要的图标,没引入的图标不会被打包,缺点是当图标很多时这样引入会显得很繁琐,因为一般情况下,所有图标都会被使用,所以有必要找到一种简单的方式一次引入所有图标。

使用一些代码将svg图标全部引入:

const requireAll = requireContext => requireContext.keys().map(requireContext);
const req = require.context('./icons', true, /\.svg$/);
requireAll(req);

现在可以在HTML中使用图标了:

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


经验总结和建议

  • 始终使用gulp构建,方便浏览的图标demo在开发中很重要
  • 始终使用单色图标,多色图标只能通过id选择器修改样式
  • 始终在ie9+,及现代浏览器使用,传统浏览器使用iconfont更好


链接: https://www.fly63.com/article/detial/4300

如何使用SVG及其动画技术为你的 Web 前端开发带来一些新鲜的体验

设备间不同的屏幕尺寸、分辨率和比例使得产品难以提供一致的体验,对于那些对产品有着像素级完美追求的人这种体验差异尤其显著! SVG(可缩放的矢量图形)完美地解决了上文中提到的部分问题。

如何在vue项目中优雅地使用SVG

安装svg-sprite-loader。通过vue-cli脚手架创建的项目默认情况下会使用 url-loader 对svg进行处理,在static下新建svg文件夹,用来放置当做icon使用的svg,使用include,include和img做区分。然后修改webpack.base.conf.js配置,这样svg-sprite-loader只会处理我们指定的static/svg下的文件

封装全局icon组件 svg (仿造element-ui源码)

引入 svg-sprite-loader 插件,vue-cli项目默认情况下会使用 url-loader 对svg进行处理,会将它放在/img 目录下,所以这时候我们引入svg-sprite-loader 会引发一些冲突。使用 webpack 的 exclude和 include

通过css改变svg img的颜色

一般的解决办法有:1.字体图标改变css的color属性;2.js在hover事件中切换图片;3.老一点的方案是hover切换背景?但是为了更小的开销,一般css为更好的解决方案

一步步教你用 CSS 为 SVG 添加过滤器

SVG就存在了,但仍有一些有趣的方法去用它。在本教程中,重点将放在 SVG 的过滤器上 —— 但不只是将它们应用于 SVG 图像,我将向你展示如何将它们应用于任何常规页面的内容上。实际上我们是通过告诉 CSS 过滤器所拥有的 ID,然后再把过滤器应用于 SVG 的方式来实现。

SVG基础图形和D3.js

学习如何使用D3.js来创建这些图形?这里会包括前面例子中的SVG基础图形以及如何使用D3.js设置图形的属性。使用D3.js画一个SVG 的 圆 circle,可以使用如下代码创建:

关于Data URLs svg图片显示出错和浏览器URL hash #

在使用生成的svg图作为<img>标签是src值时,发现有部分浏览器显示异常,所以这里记录下,在<img src=\\\"Data URLs\\\">中,Data URLs格式与显示情况如下:

巧妙运用clip-path,实现CSS形状变换

CSS3的clip-path,这个clip-path看起来有点眼熟,因为它原本就存在于SVG里头,利用掩码(剪裁)的方法,连接坐标绘制掩码区域,就可以做出许多不同的形状,让底色或底图显现,随着浏览器对于CSS3的支持度大幅提升

svg插入foreignObject无法响应事件

svg中可以通过foreignObject嵌入html,展示更丰富的样式。当需要给这中间的html绑定事件的时候,不管是使用委托和直接查询元素进行绑定的时候都无法生效。右键检查元素也检查不到具体的元素

svg的path的应用

我们这里只要用到M L A 和Z命令就可以了,M L 和Z命令比较简单,这里详细讲解A命令,A命令是画弧的命令,里面的A命令有 7个参数:rx ry x-axis-rotation large-arc-flag sweep-flag x y

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!