SVG學(xué)習(xí)(一)

概念:

SVG 是一種基于 XML 語法的圖像格式倒得,全稱是可縮放矢量圖(Scalable Vector Graphics)泻红。其他圖像格式都是基于像素處理的,SVG 則是屬于對(duì)圖像的形狀描述霞掺,所以它本質(zhì)上是文本文件谊路,體積較小,且不管放大多少倍都不會(huì)失真菩彬。SVG嚴(yán)格遵從XML語法缠劝,并用文本格式的描述性語言來描述圖像內(nèi)容。

注: 矢量圖位圖的區(qū)別
矢量圖也稱為面向?qū)ο蟮膱D像或繪圖圖像骗灶,繁體版本上稱之為向量圖惨恭,是計(jì)算機(jī)圖形學(xué)中用點(diǎn)、直線或者多邊形等基于數(shù)學(xué)方程的幾何圖元表示圖像耙旦。矢量圖形最大的優(yōu)點(diǎn)是無論放大脱羡、縮小或旋轉(zhuǎn)等不會(huì)失真;最大的缺點(diǎn)是難以表現(xiàn)色彩層次豐富的逼真圖像效果。

位圖亦稱為點(diǎn)陣圖像或柵格圖像锉罐,是由稱作像素(圖片元素)的單個(gè)點(diǎn)組成的帆竹。這些點(diǎn)可以進(jìn)行不同的排列和染色以構(gòu)成圖樣。當(dāng)放大位圖時(shí)脓规,可以看見賴以構(gòu)成整個(gè)圖像的無數(shù)單個(gè)方塊栽连。文件類型有.bmp、.pcx侨舆、.gif秒紧、.jpg、*.tif等

區(qū)別:
1挨下、位圖表現(xiàn)的色彩比較豐富熔恢,可以表現(xiàn)出色彩豐富的圖象。而矢量圖形色彩不豐富臭笆,無法表現(xiàn)逼真的實(shí)物绩聘,矢量圖常常用來表示標(biāo)識(shí)、圖標(biāo)耗啦、Logo等簡單直接的圖像。
2机杜、文件大兄慕病: 由于位圖表現(xiàn)的色彩比較豐富,所以占用的空間會(huì)很大椒拗,顏色信息越多似将,占用空間越大,圖像越清晰蚀苛,占用空間越大在验;由于矢量圖形表現(xiàn)的圖像顏色比較單一,所以所占用的空間會(huì)很小堵未。(不是對(duì)比同一文件的大小)
3腋舌、最大的區(qū)別,矢量圖形與分辨率無關(guān)渗蟹,可以將它縮放到任意大小和以任意分辨率在輸出設(shè)備上打印出來块饺,都不會(huì)影響清晰度,而位圖是由一個(gè)一個(gè)像素點(diǎn)產(chǎn)生雌芽,當(dāng)放大圖像時(shí)授艰,像素點(diǎn)也放大了,但每個(gè)像素點(diǎn)表示的顏色是單一的世落,所以在位圖放大后就會(huì)出現(xiàn)平時(shí)所見到的馬賽克狀淮腾。

對(duì)比圖:

WechatIMG260.png

1. 呈現(xiàn)方式

  • SVG 文件可以內(nèi)嵌到網(wǎng)頁中,成為 DOM 的一部分

      <html>
      <head></head>
      <body>
      <svg id="mysvg"
          xmlns="http://www.w3.org/2000/svg"
          version="1.1"
          viewBox="0 0 800 600"
          preserveAspectRatio="xMidYMid meet">
          <circle id="mycircle" cx="400" cy="300" r="50"  />
      </svg>
      </body>
      </html>
    
  • 獨(dú)立SVG文件
    把文本文件保存成以svg為擴(kuò)展名的文件,例如sun.svg谷朝,這樣的文件可以直接用瀏覽器打開瀏覽洲押,或者用<img>、<object>徘禁、<embed>诅诱、<iframe>等標(biāo)簽插入網(wǎng)頁。

    <img src="./img/circle.svg">
    

    或者

    .icon {
         background: url("./img/circle.svg");
     }
    

