HTML5學習--SVG全攻略(進階篇)

****此篇為svg的進階介紹篇,了解更多關于svg的介紹請看 HTML5學習--SVG全攻略(基礎篇)***

**一.SVG路徑 **

(一)直線命令
 path元素里有5個畫直線的命令,顧名思義,直線命令就是在兩個點之間畫直線。首先是“Move to”命令,M,前面已經(jīng)提到過,它需要兩個參數(shù),分別是需要移動到的點的x軸和y軸的坐標。假設,你的畫筆當前位于一個點,在使用M命令移動畫筆后,只會移動畫筆,但不會在兩點之間畫線。因為M命令僅僅是移動畫筆,但不畫線。所以M命令經(jīng)常出現(xiàn)在路徑的開始處,用來指明從何處開始畫。
  為了更好地展示路徑,下面的所有例子里,在用path繪制路徑的同時,也會用circle標注路徑上的點。

<svg width="200px" height="200px" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <path d="M10 10"/>
  <!-- Points -->
  <circle cx="10" cy="10" r="2" fill="red"/>
</svg>

能夠真正畫出線的命令有三個(M命令是移動畫筆位置,但是不畫線),最常用的是“Line to”命令,L,L需要兩個參數(shù),分別是一個點的x軸和y軸坐標,L命令將會在當前位置和新位置(L前面畫筆所在的點)之間畫一條線段。

L x y (or l dx dy)

另外還有兩個簡寫命令,用來繪制平行線和垂直線。H,繪制平行線。V,繪制垂直線。這兩個命令都只帶一個參數(shù),標明在x軸或y軸移動到的位置,因為它們都只在坐標軸的一個方向上移動。

H x (or h dx)
 V y (or v dy)

最后,我們可以通過一個“閉合路徑命令”Z來簡化上面的path,Z命令會從當前點畫一條直線到路徑的起點,盡管我們不總是需要閉合路徑,但是它還是經(jīng)常被放到路徑的最后。另外,Z命令不用區(qū)分大小寫。

Z (or z)

畫一個80*80的正方形實例

運行結果.png
<path d="M10 10 H 90 V 90 H 10 Z" fill="transparent" stroke="black"/>

移動畫筆到(10,10)位置出發(fā),繪制水平線到指定的 90 位置,繪制豎直線到指定的 90 位置 ,繪制水平線到指定的 10 位置,閉合路徑(回到原點)。

(二)三次貝塞爾曲線指令 (C,S)
曲線指令一共有三組,和直線指令一樣,指令字母大寫表示坐標位置是絕對坐標,指令字母小寫表示坐標位置是相對坐標。三次貝塞爾曲線指令 (C,c,S,s)是其中的一個。

可以通過定義一個起點和終點,以及兩個控制點(一個控制起點,一個控制終點),繪制一條貝塞爾曲線。

三次貝塞爾曲線指令的格式為:

C (or c) x1,y1 x2,y2 x,y

x1,y1 是曲線起點的控制點坐標
x2,y2 是曲線終點的控制點坐標
x,y 是曲線的終點坐標

你可以將若干個貝塞爾曲線連起來,從而創(chuàng)建出一條很長的平滑曲線。通常情況下,一個點某一側的控制點是它另一側的控制點的對稱(以保持斜率不變)。這樣,你可以使用一個簡寫的貝塞爾曲線命令S,如下所示:

S x2 y2, x y (or s dx2 dy2, dx dy)

S命令可以用來創(chuàng)建與之前那些曲線一樣的貝塞爾曲線,但是,如果S命令跟在一個C命令或者另一個S命令的后面,它的第一個控制點,就會被假設成前一個控制點的對稱點。如果S命令單獨使用,前面沒有C命令或者另一個S命令,那么它的兩個控制點就會被假設為同一個點。下面是S命令的語法示例,下圖中的某個控制點用紅色標示,與它對稱的控制點用藍色標示。

運行結果.png

(三)二次貝塞爾曲線指令 (Q,T)

二次貝塞爾曲線Q,它比三次貝塞爾曲線簡單,只需要一個控制點,用來確定起點和終點的曲線斜率。因此它需要兩組參數(shù),控制點和終點坐標。

Q x1 y1, x y (or q dx1 dy1, dx dy)
image.png

 就像三次貝塞爾曲線有一個S命令,二次貝塞爾曲線有一個差不多的T命令,可以通過更簡短的參數(shù),延長二次貝塞爾曲線。

T x y (or t dx dy)

