SVG繪制2

路徑

  1. 什么是SVG路徑
    M = moveto 起點
    L = lineto 其它點
    H = horizontal lineto 和上一個點Y相等
    V = vertical lineto 和上一個點X相等
    Z = closepath 關(guān)閉當(dāng)前路徑
  2. 路徑指令注意點
    大寫字母是絕對定位,小寫字母是相對定位
    絕對定位:寫什么位置就是什么位置
    相對定位:相對上一次的位置,在上一次位置基礎(chǔ)上做調(diào)整
<svg width="500" height="500">
    <!--<path d="M 100 100 L 300 100 L 300 300" stroke="red" fill="none" stroke-width="10"></path>-->
    <!--<path d="M 100 100 L 300 100 L 300 300 Z" stroke="red" fill="none" stroke-width="10"></path>-->
    <!--<path d="M 100 100 H 300 V 300 Z" stroke="red" fill="none" stroke-width="10"></path>-->
    <path d="M 100 100 l 300 100" stroke="red" stroke-width="10"></path>
</svg>

繪制圓弧

  • A = elliptical Arc
  • A(rx, ry, xr, laf, sf, x, y) 從當(dāng)前位置繪制弧線到指定位置
  • rx(radius-x): 弧線X半徑
  • ry(radius-y): 弧線Y半徑
  • xr(xAxis-rotation): 弧線所在橢圓旋轉(zhuǎn)角度
  • laf(large-arc-flag): 是否選擇弧長較長的那一段
  • sf(sweep-flag): 是否順時針繪制
    x, y: 弧的終點位置
<svg width="500" height="500">
    <path d="M 100 100 A 100 50 0 0 0 200 150" stroke="red" fill="none"></path>
</svg>
起點(100, 100),終點(200, 150)孝常,rx=100丁侄,ry=50贾陷,不旋轉(zhuǎn)诵棵,較短,逆時針

貝塞爾曲線

  • Q = quadratic Bezier curve
  • Q(x1, y1, x, y)從當(dāng)前位置繪制二次貝塞爾曲線到指定位置
  • x1, y1: 控制點位置
  • x, y: 終點位置
  • C = curveto
  • C(x1, y1, x2, y2, x, y) 從當(dāng)前位置繪制三次貝塞爾曲線到指定位置
  • x1, y1: 控制點1位置
  • x2, y2: 控制點2位置
  • x, y: 終點位置
一次貝塞爾曲線
二次貝塞爾曲線
三次貝塞爾曲線
<svg width="500" height="500">
    <path d="M 100 100 Q 150 50 200 100" stroke="red" fill="none"></path>
    <path d="M 100 200 C 100 150 200 150 200 200" stroke="red" fill="none"></path>
</svg>

SVG繪制文本

和canvas一樣概说,是以左下角為參考
和canvas一樣,默認(rèn)是文字的基線和指定的位置對齊

  • x/y: 起始點嚣伐,與對齊方式有關(guān)
  • style="font-size: 40px" 設(shè)置字體大小
  • fill 字體填充顏色
  • stroke 字體描邊顏色
  • text-anchor 水平對齊方式 start/end/middle
  • dominant-baseline 垂直對齊方式 after-edge/before-edge/middle
  • dx 當(dāng)前文字距離上一文字的間隙
  • dy 當(dāng)前文字在垂直方向上的偏移
  • 多行文字
<text fill="red">//可以統(tǒng)一設(shè)置
    <tspan x="100" y="100">hello</tspan>
    <tspan x="100" y="150">world</tspan>
</text>

繪制路徑文本

  1. 定義一個路徑
  2. 告訴文本需要按照哪個路徑來繪制
  3. 注意點:如果是繪制路徑文本糖赔,那么超出路徑范圍的內(nèi)容不會被繪制出來
<svg width="500" height="500">
    <!--定義一個路徑-->
    <defs>
        <path id="myPath" d="M 100 100 Q 150 50 200 100" stroke="red" fill="none"></path>
    </defs>
    <!--xlink:href給文本指定路徑-->
    <text>
        <textPath xlink:href="#myPath">David Rao</textPath>
    </text>
</svg>

SVG繪制超鏈接

可以給任意內(nèi)容添加超鏈接,只需要用超鏈接包裹即可

  • xlink:href: 指定鏈接地址
  • xlink:title: 指定鏈接顯示
  • target: 指定打開方式
<svg width="500" height="500">
    <a xlink: xlink:title="百度" target="_blank">

        <circle cx="50" cy="50" r="50" fill="red"></circle>
        <text x="100" y="100">David Rao</text>
    </a>
</svg>

SVG繪制圖片

  • 默認(rèn)情況下我們的指定的圖片多大就繪制多大
  • 當(dāng)設(shè)置的尺寸和圖片實際尺寸不一樣時轩端,高度填滿放典,寬度等比拉伸
  • width/height 寬高
  • x/y 位置
<svg width="500" height="500">
    <image xlink:href="alien.png" width="300" height="300" x="100" y="100"></image>
</svg>

SVG結(jié)構(gòu)標(biāo)簽

  1. g結(jié)構(gòu)元素
    g是group的縮寫,可以將多個元素放到一個g標(biāo)記中基茵,這樣就組成了一個組奋构,以便統(tǒng)一操作,比如旋轉(zhuǎn)拱层,縮放或者添加相關(guān)樣式等
  2. use
    g結(jié)構(gòu)元素封裝的圖形還可以通過<use>元素進行復(fù)制使用<use xlink:href="">
  3. defs
    g封裝的元素默認(rèn)是可見的弥臼,如果僅僅是需要定義一組模板,將來需要用的時候才顯示根灯,可以使用哦個defs
  4. symbol
  • symbol兼具<g>的分組功能和<defs>初始不可見的特性
  • symbol能夠創(chuàng)建自己的視窗径缅,所以能夠應(yīng)用viewBox和preserveAspectRatio屬性
