04-SVG

SVG开篇

  • SVG是可缩放的矢量图,在计算机中有两种图形,一种是位图,一种是矢量图

  • 位图

    • 传统的jpg / png / gif图都是位图

    • 位图是由一个个很小的颜色小方块组合在一起的图片,一个小方块代表1px

    • 优点:色彩丰富逼真

    • 缺点:放大后会失真,体积大

  • 矢量图

    • 矢量图是用XML格式定义,通过[路径] 和 [填充颜色]来描述渲染的图片

    • 优点:放大后不会失真,体积很小

    • 缺点:不易制作颜色变化太多的图像

  • 注意点

    • 和canvas一样,svg也有默认的宽高,并且默认的宽高和canvas都是一样的,默认的宽度是300px,默认的高度是150px

    • 和canvas不同的是,svg可以通过css设置宽高也可以通过行内属性设置宽高

SVG四种使用方法

  • 内嵌到HTML中(直接在HTML中绘制)

  • 通过浏览器直接打开SVG文件

    • 如果需要将svg保存到单独的一个文件中,并且需要通过浏览器直接打开,那么久必须给svg添加一个属性 xmlns = "http://www.w3.org/2000/svg";
  • 在HTML的img标签中引用

  • 作为CSS背景使用

SVG绘制矩形

  • 绘制矩形:rect

    • x/y: 指定绘制的位置

    • width/height: 指定绘制的大小

    • fill: 修改填充的颜色

    • stroke: 修改描边的颜色

    • stroke-width: 修改描边的宽度

    • rx/ry: 设置圆角的半径

SVG绘制圆和椭圆

  • 绘制圆:circle

    • cx/xy: 圆绘制的位置

    • r: 圆的半径

  • 绘制椭圆:ellipse

    • cx/cy: 椭圆绘制的位置(圆心的位置)

    • rx: 水平方向的半径

    • ry: 垂直方向的半径

SVG绘制直线和折线

  • 绘制直线:line

    • x1/y1: 设置起点

    • x2/y2: 设置终点

  • 绘制折线:polyline

    • points: 设置所有的点,两两一对
  • 绘制多边形:polygon

    • polygon和polyline差不多,只不过会自动关闭路径

SVG常用属性

  • fill: 修改填充颜色

  • fill-opacity: 0~1设置填充颜色的透明度

  • stroke: 修改描边颜色

  • stroke-width: 修改描边宽度

  • stroke-opacity: 0~1 设置描边透明度

  • stroke-linecap: butt/square/round 设置线段两端帽子

  • stroke-dasharray: 设置虚线

  • stroke-dashoffset: 设置虚线偏移位

  • stroke-linejoin: miter/bevel/round 设置折线转角样式

  • 注意点:在SVG中这些所有的常用属性都是可以在CSS中使用的

SVG绘制路径

  • SVG路径(path)是一个比较牛X的东西,可以绘制任意图形,只不过比较复杂而已

    • M = moveto 起点

    • L = lineto 其他点

    • H = horizontal lineto 和上一个点Y相等

    • V = vertical lineto 和上一个点X相等

    • Z = closepath 关闭当前路径

  • 路径指令注意点

    • 大写字母是绝对定位,小写字母是相对定位

    • 绝对定位: 写什么位置就是什么位置

    • 相对定位: 相对上一次的位置,在上一次位置基础上调整

SVG绘制圆弧
  • A(rx,ry,xr,laf,sf,x,y) 从当前位置绘制弧线到指定位置

    • rx(radius-x):弧线X半径

    • ry(radius-y):弧线Y半径

    • xr(xAxis-rotation):弧线所在椭圆旋转角度

    • laf(large-arc-flag):是否选择弧较长的那一段

    • sf(sweep-flag):是否顺时针绘制

    • x,y:弧的终点位置

SVG绘制贝塞尔曲线
  • Q(x1,y1,x,y) 从当前位置绘制二次贝赛尔曲线到指定位置

    • x1/y1: 控制点位置

    • x/y: 终点位置

  • C(x1,y1,x2,y2,x,y) 从当前位置绘制三次贝赛尔曲线到指定位置

    • x1/y1: 控制点1位置

    • x2/y2: 控制点2位置

    • x/y: 终点位置

SVG绘制文本

  • 和canvas一样,是以左下角作为参考

  • 和canvas一样,默认是文字的基线和指定的位置对齐

  • 绘制文本:text

    • x/y: 指定绘制位置

    • style: 设置文字样式

    • text-anchor: 指定文字水平方向对齐方式

    • dominant-baseline: 指定文字垂直方向对齐方式

    • dx/dy: 相对前一个文字位置,未设置位置的文字会继承前一个文字

    • 绘制多行文本: <text><tspan>文本内容</tspan></text>

  • 绘制路径文本:textPath

    • 定义一个路径

    • 告诉文本需要按照哪个路径来绘制(xlink:href)

    • 注意点:如果是绘制路径文本,那么超出路径范围的内容不会被绘制出来

