D3js快速入门 - 1、svg基础
前言
SVG 意为可缩放矢量图形(Scalable Vector Graphics)。我们在对SVG绘制的图形缩放的时候,图像是不会失真的。
SVG 使用 XML 格式定义图像,也就是说SVG遵循XML文档格式,它在浏览器上是以DOM形式存在,即文档对象模型(Document Object Model)。
D3.js是基于SVG而封装的,主要用于交互式数据可视化。所以我们在入门D3.js的时候,我们就要对SVG又一个全面基础的认识。
这篇文章中,SVG在HTML中使用的的形式是直接嵌入SVG代码,更多使用方式请点击链接
内置图形
1、矩形
示例代码
1 2 3 4
| <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <rect width="300" height="100" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0)"/> </svg>
|
代码解析
- rect 元素的 width 和 height 属性可定义矩形的高度和宽度
- x 属性定义矩形的左侧位置(例如,x=”0” 定义矩形到浏览器窗口左侧的距离是 0px)
- y 属性定义矩形的顶端位置(例如,y=”0” 定义矩形到浏览器窗口顶端的距离是 0px)
- rx 和 ry 属性可使矩形产生圆角
- style 属性用来定义 CSS 属性
- CSS 的 fill 属性定义矩形的填充颜色(rgb 值、颜色名或者十六进制值)
- CSS 的 stroke-width 属性定义矩形边框的宽度
- CSS 的 stroke 属性定义矩形边框的颜色
- CSS opacity 属性用于定义了元素的透明值 (范围: 0 到 1)。
- CSS 的 fill-opacity 属性定义填充颜色透明度(合法的范围是:0 - 1)
- CSS 的 stroke-opacity 属性定义笔触颜色的透明度(合法的范围是:0 - 1)
2、圆形
示例代码
1 2 3 4
| <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/> </svg>
|
代码解析
- cx和cy属性定义圆点的x和y坐标。如果省略cx和cy,圆的中心会被设置为(0, 0)
- r属性定义圆的半径
3、椭圆
示例代码
1 2 3 4
| <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <ellipse cx="300" cy="80" rx="100" ry="50" style="fill:yellow;stroke:purple;stroke-width:2"/> </svg>
|
代码解析
- CX属性定义的椭圆中心的x坐标
- CY属性定义的椭圆中心的y坐标
- RX属性定义的水平半径
- RY属性定义的垂直半径
4、直线
示例代码
1 2 3 4
| <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <line x1="0" y1="0" x2="200" y2="200" style="stroke:rgb(255,0,0);stroke-width:2"/> </svg>
|
代码解析
- x1 属性在 x 轴定义线条的开始
- y1 属性在 y 轴定义线条的开始
- x2 属性在 x 轴定义线条的结束
- y2 属性在 y 轴定义线条的结束
5、曲线
示例代码
1 2 3 4
| <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <polyline points="20,20 40,25 60,40 80,120 120,140 200,180" style="fill:none;stroke:black;stroke-width:3" /> </svg>
|
代码解析
- points 属性定义多边形每个角的 x 和 y 坐标
6、多边形
示例代码
1 2 3 4
| <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <polygon points="200,10 250,190 160,210" style="fill:lime;stroke:purple;stroke-width:1"/> </svg>
|
代码解析
- points 属性定义多边形每个角的 x 和 y 坐标
7、路径
示例代码
1 2 3
| <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <path d="M150 0 L75 200 L225 200 Z" /> </svg>
|
代码解析
命令 |
名称 |
参数 |
M |
moveto 移动到 |
(x y) |
Z |
closepath 关闭路径 |
(none) |
L |
lineto 画线到 |
(x y) |
H |
horizontal lineto 水平线到 |
x |
V |
vertical lineto 垂直线到 |
y |
A |
elliptical arc椭圆弧 |
(rx ry x-axis-rotation large-arc-flag sweep-flag x y) |
C |
curveto 三次贝塞尔曲线到 |
(x1 y1 x2 y2 x y) |
S |
smooth curveto光滑三次贝塞尔曲线到 |
(x2 y2 x y) |
Q |
Bézier curveto二次贝塞尔曲线到 |
(x1 y1 x y) |
T |
smooth Bézier curveto光滑二次贝塞尔曲线到 |
(x y) |
注意:以上所有命令均允许小写字母。大写表示绝对定位,小写表示相对定位。
8、文本
示例代码
1 2 3
| <svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <text x="0" y="15" fill="red">miSunLaughing</text> </svg>
|
代码解析
- x 属性定义矩形的左侧位置(例如,x=”0” 定义矩形到浏览器窗口左侧的距离是 0px)
- y 属性定义矩形的顶端位置(例如,y=”0” 定义矩形到浏览器窗口顶端的距离是 0px)
其它
1、stroke属性
SVG提供了一个范围广泛stroke 属性。这几个属性多用来定义线条的样式。
- stroke. 线条颜色
- stroke-width 线条粗细
- stroke-linecap 线条闭合方式
- stroke-dasharray 线条虚线数值组
2、定义和分组
定义可重用部件
使用g分组,被该元素包裹的dom,可以视为一个整体,可以定义统一的样式
使用引用在defs中定义的元素,还可在use上设置fill,stroke等属性。
更多知识请点击链接
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <svg width="600" height="600" xmlns="http://www.w3.org/2000/svg"> <defs> <polygon id="lens" points="65,50 185,50 185,75, 150,100 100,100 65,75" fill="red" stroke="purple" stroke-width="4" /> <radialGradient id="irisGradient"> <stop offset="25%" stop-color="green" /> <stop offset="100%" stop-color="dodgerblue" /> </radialGradient> <g id="eye"> <ellipse cy="50" rx="50" ry="25" fill="none" stroke="black" /> <circle cy="50" r="25" /> <circle cy="50" r="10" fill="black" /> </g> </defs> <g stroke="red" stroke-width="3"> <ellipse cx="125" cy="50" rx="50" ry="25" fill="none" stroke="black" /> <circle cx="125" cy="50" r="25" fill="url(#irisGradient)" /> <circle cx="125" cy="50" r="10" fill="black" /> <use xlink:href="#eye" x="250" fill="dodgerblue" /> </g> </svg>
|
3、事件
最常用的是 onclick、onactivate、onmousedown、onmouseup、onmouseover、onmousemove、onmouseout、onload、onresize、 onunload 和 onrepeat。
示例代码
1 2 3 4 5
| // html <svg width="600" height="600" xmlns="http://www.w3.org/2000/svg"> <polygon points="60,30 90,90 30,90" onclick="alert('hello')"> </polygon> </svg>
|
总结
1、svg遵循XML文档格式,所以所以我们能给其定义css、但同时要注意其每个图形独特的属性。
2、内置图形在同一位置的时候,默认的是空间向上重叠,可用z-index来理解,后来者居上。
3、我们能用js获取SVG的DOM,并对其进行相关操作。
4、定义和分组这两个概念,入手相对较难理解,但对使用D3.js开发的时候很有帮助。定义能减少我们的工作量,提高代码复用率。分组方便我们统一管理SVG中的内置图形。
5、SVG内置图形都有自己的坐标属性,正是这些属性,我们才能对内置图形做位置变化。
6、动画,SVG有自己的动画定义,但是个人不建议使用,因为我们完全可以使用CSS的动画来实现同样的功能。
参考文章
SVG中的结构化、分组和引用
svg基本教程
svg教程
zhongwenhaomiSunLaughing