2. 文檔元素介紹

  • svg標(biāo)簽
    svg 代碼都放在頂層標(biāo)簽<svg>之中
    viewBox屬性的值有四個(gè)數(shù)字送朱,分別是左上角的橫坐標(biāo)和縱坐標(biāo)娘荡、視口的寬度和高度
    width屬性和height屬性: em,ex,px,pt,pc,cm,mm等長度還可以使用"%"
    svg圖像默認(rèn)大小是300像素(寬) x 150像素(高)。
      <svg width="300" height="100">   
        <circle cx="100" cy="100" r="50" style="stroke: black; fill: red;"/>
      </svg>
    
    注:請(qǐng)注意開頭的部分xml聲明驶沼,與svg的命名空間xmlns炮沐、版本version等部分,主要是考慮兼容性的問題回怜;這些部分在HTML5中基本都可以不用寫了大年。

(一)基本圖形元素

  • 圓 circle
    fill: 填充色
    stroke: 描邊色
    stroke-width:邊框粗細(xì)
    stroke-linecap: 在開放子路徑被設(shè)置描邊的情況下,用于開放自路徑兩端的形狀
    stroke-dasharray: 創(chuàng)建虛線

    <circle cx="50" cy="50" r="50" fill="red" stroke="rgb(0,0,0)" stroke-width="3" />
    
  • 橢圓 ellipse

    <ellipse cx="60" cy="60" ry="40" rx="20" stroke="black" stroke-width="5" fill="silver"/>
    
  • 直線 line

    <line x1="0" y1="0" x2="200" y2="0" style="stroke:rgb(0,0,0);stroke-width:5" />
    
  • 折線 polyline

     <polyline points="3,3 30,28 3,53"  fill="none" stroke="black" />
    
  • 矩形 rect

    <rect x="0" y="0" height="100" width="200" style="stroke: #70d5dd; fill: #dd524b" />
    
  • 多邊形 polygon

    <polygon fill="green" stroke="orange" stroke-width="1" points="830,130 900,130 900,200 830,200 850,150"/>
    
  • 路徑 path 是最通用玉雾,最強(qiáng)力的元素了翔试;使用這個(gè)元素你可以實(shí)現(xiàn)任何其他的圖形,不僅包括上面這些基本形狀复旬,也可以實(shí)現(xiàn)像貝塞爾曲線那樣的復(fù)雜形狀垦缅。這個(gè)元素控制位置和形狀的只有一個(gè)參數(shù)d。
    d:一系列繪制指令和繪制參數(shù)(點(diǎn))組合成驹碍。繪制指令分為絕對(duì)坐標(biāo)指令和相對(duì)坐標(biāo)指令兩種壁涎,這兩種指令使用的字母是一樣的,就是大小寫不一樣志秃,絕對(duì)指令使用大寫字母怔球,坐標(biāo)也是絕對(duì)坐標(biāo);相對(duì)指令使用對(duì)應(yīng)的小寫字母浮还,點(diǎn)的坐標(biāo)表示的都是偏移量竟坛。
    M:移動(dòng)到(moveto)將畫筆移動(dòng)到點(diǎn)(x,y)
    L:畫直線到(lineto) 畫筆從當(dāng)前的點(diǎn)繪制線段到點(diǎn)(x,y)
    H: 畫筆從當(dāng)前的點(diǎn)繪制水平線段到點(diǎn)(x,y0)
    V: 畫筆從當(dāng)前的點(diǎn)繪制豎直線段到點(diǎn)(x0,y)
    A: 畫筆從當(dāng)前的點(diǎn)繪制一段圓弧到點(diǎn)(x,y)
    C: 參數(shù): x1 y1, x2 y2, x y 畫筆從當(dāng)前的點(diǎn)繪制一段三次貝塞爾曲線到點(diǎn)(x,y)
    S: 參數(shù): x2 y2, x y 特殊版本的三次貝塞爾曲線(省略第一個(gè)控制點(diǎn))
    Q: 參數(shù): x1 y1, x y 繪制二次貝塞爾曲線到點(diǎn)(x,y)
    T: 參數(shù): x1 y1, x y 繪制二次貝塞爾曲線到點(diǎn)(x,y)
    Z:閉合路徑

    <path d="
      M 18,3
      L 46,3
      L 46,40
      L 61,40
      L 32,68
      L 3,40
      L 18,40
      Z
    "></path>
    

    備注: 貝塞爾曲線是概念?可以去看看相關(guān)文章碑定,本質(zhì)是給定幾個(gè)點(diǎn)(一般是4個(gè))可以畫出一條曲線流码。

  • 文本 text

    <text x="50" y="25">Hello World</text>
    

