Skip to content

[svg]修改svg图标/大小/颜色

svg

svg 和我们常见的 jpg / png 一样是图片的存储格式。但svg是矢量图,jpg / png 是位图。由于这些概念并不影响本文的主题(修改svg的内容/大小等操作),故概念介绍请见本文末尾。


修改svg

  • 首先我们来看一下svg标签一般的样子:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="#66ccff">
    <path
d="M20.492,7.969,10.954.975A5,5,0,0,0,3,5.005V19a4.994,4.994,0,0,0,7.954,4.03l9.538-6.994a5,5,0,0,0,0-8.062Z"/>
</svg>
  • 它的效果就是这样的:

  • 主要属性和结构:

    • path元素(图标内容):

      • d:描绘图标的命令内容。可以想象浏览器有一支画笔,这个d元素就告诉浏览器的画笔要怎么动
    • xmlns:命名空间,一般不需要修改。它只是看起来像一个http链接

    • fill:图标的填充颜色,这里是 #66ccff ,即浅蓝色

    • width / height:svg本身的宽 / 高

    • viewBox:"x, y, width, height“,可以看到它有4个数值(在这里是 0 0 24 24)。

      • “x,y”说明了图标的左上角位置,即图标从哪里开始出现
      • ”width,height“说明了图标的宽和高
      • 但要注意的是,图标会先描绘成 viewBox 设置的宽 / 高的大小,然后再拉伸成svg标签的 width / height 的大小。当调小 viewBox 的 width / height时,path描绘的图标相对viewBox的占比就会增大,然后被拉伸到svg的大小,同样的图标相对svg的大小占比也增大,因此就会表现为增大了图标的大小

  • 因此总结下来就是

    • 修改图标颜色:修改 fill 属性

    • 修改图标大小

      • 增大:将 viewBox 的后两个数字调小,或将svg的 width 和 height 属性调大
      • 缩小:将 viewBox 的后两个数字调大,或将svg的 width 和 height 属性调小
      • 如果图像显示不全,则应考虑svg是否被div之类的标签限制了大小
    • 修改图标内容:修改 path 元素的 d 属性

      • 一般我们是去一些图标网站下载想要的svg图标,然后复制修改到想修改的地方,但有时会遇到一些问题:

      • 原svg只有一个path标签,但想修改的svg包含多个path标签:

        • 一般是一些不连续的图标会有多个path,比如这个:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">
    <path d="M18.5,0H5.5A5.506,5.506,0,0,0,0,5.5v13A5.506,5.506,0,0,0,5.5,24h13A5.506,5.506,0,0,0,24,18.5V5.5A5.506,5.506,0,0,0,18.5,0ZM21,18.5A2.5,2.5,0,0,1,18.5,21H5.5A2.5,2.5,0,0,1,3,18.5V5.5A2.5,2.5,0,0,1,5.5,3h13A2.5,2.5,0,0,1,21,5.5Z"/>
    <path d="M15.449,12.815,13.5,14.731V6.5a1.5,1.5,0,0,0-3,0v8.231L8.551,12.815a1.5,1.5,0,1,0-2.1,2.14L9.55,18a3.524,3.524,0,0,0,4.9,0l3.1-3.048a1.5,1.5,0,1,0-2.1-2.14Z"/></svg>
  • -

    • 它由两部分组成:外围的 矩形 和里面的 箭头

    • 效果:

  • -

    • 此时我们可以修改HTML源码或者用JS给原来的svg增加一个path标签,然后修改它的d属性。
    • 或者是合并多个path为一个:
      • 合并其实是很简单的,只需要把前一个path的d属性末尾的 ‘Z’(也可能是小写的 'z' )替换为英文的逗号 ',' ,然后把下一个path的d属性值原封不动复制到上一个path的d属性值的末尾即可
      • 比如上面这个下载符号:

  • -
    • 最后就变成了这样:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">
    <path d="M18.5,0H5.5A5.506,5.506,0,0,0,0,5.5v13A5.506,5.506,0,0,0,5.5,24h13A5.506,5.506,0,0,0,24,18.5V5.5A5.506,5.506,0,0,0,18.5,0ZM21,18.5A2.5,2.5,0,0,1,18.5,21H5.5A2.5,2.5,0,0,1,3,18.5V5.5A2.5,2.5,0,0,1,5.5,3h13A2.5,2.5,0,0,1,21,5.5,
   M15.449,12.815,13.5,14.731V6.5a1.5,1.5,0,0,0-3,0v8.231L8.551,12.815a1.5,1.5,0,1,0-2.1,2.14L9.55,18a3.524,3.524,0,0,0,4.9,0l3.1-3.048a1.5,1.5,0,1,0-2.1-2.14Z"/>
  • -
    • 注意:如果第一个path的d元素值末尾的 ‘z’ 没有替换掉,则可能会出现后一部分覆盖前一部分的问题。
    • 我们仍然以上面的下载图标为例子:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20">
    <path d="M18.5,0H5.5A5.506,5.506,0,0,0,0,5.5v13A5.506,5.506,0,0,0,5.5,24h13A5.506,5.506,0,0,0,24,18.5V5.5A5.506,5.506,0,0,0,18.5,0ZM21,18.5A2.5,2.5,0,0,1,18.5,21H5.5A2.5,2.5,0,0,1,3,18.5V5.5A2.5,2.5,0,0,1,5.5,3h13A2.5,2.5,0,0,1,21,5.5Z,
   M15.449,12.815,13.5,14.731V6.5a1.5,1.5,0,0,0-3,0v8.231L8.551,12.815a1.5,1.5,0,1,0-2.1,2.14L9.55,18a3.524,3.524,0,0,0,4.9,0l3.1-3.048a1.5,1.5,0,1,0-2.1-2.14Z"/>
  • -
    • 效果:
    • 可以看到只剩下外面的矩形了。

相关概念

图片的表示方法主要有矢量方式和位图方式,下面我们来看看它们的差别。

矢量图

  • 由数学向量表示,想象把图像拆分为 线段 和 点 来表示,因此图像越是复杂,则文件越大。显然曲线就要比直线要复杂一些,五角星比矩形要复杂
  • 特点:
    • 文件通常比较小。放大后图像不会失真,和分辨率无关,即不会因放大缩小而模糊或出现锯齿。
    • 缺点是难以表现色彩层次丰富的图像效果
  • 格式例子:
    • svg / raw / bw

位图

  • 由像素点构成一个矩阵,每一个像素点可以有各种各样不同的颜色,显然像素点越多,颜色越丰富则文件越大

  • 特点:

    • 由像素点组成,文件通常较大。只要有足够多的不同色彩的像素,就可以制作出色彩丰富的图象

    • 缺点是缩放和旋转后容易失真,出现锯齿或像素点

  • 格式例子:

    • bmp / jpg / png