SVG绘制超链接

  • 可以给任意内容添加超链接,只需要用超链接包裹起来即可

    • xlink:href: 指定链接地址

    • xlink:title: 指定链接提示

    • target: 指定打开方式

SVG绘制图片

  • 通过image标签

  • 默认情况下我们指定的图片多大就绘制多大

  • 当设置的尺寸和图片实际尺寸不一样时,高度填满,宽度等比拉伸

SVG结构标签

  • g结构元素

    • g是group的缩写,可以将多个元素放到一个g标记中,这样就组成了一个组

    • 以便操作统一,比如旋转,缩放或者添加相关样式等等

    • g标记设置的所有样式都会应用到这一组所有的样式中

  • use

    • g结构元素封装的图形还可以通过<use>元素进行复制使用

    • <use xlink:href="">

  • defs

    • g封装的元素默认是可见的,如果仅仅是需要定义一组模板,将来需要用到时候才显示,那么就可以使用defs
  • symbol

    • symbol兼具<g>的分组功能和<defs>初识不可见的特性

    • symbol能够创建自己的视窗,所以能够应用viewBox和preserveAspecRatio属性

SVG裁剪和蒙版

  • clipPath

    • 只有路径范围内的内容会被显示,路径范围以外的内容不会被显示
  • mask

    • mak和clipPath差不多

    • 裁切路径是可见与不可见的突变

    • 蒙版则是可见与不可见的渐变

  • 注意点: 在指定裁剪和蒙版的时候需要提供过url(#id)来指定

SVG渐变色

  • 和Canvas一样,在SVG中也可以生成渐变颜色

    • <linearGradient></linearGradient> 线性渐变

    • <radialGradient></radialGradient> 径向渐变

  • 渐变属性

    • x1/y1: 渐变范围开始位置

    • x2/y2: 渐变范围结束位置

    • 默认情况下x1/y1/x2/y2是当前元素的百分比,可以通过gradientUnits修改

    • gradientUnits = "objectBoundingBox"

    • gradientUnits = "userSpaceOnUse"

  • 注意点: 使用渐变颜色需要通过url(#id)来使用

SVG画笔

  • 在SVG中除了可以使用纯色和渐变色作为填充色以外,还可以使用自定义图形作为填充

  • Pattern属性

    • width/height默认情况下也是百分比

    • 可以通过gradientUnits修改

    • patternUnits="objectBoundingBox"

    • patternUnits="userSpaceOnUse"

viewBox

  • ViewBox就是可视区域,用户能看到的区域

  • 默认情况下,可视区域的大小和内容区域大小是一致的,但是我们也可以手动修改可视区域的大小

  • ViewBox属性格式

    • viewBox="x y width height"

    • x: 修改可视区域x方向位置

    • y: 修改可视区域y方向位置

    • width/height: 修改可视区域尺寸,近大远小

  • 默认情况下如果viewBox的尺寸是等比缩放的,那么调整后viewBox区域的xy和内容区域的xy对齐

  • 如果viewBox的尺寸不是等比缩放的,那么系统就会调整viewBox的位置,我们设置的x/y会失效

  • 如果需要viewBox的xy和内容区域的xy继续保持位置,那么就需要使用preserveAspectRatio属性来设置对齐方式

    • xMin viewport和viewBox左边对齐

    • xMid viewport和viewBox x轴中心对齐

    • xMinx viewport和viewBox右边对齐

    • YMin viewport和viewBox上边缘对齐,注意Y是大写

    • YMid viewport和viewBox y轴中心点对齐,注意Y是大写

    • YMax viewport和viewBox下边缘对齐,注意Y是大写

SVG动画

  • 在SVG中提供了三种常用动画标记

    • <animate> 基础动画

    • <animateTransform> 形变动画

    • <animateMotion> 路径动画

  • SVG动画使用方式

    • 创建动画,告诉动画标记哪个元素需要执行动画

    • 创建元素,在元素中说明需要执行什么动画

  • SVG动画属性

    • attributeType: CSS/XML 规定属性值的名称空间

    • attributeName: 规定元素的哪个属性会产生动画效果

    • from/to: 从哪到哪

    • dur: 动画时长

    • fill: 动画结束之后的状态 保持freeze结束状态/remove恢复初始状态

  • SVG动画常用属性

    • repeatCount: 规定动画重复的次数

    • repeatDur: 规定动画重复总时长

    • begin: 规定动画开始的时间

      • begin="1s"

      • begin="click"

      • begin="click + 1s"

    • restart: 规定元素开始动画之后,是否可以被重新开始执行

      • always: 动画可以再任何时候被重置,这是默认值

      • whenNotActive: 只有在动画没有被激活的时候才能被重置,例如在动画结束之后

      • never: 在整个SVG执行的过程中,元素动画不能被重置

    • calcMode: 运动速度

    • keyTimes: 划分动画时间片段,取值0~1

    • value:划分对应取值片段的值

  • 形变动画中固定的属性
    • attributeName: transform
    • type: translate/rotate/scale

SVG脚本编程

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

推荐阅读更多精彩内容