和三次貝塞爾曲線指令 S一樣,快捷命令T會通過前一個控制點,推斷出一個新的控制點。這意味著,在你的第一個控制點后面,可以只定義終點,就創(chuàng)建出一個相當復雜的曲線。需要注意的是,T命令前面必須是一個Q命令,或者是另一個T命令,才能達到這種效果。如果T單獨使用,那么控制點就會被認為和終點是同一個點,所以畫出來的將是一條直線。

<svg width="190px" height="160px" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <path d="M10 80 Q 52.5 10, 95 80 T 180 80" stroke="black" fill="transparent"/>
</svg>
運行結果.png

(四)橢圓弧線 (A)

弧形命令A是另一個創(chuàng)建SVG曲線的命令。基本上,弧形可以視為圓形或橢圓形的一部分。假設,已知橢圓形的長軸半徑和短軸半徑,另外已知兩個點(它們的距離在圓的半徑范圍內(nèi)),這時我們會發(fā)現(xiàn),有兩個路徑可以連接這兩個點。每種情況都可以生成出四種弧形。所以,為了保證創(chuàng)建的弧形唯一,A命令需要用到比較多的參數(shù):

A rx ry x-axis-rotation large-arc-flag sweep-flag x y
 a rx ry x-axis-rotation large-arc-flag sweep-flag dx dy

弧線命令:

rx - (radius-x)弧線所在橢圓的 x 半軸長
ry - (radius-y)弧線所在橢圓的 y 半軸長
xr - (xAxis-rotation)弧線所在橢圓的長軸角度
laf - (large-arc-flag)是否選擇弧長較長的那一段弧
sf - (sweep-flag)是否選擇逆時針方向的那一段弧
x, y - 弧的終點位置

image.png

 如上圖例所示,畫布上有一條對角線,中間有兩個橢圓弧被對角線切開(x radius = 30, y radius = 50)。第一個橢圓弧的x-axis-rotation(x軸旋轉(zhuǎn)角度)是0,所以弧形所在的橢圓是正置的(沒有傾斜)。在第二個橢圓弧中,x-axis-rotation設置為-45,所以這是一個旋轉(zhuǎn)了45度的橢圓,并以短軸為分割線,形成了兩個對稱的弧形。參看圖示中的第二個橢圓形。

如前所講,還有兩種可能的橢圓用來形成路徑,它們給出的四種可能的路徑中,有兩種不同的路徑。這里要講的參數(shù)是large-arc-flag(角度大小) 和sweep-flag(弧線方向),large-arc-flag決定弧線是大于還是小于180度,0表示小角度弧,1表示大角度弧。sweep-flag表示弧線的方向,0表示從起點到終點沿逆時針畫弧,1表示從起點到終點沿順時針畫弧。下面的例子展示了這四種情況。

<svg width="325px" height="325px" version="1.1" xmlns="http://www.w3.org/2000/svg">
  <path d="M80 80
           A 45 45, 0, 0, 0, 125 125
           L 125 80 Z" fill="green"/>
  <path d="M230 80
           A 45 45, 0, 1, 0, 275 125
           L 275 80 Z" fill="red"/>
  <path d="M80 230
           A 45 45, 0, 0, 1, 125 275
           L 125 230 Z" fill="purple"/>
  <path d="M230 230
           A 45 45, 0, 1, 1, 275 275
           L 275 230 Z" fill="blue"/>
</svg>
運行結果.png

**二.SVG文本 **

(一)< text > 及其屬性
 在SVG中有兩種截然不同的文本模式. 一種是寫在圖像中的文本,另一種是SVG字體。現(xiàn)在我們主要集中前者:寫在圖像中的文本。在一個SVG文檔中,元素內(nèi)部可以放任何的文字。

<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
    <text x="100" y="100" font-weight="bold" fill="red" font-size="30">Hello 簡書</text>
</svg>

運行結果.png

屬性x和屬性y性決定了文本在視口中顯示的位置。屬性text-anchor,可以有這些值:start、middle、end或inherit,允許決定從這一點開始的文本流的方向。和形狀元素類似,屬性fill可以給文本填充顏色,屬性stroke可以給文本描邊,形狀元素和文本元素都可以引用漸變或圖案, 相比較CSS2.1只能繪制簡單的彩色文字,SVG顯得更具有優(yōu)勢。

設置字體屬性
  文本的一個至關重要的部分是它顯示的字體。SVG提供了一些屬性,類似于它們的CSS同行,用來激活文本選區(qū)。下列每個屬性可以被設置為一個SVG屬性或者成為一個CSS聲明:font-family、font-style、font-weight、font-variant、font-stretch、font-size、font-size-adjust、kerning、letter-spacing、word-spacing和text-decoration。

(二)tspan
tspan元素用來標記大塊文本的子部分,它必須是一個text元素或別的tspan元素的子元素。一個典型的用法是把句子中的一個詞變成粗體紅色。

