Fork me on GitHub

SVG学习笔记

概述

作为一个前端开发人员,时不时的会用到SVG,所以我简略的学习了一下SVG基础,总结了一下并记下来,供以后开发时参考,相信对其他人也有用。

参考资料:
MDN SVG教程

介绍

SVG是XML语言的一种形式,有点类似XHTML,它可以用来绘制矢量图形。它可以成为任何复杂的组合图形。SVG支持渐变、旋转、滤镜效果、JavaScript接口等等功能。

各种SVG浏览器是有差异的,因此很可能你制作了一个SVG图形,并且用一个工具调试正常后,却在另外一个浏览器中无法正常显示。这是因为不同的浏览器支持SVG标准的程度不同

需要记住以下几个重点:

  • SVG的元素和属性必须按标准格式书写,因为XML是区分大小写的(这一点和html不同)
  • SVG里的属性值必须用引号引起来,就算是数值也必须这样做。

SVG文件全局有效的规则是“后来居上”,越后面的元素越可见。

svg文件可以直接在浏览器上展示,比如直接使用SVG标签,或者用object,iframe等标签引用SVG文件。比如:

<object data="image.svg" type="image/svg+xml" />
<iframe src="image.svg"></iframe>

SVG采取的坐标系统是,x轴向右是正的,y轴向下是正的。SVG标签的width和height属性定义了画布的尺寸,viewBox属性定义了画布上可以显示的区域。示例如下:

<svg width="200" height="200" viewBox="0 0 100 100">

基本形状

rect元素表示矩形:

  • x表示矩形左上角的x位置
  • y表示矩形左上角的y位置
  • width表示矩形的宽度
  • height表示矩形的高度
  • rx表示圆角的x方位的半径
  • ry表示圆角的y方位的半径

示例如下:

<rect x="10" y="10" width="30" height="30"/>
<rect x="60" y="10" rx="10" ry="10" width="30" height="30"/>

circle元素表示圆形:

  • r表示圆的半径
  • cx表示圆心的x位置
  • cy表示圆心的y位置

实例如下:

<circle cx="25" cy="75" r="20"/>

Ellipse元素表示椭圆:

  • rx表示椭圆的x半径
  • ry表示椭圆的y半径
  • cx表示椭圆中心的x位置
  • cy表示椭圆中心的y位置

实例如下:

<ellipse cx="75" cy="75" rx="20" ry="5"/>

Line表示直线:

  • x1表示起点的x位置
  • y1表示起点的y位置
  • x2表示终点的x位置
  • y2表示终点的y位置

实例如下:

<line x1="10" x2="50" y1="110" y2="150"/>

Polyline表示折线:

  • points表示点集数列,一个是x坐标,一个是y坐标。

实例如下:

<polyline points="60 110, 65 120, 70 115, 75 130, 80 125, 85 140, 90 135, 95 150, 100 145"/>

polygon表示多边形,它会在路径的最后一个点处自动回到第一个点:

  • points表示点集数列,一个是x坐标,一个是y坐标。

实例如下:

<polygon points="50 160, 55 180, 70 180, 60 190, 65 205, 50 195, 35 205, 40 190, 30 180, 45 180"/>

path表示路径,它可能是SVG中最常见的形状,通常用它来画各种图形:

  • d表示一个点集数列以及其它关于如何绘制路径的信息

实例如下:

<path d="M 20 230 Q 40 205, 50 230 T 90230"/>

路径

path元素有很多命令:

  • M x y表示从什么位置开始。(不画线)
  • L x y表示移动画笔到什么位置。(画线)
  • H x表示画水平线
  • V y表示画垂直线
  • Z表示闭合图形,返回至起点。
  • C x1 y1, x2 y2, x y表示三次贝塞尔曲线
  • S x2 y2, x y用来连接三次贝塞尔曲线
  • Q x1 y1, x y表示二次贝塞尔曲线
  • T x y用来连接二次贝塞尔曲线
  • A rx ry x-axis-rotation large-arc-flag sweep-flag x y表示弧形

