SVG绘制图形

web.jpeg

图片的认知

  • 分为:位图矢量图
  • 位图
    • 位图是有一个个小方块组合的图片,一个小方块代表1px
    • 比如:jpg,png,gif等都是位图
    • 优点:色彩逼真,缺点是:图片放大容易失真
  • 矢量图
    • 矢量图是用XML格式定义, 通过各种「路径」和「填充颜色」来描述渲染的的图片
    • 优点:放大不失真,缺点:绘制起来比较复杂

SVG 标签绘制矢量图

  • SVG英文全称为Scalable Vector Graphics,意思为可缩放的矢量图
  • 默认是有宽度(300)和高度(150)的
  • 可以通过css样式设置宽高,也可以通过行内样式设置

SVG 绘制直线

  • x1/y1设置起点
  • x2/y2设置终点
<svg>
    <line x1="100" y1="100" x2="100" y2="400" stroke="#ccc"></line>
</svg>

SVG 绘制直线折线

  • polyline
  • points:设置所有的点
<svg>
 <polyline points="100 100 300 100 300 300" stroke="#000" fill="none"></polyline>
</svg>

SVG 绘制多边形

  • polygon 的标签
<svg>
 <polygon points="100 100 300 100 300 300" stroke="red"></polygon>
</svg>

SVG 绘制矩形

  • rect
  • x/y 是秒点的位置
  • width/height 宽度和高度
  • fill:填充的颜色
  • stroke:描边颜色
  • stroke-width:描边的宽度
  • rx/ry设置圆角半径
<svg>
  <rect x="100" y="100" width="100" height="100" fill="red" stroke="blue" stroke-width="10" rx="10"></rect>
</svg>

SVG 绘制圆和椭圆

  • 根据绘制矩形的rx/ry的修改
  • 圆形
<svg>
    <rect x="100" y="100" width="100" height="100" fill="red" stroke="blue"  rx="50"></rect>
</svg>
  • circle 绘制圆
  • ellipse 绘制椭圆
<svg>
  
  
    <!--绘制圆-->
    <circle cx="100" cy="100" r="50"></circle>

    <!--绘制椭圆-->
    <ellipse cx="200" cy="200" rx="100"  ry="50"></ellipse>


</svg>

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绘制路径

  • SVG的路径
    • M = 起点
    • L = 其他点
    • H = 和上一个点Y相等
    • V = 和上一个点X相等
    • Z = 关闭当前路径
<svg>

    <!--绘制路径直线-->
  <path d="M 100 100 L 200 100" stroke="red"></path>

    <!--绘制折线-->
    <path d="M 50 50 L 300 100 L 300 300" stroke="blue" fill="none"></path>

    <!-- 关闭路径-->
    <path d="M 70 70 L 210 200 L 210 70 Z" stroke="red" fill="none"></path>

    <!---->

    <path d="M 50 250 H 200 V 70 Z" stroke="blue" fill="none"></path>

</svg>

image.png

SVG绘制圆弧

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

  • rx:圆弧X半径
  • ry:圆弧Y半径
  • xr:弧线所在的椭圆旋转的角度
  • laf:是否选择弧长较长的一段 0是较短 1是较长
  • sf:是否是顺时针 0是逆时针 1是顺时针
  • x/y: 弧的终点位置
<svg width="500" height="500">

    
    <path d="M 100 100 A 100 50 0 1 0 200 150" stroke="red" fill="none"></path>

</svg>

image.png

SVG 贝塞尔曲线

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

  • x1,y1: 控制点位置
  • x,y: 终点位置

C = curveto

  • C(x1, y1, x2, y2, x, y) 从当前位置绘制三阶贝塞尔曲线到指定位置
  • x1, y1: 控制点1位置
  • x2, y2: 控制点2位置
  • x, y: 终点位置
<svg width="500" height="500">

    <!--二阶贝塞尔-->
    <path d="M 100 300 Q 150 50 300 300" stroke="red" stroke-width="5" fill="none"></path>

    <!--三界贝塞尔-->

    <path d="M100 140 C 100 50 250 150 260 100" stroke="red" stroke-width="5" fill="none"></path>
</svg>
image.png

SVG绘制文字

svg是以做下角作为参考,默认的文字的基线和指定的位置对齐

  • text标签
    • x/y 指定绘制文字的开始位置
    • style:文字的样式
    • text-anchor: 指定文字水平方向对齐方式
    • dominant-baseline: 指定文字垂直方向对齐方式
    • dx/dy: 相对于前一个文字位置, 未设置位置的文字会继承前一个文字
<svg width="500" height="500">
    <line x1="250" y1="0" x2="250" y2="500" stroke="red" ></line>
    <line x1="0" y1="250" x2="500" y2="250" stroke="red" ></line>

    <text x="250" y="250" style="font-size: 40px;" text-anchor="start" dx="10 20">掠食龙</text>
    <!--
     text-anchor: 是以位置点 为参考
     start:文字开始的位置在 绘制点
     end:文字结束的位置在 绘制点
     middle:文字中的位置 在绘制点

    -->

</svg>
image.png

SVG绘制文字路径

  • defs定义一个 不可见的 模块区域
  • textPath 标签是 上面的文字 会根据defs里面定义的路径绘制
<svg width="500" height="500">
    <!--定义文本的绘制路径-->
    <defs>
        <path id="textPath" d="M 100 100 Q 150 50 200 100" stroke="red" fill="none"></path>

    </defs>>
    <!--绘制文字-->
    <text>
        <!--文字路劲-->
        <textPath xlink:href="#textPath">这是一个绘制的文字按照路径绘制123</textPath>
    </text>



</svg>
image.png

SVG绘制超链接

<svg width="500" height="500" >
    <a xlink:href="http://www.baidu.com" xlink:title="官网" target="_blank">
        <!--文字-->
        <text x="100" y="100">百度爷爷</text>
        <!--图形-->
        <circle cx="200" cy="200" r="50" fill="red" ></circle>

    </a>
</svg>

SVG线性渐变

  • linearGradient 线性渐变
    • x1/y1:渐变范围开始位置
    • x2/y2: 渐变范围结束位置
    • 默认情况下是按照当前元素的百分比
      不过可以通过 gradientUnits 修改
    • gradientUnits="objectBoundingBox" 默认
    • gradientUnits="userSpaceOnUse" 使用像素
<svg width="500" height="500">

    <!--百分比渐变-->
    <linearGradient id="myline" x1="0" y1="0" x2="1" y2="1" gradientUnits="objectBoundingBox">
        <stop offset="0" stop-color="red"></stop>
        <stop offset="1" stop-color="green"></stop>
    </linearGradient>

    <!--访问-->
    <rect x="100" y="100" width="300" height="100" fill="url(#myline)"></rect>


    <!--像素渐变-->

    <linearGradient id="mypx" x1="200" y1="200" x2="400" y2="200" gradientUnits="userSpaceOnUse">
        <stop offset="0" stop-color="red"></stop>
        <stop offset="1" stop-color="green"></stop>
    </linearGradient>

    <!--绘制矩形-->
    <rect x="100" y="260" width="300" height="100" fill="url(#mypx)"></rect>



</svg>
image.png

SVG绘制图片

  • xlink:href 访问图片的地址
<svg>
    <image xlink:href="images/1.gif"></image>
</svg>

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

推荐阅读更多精彩内容