<text>
  <tspan font-weight="bold" fill="red">This is bold and red</tspan>
</text>
運行結果.png

(三)路徑文本
除了筆直地繪制一行文字以外, SVG 也可以根據(jù) < path > 元素的形狀來放置文字。 只要在textPath元素內(nèi)部放置文本,并通過其xlink:href屬性值引用< path > 元素,我們就可以讓文字塊呈現(xiàn)在< path > 元素給定的路徑上了。

使用方法:

<path id="my_path" d="M 100 200 Q 200 100 300 200 T 500 200" stroke="rgb(0,255,0)" fill="none" />
<text>
  <textPath xlink:href="#my_path">This text follows a curve.</textPath>
</text>
運行結果.png

startOffset 屬性 確定排列起始
dx, dy 屬性 切線和法線方向的偏移

(四)< a > - 超鏈接
可以添加到任意的圖形上

屬性
xlink:href 指定連接地址
xlink:title 指定連接提示
target 指定打開目標

<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
  <a xlink:href="http://www.lxweimin.com" xlink:title="打開簡書"  target="_blank">
    <text x="0" y="15" fill="red">I love 簡書</text>
  </a>
</svg>
運行結果.png

三.剪切和遮罩

(一)創(chuàng)建剪切
clip-path屬性是指定一個應用到元素上的剪切路徑。應用在SVG中 < clipPath > 元素上的屬性值可以完全運用在clip-path的屬性上。

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <clipPath id="cut-off-bottom">
      <rect x="0" y="0" width="200" height="100" />
    </clipPath>
  </defs>
 
  <circle cx="100" cy="100" r="100" clip-path="url(#cut-off-bottom)" />
</svg>
運行結果.png

在(100,100)創(chuàng)建一個圓形,半徑是100。屬性clip-path引用了一個帶單個rect元素的< clipPath >元素。它內(nèi)部的這個矩形將把畫布的上半部分涂黑。

注意:clipPath元素經(jīng)常放在一個defs元素內(nèi)。
  然而,該rect不會被繪制。它的象素數(shù)據(jù)將用來確定:圓形的哪些像素需要最終呈現(xiàn)出來。因為矩形只覆蓋了圓形的上半部分,所以下半部分將消失了(右圖示例);現(xiàn)在我們已經(jīng)有了一個半圓形,不用處理弧形路徑元素。對于這個剪切,clipPath內(nèi)部的每個路徑都會被檢查到、與它的描邊屬性一起被估值、變形。然后目標的位于clipPath內(nèi)容的結果的透明度區(qū)域的每一塊都不會呈現(xiàn)。顏色、不透明度都沒有這種效果,因為它們不能讓一部分徹底消失。

(二)遮罩
遮罩的效果最令人印象深刻的是表現(xiàn)為一個漸變。如果你想要讓一個元素淡出,你可以利用遮罩效果實現(xiàn)這一點。

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <linearGradient id="Gradient">
      <stop offset="0" stop-color="white" stop-opacity="0" />
      <stop offset="1" stop-color="white" stop-opacity="1" />
    </linearGradient>
    <mask id="Mask">
      <rect x="0" y="0" width="200" height="200" fill="url(#Gradient)"  />
    </mask>
  </defs>
 
  <rect x="0" y="0" width="200" height="200" fill="green" />
  <rect x="0" y="0" width="200" height="200" fill="red" mask="url(#Mask)" />
</svg>
運行結果.png

 你看到有一個綠色填充的矩形在底層,一個紅色填充的矩形在上層。后者有一個mask屬性指向一個mask元素。mask元素的內(nèi)容是一個單一的rect元素,它填充了一個透明到白色的漸變。作為紅色矩形繼承mark內(nèi)容的alpha值(透明度)的結果,我們看到一個從綠色到紅色漸變的輸出(右圖)。

(三)用opacity定義透明度
有一個簡單方法可以用來為整個元素設置透明度。它就是opacity屬性:

<rect x="0" y="0" width="100" height="100" opacity=".5" />

上面的矩形將繪制為半透明。還有兩個分開的屬性fill-opacity和stroke-opacity,分別用來控制填充和描邊的不透明度。注意,描邊將繪制在填充的上面。因此,如果你在元素上設置了一個描邊透明度,它同時還有填充,則填充將在描邊上透過一半,另一半背景也將出現(xiàn):

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <rect x="0" y="0" width="200" height="200" fill="blue" />
  <circle cx="100" cy="100" r="50" stroke="yellow" stroke-width="40" stroke-opacity=".5" fill="red" />
</svg>
運行結果.png
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

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