<svg width="500" height="500">
    <defs>
        <g id="myGroup" fill="red">
            <circle cx="100" cy="100" r="100"></circle>
            <circle cx="100" cy="200" r="50"></circle>
            <circle cx="100" cy="300" r="30"></circle>
        </g>
    </defs>
    <use xlink:href="#myGroup" x="300"></use>
</svg>

SVG裁剪和蒙版

  1. clipPath
    只有路徑范圍內(nèi)的內(nèi)容會被顯示,路徑范圍外的內(nèi)容不會被顯示
  2. mask
    mask和clipPath差不多
    2.1 裁剪路徑是可見于不可見的突變
    2.2 蒙版則是可見與不可見的漸變
  • 裁剪clip-path="url(#id)"
  • 蒙版mask="url(#id)"
// 裁剪
<svg width="500" height="500">
    <clipPath id="myClip">
        <circle cx="200" cy="200" r="100" fill="red"></circle>
    </clipPath>
    <rect x="100" y="100" width="300" height="200" fill="blue" clip-path="url(#myClip)"></rect>
</svg>
// 蒙版
<svg width="500" height="500">
    <mask id="myMask">
        <circle cx="200" cy="200" r="100" fill="red"></circle>
    </mask>
    <rect x="100" y="100" width="300" height="200" fill="blue" mask="url(#myMask)"></rect>
</svg>

SVG漸變色

  1. 線性漸變和徑向漸變
    和canvas一樣箱吕,在SVG中也可以生成漸變顏色
    <linearGradient></linearGradient> 線性漸變
    <radialGradient></radialGradient> 徑向漸變

  2. 漸變屬性
    x1/y1: 漸變范圍開始位置
    x2/y2: 漸變范圍結(jié)束位置
    fill="url(#id)"

  3. 注意點
    默認(rèn)情況下x1/y1/x2/y2是當(dāng)前元素的百分比
    可以通過gradientUnits修改

  • gradientUnits = "objectBoundingBox" // 百分比
  • gradientUnits = "userSpaceOnUse" // 像素

使用漸變顏色需要通過url(#id)格式來使用

<svg width="500" height="500">
    <defs>
        <linearGradient id="myColor" x1="0" y1="0" x2="1" y2="1" gradientUnits="objectBoundingBox">
            <stop offset="0" stop-color="red"></stop>
            <stop offset="1" stop-color="blue"></stop>
        </linearGradient>
    </defs>
    <rect x="100" y="100" width="300" height="200" fill="url(#myColor)"></rect>
</svg>

SVG畫筆

  1. Pattern(畫筆)
    在SVG中除了可hi使用純色和漸變色作為填充色外芥驳,還可以使用自定義圖形作為填充

  2. Pattern屬性
    width/height默認(rèn)情況下也是百分比
    可以通過gradientUnits修改

  • gradientUnits = "objectBoundingBox" // 百分比
  • gradientUnits = "userSpaceOnUse" // 像素

使用畫筆需要通過url(#id)格式來使用

<svg width="500" height="500">
    <defs>
        <pattern id="myPattern" width="0.2" height="0.2" gradientUnits = "objectBoundingBox">
            <circle cx="10" cy="10" r="10" fill="red"></circle>
        </pattern>
    </defs>
    <rect x="100" y="100" width="300" height="200" fill="url(#myPattern)"></rect>
</svg>

SVG形變

和canvas一樣,改變的是坐標(biāo)系

  • transform="translate(100, 0)" 平移
  • transform="scale(0.5, 1)" 縮放
  • transform="rotate(15)" 旋轉(zhuǎn)
<svg width="500" height="500">
    <rect x="100" y="100" width="200" height="100" fill="blue" transform="rotate(15) translate(50, 0) scale(1.5, 1.5)"></rect>
</svg>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茬高,一起剝皮案震驚了整個濱河市兆旬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怎栽,老刑警劉巖丽猬,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熏瞄,居然都是意外死亡脚祟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門强饮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來由桌,“玉大人,你說我怎么就攤上這事⌒心” “怎么了铭乾?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長娃循。 經(jīng)常有香客問我炕檩,道長,這世上最難降的妖魔是什么捌斧? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任笛质,我火速辦了婚禮,結(jié)果婚禮上捞蚂,老公的妹妹穿的比我還像新娘妇押。我一直安慰自己,他們只是感情好姓迅,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布舆吮。 她就那樣靜靜地躺著,像睡著了一般队贱。 火紅的嫁衣襯著肌膚如雪色冀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天柱嫌,我揣著相機與錄音锋恬,去河邊找鬼。 笑死编丘,一個胖子當(dāng)著我的面吹牛与学,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘉抓,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼索守,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抑片?” 一聲冷哼從身側(cè)響起卵佛,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敞斋,沒想到半個月后截汪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡植捎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年衙解,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焰枢。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚓峦,死狀恐怖舌剂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暑椰,我是刑警寧澤架诞,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站干茉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏很泊。R本人自食惡果不足惜角虫,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望委造。 院中可真熱鬧戳鹅,春花似錦、人聲如沸昏兆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爬虱。三九已至隶债,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跑筝,已是汗流浹背死讹。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留曲梗,地道東北人赞警。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像虏两,于是被迫代替她去往敵國和親愧旦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容