(二)解釋性元素 desc元素與title元素
這兩個(gè)元素都是輔助性的元素,用于解釋相關(guān)情境延刘;它們的內(nèi)容都是文本漫试。當(dāng)SVG文檔被渲染的時(shí)候,這2個(gè)元素不會(huì)被渲染到圖形中碘赖。這個(gè)2個(gè)元素之間差別不是太大驾荣,title在有些實(shí)現(xiàn)中是作為提示信息出現(xiàn)的外构,所以通常title是放到父元素的第一個(gè)位置上。

(三)結(jié)構(gòu)元素

  • 組合 g元素
    g元素是一種容器播掷,它組合一組相關(guān)的圖形元素成為一個(gè)整體审编。這樣,我們就可以對(duì)這個(gè)整體進(jìn)行操作歧匈。這個(gè)元素通忱莩辏可以和desc和title元素配合使用,提供文檔的結(jié)構(gòu)信息件炉。結(jié)構(gòu)良好的文檔通晨本浚可讀性和渲染效率都不錯(cuò)。

     <svg width="300" height="100">  
       <g id="group">
          <g id="myCircle1" fill="#53a600">
             <text x="25" y="20">圓形</text>
             <circle cx="50" cy="50" r="20"/>
           </g>
           <g id="myCircle2" fill="#ccc">
              <text x="25" y="20">圓形</text>
              <circle cx="50" cy="50" r="20"/>
           </g>
       </g>
     </svg>
    

注: g元素是可以嵌套, 組合起來的圖形元素就和單個(gè)的元素一樣斟冕,可以給id值口糕,這樣,需要的時(shí)候(例如動(dòng)畫和重用一組元素)只用引用這個(gè)id值就可以了磕蛇, 組合一組圖形元素可以統(tǒng)一設(shè)置這組元素的相關(guān)屬性(fill,stroke,transform等)景描。

  • 模板 symbol元素
    symbol元素用于定義圖形模板(模板可以包含很多圖形),這個(gè)模板可以被use元素實(shí)例化秀撇。模板的功能與g元素很相似超棺,都是提供一組圖形對(duì)象,但是也有一些區(qū)別呵燕。與g元素不同的地方是:
      1.symbol元素本身是不會(huì)被渲染的说搅,只有symbol模板的實(shí)例會(huì)被渲染。
      2.symbol元素可以擁有屬性viewBox和preserveAspectRatio虏等,這些允許symbol縮放圖形元素。
    <svg xmlns="http://www.w3.org/2000/svg"
       version="1.1" width="5cm" height="5cm">
      <desc>One group of two rectangles</desc>
      <symbol id="group1" fill="red">
        <rect x="10" y="10" width="100" height="60"/>
        <rect x="120" y="10" width="50" height="50"/>
       </symbol>
      <use href="#group1">
    </svg>
    
  • 定義 defs元素
    SVG允許定義一組對(duì)象适肠,然后重用這組對(duì)象(注意霍衫,不僅僅是圖形對(duì)象)。最常見的例子如定義漸變色侯养,然后再其他的圖形對(duì)象中賦給fill屬性敦跌。漸變色定義的時(shí)候是不會(huì)渲染的,所以這類型的對(duì)象可以放到任何地方逛揩。重用對(duì)于圖形對(duì)象中也是經(jīng)常存在的柠傍,而且我們也不希望定義的時(shí)候直接渲染,而是想在引用的地方渲染辩稽,這個(gè)可以用defs元素實(shí)現(xiàn)
    定義漸變色:
    <svg width="100" height="200">
      <defs>
        <linearGradient id="Gradient01">
          <stop offset="20%" stop-color="#39F" />
          <stop offset="90%" stop-color="#F3F" />
        </linearGradient>
      </defs>
      <rect x="1cm" y="1cm" width="6cm" height="1cm" fill="url(#Gradient01)"  />
    </svg>
    
    圖形:
    <svg width="100" height="200">
       <defs>
           <rect id="MyRect" width="60" height="10"/>
        </defs>
        <use x="20" y="10" href="#MyRect" />
    </svg>
    