其它属性

fill属性设置对象内部的颜色,还有许多扩展属性比如:fill-opacity,fill-rule等。

stroke属性设置绘制对象的线条的颜色,还有许多扩展属性比如:stroke-opacity,stroke-width,stroke-linecap,stroke-dasharray等。

不过,有时候我们可以用css的background-color和border用来替换fill和stroke属性。但是支持程度有限,比如SVG里面不支持before和after伪类等。

defs标签里面可以定义一些不会再svg图形里面出现,但是可以被其它元素使用的元素,比如:

<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1">
  <defs>
    <style type="text/css"><![CDATA[
       #MyRect {
         stroke: black;
         fill: red;
       }
    ]]></style>
  </defs>
  <rect x="10" height="180" y="10" width="180" id="MyRect"/>
</svg>

在defs元素内部还可以定义linearGradient节点,表示线性渐变;还可以定义radialGradient节点,表示径向渐变。用法如下,其中stop节点表示一个中间值,然后使用xlink:href来引用这些节点。

<linearGradient id="Gradient1">
   <stop id="stop1" offset="0%"/>
   <stop id="stop2" offset="50%"/>
   <stop id="stop3" offset="100%"/>
 </linearGradient>
 <linearGradient id="Gradient2" x1="0" x2="0" y1="0" y2="1"
    xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#Gradient1"/>

除了用渐变填充之外,还可以用patterns(图案)填充,示例如下:

<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1">
  <defs>
    <linearGradient id="Gradient1">
      <stop offset="5%" stop-color="white"/>
      <stop offset="95%" stop-color="blue"/>
    </linearGradient>
    <linearGradient id="Gradient2" x1="0" x2="0" y1="0" y2="1">
      <stop offset="5%" stop-color="red"/>
      <stop offset="95%" stop-color="orange"/>
    </linearGradient>

    <pattern id="Pattern" x="0" y="0" width=".25" height=".25">
      <rect x="0" y="0" width="50" height="50" fill="skyblue"/>
      <rect x="0" y="0" width="25" height="25" fill="url(#Gradient2)"/>
      <circle cx="25" cy="25" r="20" fill="url(#Gradient1)" fill-opacity="0.5"/>
    </pattern>

  </defs>

  <rect fill="url(#Pattern)" stroke="black" x="0" y="0" width="200" height="200"/>
</svg>

text节点用来放置文字,其中属性text-anchor来表示文本流的方向。tspan节点用来标记文本的子部分;tref节点用来引用已经定义的文本;textPath节点用来取得一个任意路径(字体会沿着路径进行排列)。示例如下:

<path id="my_path" d="M 20,20 C 40,40 80,40 100,20" />
<text>
  <textPath xlink:href="#my_path">This text follows a curve.</textPath>
</text>

g节点可以把属性赋给一整个元素集合,示例如下:

<g fill="red">
  <rect x="0" y="0" width="10" height="10" />
  <rect x="20" y="0" width="10" height="10" />
</g>

transform属性可以用来进行各种平移,旋转,缩放等。

其它

值得注意的是,SVG可以无缝嵌入别的svg元素中,实例如下:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <svg width="100" height="100" viewBox="0 0 50 50">
    <rect width="50" height="50" />
  </svg>
</svg>

SVG可以使用clipPath和mask进行剪切和遮罩

SVG还可以在image节点中嵌入图像元素,比如:PNG、JPG和SVG等格式文件,示例如下:

<svg version="1.1"
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
     width="200" height="200">
  <image x="90" y="-65" width="128" height="146" transform="rotate(45)"
     xlink:href="https://developer.mozilla.org/media/img/mdn-logo.png"/>
</svg>

foreignObject节点可以用来在SVG中嵌入XHTML内容,在很多时候,这个节点比其它节点更合适。

posted @ 2018-07-19 23:02  馒头加梨子  阅读(391)  评论(0编辑  收藏  举报