注意區(qū)別:其實(shí)作為容器對(duì)象的g元素惧笛、symbol元素、defs元素都不同程度上提供了重用的作用逞泄,只不過每個(gè)元素的特性可能少許不同:比如g元素是直接渲染的患整,symbol和defs不會(huì)直接渲染拜效,symbol含有viewBox屬性,會(huì)創(chuàng)建新的視窗各谚。

  • use 復(fù)制一個(gè)形狀
    href屬性指定所要復(fù)制的節(jié)點(diǎn)紧憾,x屬性和y屬性是<use>左上角的坐標(biāo)(在原圖基礎(chǔ)上的平移距離)。另外昌渤,還可以指定width和height坐標(biāo)赴穗。
    <svg width="100" height="100">
      <circle id="myCircle" cx="5" cy="5" r="4"/>
      <use href="#myCircle" x="10" y="0" fill="blue" />
      <use href="#myCircle" x="20" y="0" fill="white" stroke="blue" />
    </svg>
    

漸變?cè)亍㈥幱鞍蛳ⅰ?dòng)畫等其他元素見下章

3般眉、渲染順序
SVG是嚴(yán)格按照定義元素的順序來渲染的,這個(gè)與HTML靠z-index值來控制分層不一樣履婉。在SVG中煤篙,寫在前面的元素先被渲染,寫在后面的元素后被渲染毁腿。后渲染的元素會(huì)覆蓋前面的元素辑奈,雖然有時(shí)候受透明度影響,看起來不是被覆蓋的已烤,但是SVG確實(shí)是嚴(yán)格按照先后順序來渲染的鸠窗。

To be continued...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胯究,隨后出現(xiàn)的幾起案子稍计,更是在濱河造成了極大的恐慌,老刑警劉巖裕循,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臣嚣,死亡現(xiàn)場離奇詭異,居然都是意外死亡剥哑,警方通過查閱死者的電腦和手機(jī)硅则,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來株婴,“玉大人怎虫,你說我怎么就攤上這事±Ы椋” “怎么了大审?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長座哩。 經(jīng)常有香客問我徒扶,道長,這世上最難降的妖魔是什么根穷? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任酷愧,我火速辦了婚禮驾诈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溶浴。我一直安慰自己乍迄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布士败。 她就那樣靜靜地躺著闯两,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谅将。 梳的紋絲不亂的頭發(fā)上漾狼,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音饥臂,去河邊找鬼逊躁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛隅熙,可吹牛的內(nèi)容都是我干的稽煤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼囚戚,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼酵熙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驰坊,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤匾二,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拳芙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體察藐,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年舟扎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了转培。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浆竭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惨寿,到底是詐尸還是另有隱情邦泄,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布裂垦,位于F島的核電站顺囊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蕉拢。R本人自食惡果不足惜特碳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一诚亚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧午乓,春花似錦站宗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒸其,卻和暖如春敏释,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摸袁。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工钥顽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人靠汁。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓蜂大,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膀曾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子县爬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354