<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                &emsp;&emsp;\<svg>是矢量圖的根元素,通過xmlns屬性聲明命名空間,從而告訴用戶代理標記名稱屬于哪個XML方言。在下面的示例中,為\<svg>元素聲明了寬度和高度(默認以像素為單位),其子元素\<title>可作為提示,在\<desc>中可聲明一段描述性純文本,這兩個元素都不會在頁面中呈現。而\<rect>是一個矩形,將被繪制到頁面中。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100"> <title>SVG example</title> <desc>SVG contains a rectangle</desc> <rect width="50" height="50" fill="#F60" /> </svg> ~~~ &emsp;&emsp;SVG作為一種圖像格式,可以包含在\<img>元素內(如下所示)或CSS樣式中(例如background-image屬性)。 ~~~html <img src="demo.svg" /> ~~~ ## 一、坐標系統 **1)視口** &emsp;&emsp;在SVG中,有一張無限大的畫布,而畫布區域被稱為視口(viewport)。通過\<svg>元素的width和height兩個屬性可定義視口的尺寸,視口的原點在其左上角。 &emsp;&emsp;而在視口中,還包含一個坐標系統,由viewBox屬性控制。它能包含四個數值(以逗號或空格分隔),分別是用戶坐標系統的最小橫坐標(x軸)和縱坐標(y軸),以及寬和高。 &emsp;&emsp;下面的兩個\<svg>元素,第一個采用了默認的坐標系統,第二個聲明了新的坐標系統,并且寬高比相同,如圖1所示,第二個矩形縮小了。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100"> <rect width="50" height="50" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/57/bb/57bbf5b7a705482a3a85b59ad197db2f_624x210.png =400x) 圖 1 &emsp;&emsp;接下來修改兩個最小坐標(如圖2所示),第一個\<svg>元素聲明的最小坐標為(20,20),雖然矩形的坐標是(0,0),但是比最小坐標要小,所以就會往左上角偏移;第二個\<svg>元素聲明了負數坐標,與前一個正好相反;在第三個\<svg>元素中,修改了矩形的坐標,正好在左上角。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="20 20 300 200"> <rect width="50" height="50" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="-20 -20 300 200"> <rect width="50" height="50" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="20 20 300 200"> <rect width="50" height="50" fill="#F60" x="20" y="20" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/18/6a/186ac93b93efdd583e54673eec15748c_938x210.png =600x) 圖 2 **2)preserveAspectRatio屬性** &emsp;&emsp;當viewBox屬性中聲明的尺寸與視圖的寬高比不一致時,可以使用preserveAspectRatio屬性指定圖形的縮放比例和對齊方式,語法如下,默認值是“xMidYMid meet”。 ~~~html preserveAspectRatio: <align> [<meetOrSlice>] ~~~ &emsp;&emsp;其中\<align>的屬性值由兩個軸(x和y)以及三個位置(min、mid和max)組合而成,如表1所列。 :-: 表 1 ![](https://img.kancloud.cn/23/02/230268270199434b71e3be9164fa9e05_611x516.png =400x) &emsp;&emsp;在下面的示例中,由于三個\<svg>元素寬高比是3:2,而viewBox的寬高比是3:1,因此矩形會等比縮小。對它們分別應用xMinYMin、xMidYMid和xMinYMax,效果如圖3所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 100" preserveAspectRatio="xMinYMin"> <rect width="50" height="50" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 100" preserveAspectRatio="xMidYMid"> <rect width="50" height="50" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 100" preserveAspectRatio="xMinYMax"> <rect width="50" height="50" fill="#F60" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/b7/69/b769e00c8316e827f685d4a91daa0ace_938x210.png =600x) 圖 3 &emsp;&emsp;注意,因為寬度正好適配,所以對于x軸的對齊方式,效果都是相同的。 &emsp;&emsp;\<meetOrSlice>可控制圖形的適配或裁剪,可選的值如表2所列。 :-: 表 2 ![](https://img.kancloud.cn/6b/26/6b2674d0580a3628909d0fab40179a61_816x228.png =500x) &emsp;&emsp;在下面的示例中,兩個矩形的高度比視口要大,對它們分別應用meet和slice,效果如圖4所示,第二個矩形將整個視口給填滿了。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 100" preserveAspectRatio="xMinYMin meet"> <rect width="150" height="150" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 100" preserveAspectRatio="xMinYMin slice"> <rect width="150" height="150" fill="#F60" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/64/20/64205cbbed41a94201e73d56d383e2f9_623x210.png =400x) 圖 4 ## 二、形狀 &emsp;&emsp;SVG的基本形狀包括線段(line)、矩形(rect)、圓形(circle)、橢圓(ellipse)、多邊形(polygon)和折線(polyline)。 **1)\<line>**   線段元素需要指定起止點的坐標,如下所示,效果如圖5所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <line x1="20" y1="100" x2="100" y2="20" stroke="black" stroke-width="2"/> </svg> ~~~ :-: ![](https://img.kancloud.cn/6a/9f/6a9f0fa4f1197b2953c789e4fb51e4ec_310x210.png =200x) 圖 5 &emsp;&emsp;其中stroke和stroke-width是筆畫屬性,可指定筆畫的顏色和寬度,相關屬性如表3所列,部分屬性的效果如圖6所示。 :-: 表 3 ![](https://img.kancloud.cn/5d/f0/5df0ac1b4b846a08bec38c2573193c1c_1274x658.png =600x) :-: ![](https://img.kancloud.cn/ac/53/ac53503dc2ae3d16f85ceebe04d2ecbc_1550x263.png =800x) 圖 6 **2)\<rect>** &emsp;&emsp;除了直角矩形之外,還可以聲明圓角矩形,如下所示,效果如圖7所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect x="10" y="10" width="100" height="100" rx="15" ry="15" fill="#F60"/> </svg> ~~~ :-: ![](https://img.kancloud.cn/99/54/995444681a072bfbbbebf84425ece405_315x210.png =200x) 圖 7 **3)\<circle>和\<ellipse>** &emsp;&emsp;利用圓形,可非常便捷的畫出圓環,效果如圖8所示。將\<circle>元素的stroke-dasharray聲明為圓的周長(2πR),例如半徑為50,周長就是314。如果為stroke-dashoffset屬性定義一個值,就能得到圓環缺失一段的效果,從而就能模擬出圓環型的進度條了。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <circle cx="100" cy="100" r="50" stroke="black" stroke-width="2" stroke-dasharray="314" stroke-dashoffset="40" fill="transparent" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/9b/3b/9b3ba9ad5ffd6b921682bda01ee90450_311x210.png =200x) 圖 8 &emsp;&emsp;橢圓和圓形類似,只是需要聲明兩個方向的半徑,如圖9所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <ellipse cx="100" cy="100" rx="100" ry="50" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/34/a4/34a4e3fed9cdcdb35694ab268402e022_312x210.png =200x) 圖 9 **4)\<polygon>** &emsp;&emsp;\<polygon>可畫出任意形狀的封閉圖形,例如平行四邊形、梯形等。在points屬性中,可聲明各個點的坐標,每組坐標用逗號隔開,下面繪制了一個五角星,如圖10所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <polygon points="100,0 160,180 10,60 190,60 40,180" fill="#F60"/> </svg> ~~~ :-: ![](https://img.kancloud.cn/a5/80/a580870c4669903ee8a9dda219749312_314x210.png =200x) 圖 10 **5)\<polyline>** &emsp;&emsp;折線不需要閉合,與\<polygon>元素類似,也是由points屬性繪制,如下所示,得到的折線如圖11所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <polyline points="20,100 40,60 70,80 100,20" fill="none" stroke="black" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/a4/f8/a4f86eb2dfa5e6b1b090ae185f62d884_311x210.png =200x) 圖 11 **6)\<path>** &emsp;&emsp;上述基本形狀都可以由\<path>元素來繪制,并且通過\<path>元素還可繪制出不規則的圖形,例如心形,如下所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <path d="M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z" /> </svg> ~~~ &emsp;&emsp;其中d屬性可聲明一系列路徑,包含多個指令,如表4所列。 :-: 表 4 ![](https://img.kancloud.cn/83/34/833474f26dd87890294346c0a4284591_565x804.png =300x) ## 三、文檔結構 **1)內部樣式** &emsp;&emsp;SVG允許在其內部嵌入\<style>元素,如下所示,其中CDATA區段中的文本會被解析器忽略,但不影響渲染。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <style> <![CDATA[ line { stroke: black; stroke-width: 2; } ]]> </style> <line x1="20" y1="100" x2="100" y2="20" /> </svg> ~~~ **2)\<g>** &emsp;&emsp;\<g>元素相當于一個容器,能將其所有的子元素組合在一起。應用于\<g>元素中的屬性會被其子元素所繼承,如下所示,兩個圓的筆畫顏色都是綠色,而寬度都是10,如圖12所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <g id="ring" fill="white" stroke="green" stroke-width="10"> <circle cx="80" cy="80" r="50" /> <circle cx="120" cy="120" r="50" /> </g> </svg> ~~~ :-: ![](https://img.kancloud.cn/68/4b/684b782bd2dabe7eaeed32c856f2d9af_310x210.png =200x) 圖 12 **3)\<use>** &emsp;&emsp;\<use>元素可引用其它圖形,以及\<g>元素,類似于復制黏貼的功能。在下面的示例中,通過\<use>元素的xlink:href屬性引用了id為ring的\<g>元素,并且將\<use>元素上聲明的屬性傳給了\<circle>元素。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <g id="ring"> <circle cx="80" cy="80" r="50" /> <circle cx="120" cy="120" r="50" /> </g> <use x="100" y="0" fill="white" stroke="green" stroke-width="10" xlink:href="#ring" /> </svg> ~~~ &emsp;&emsp;注意,當給\<use>元素定義坐標后,\<circle>元素會與其相加計算出最終的坐標,如圖13所示。 :-: ![](https://img.kancloud.cn/f1/7b/f17bc474ad1c46c1d86265c276c467f0_310x210.png =200x) 圖 13 **4)\<defs>** &emsp;&emsp;可將需要復用的圖形抽象到\<defs>元素中,在其內部定義的圖形不會直接呈現到頁面中。在上面那個示例的基礎上,將\<g>元素整個放置到\<defs>中,效果如圖14所示,沒有渲染\<g>元素中的圓。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <defs> <g id="ring"> <circle cx="80" cy="80" r="50" /> <circle cx="120" cy="120" r="50" /> </g> </defs> <use x="100" y="0" fill="white" stroke="green" stroke-width="10" xlink:href="#ring" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/d7/c9/d7c9934ef461febf63752801eba4fd99_310x210.png =200x) 圖 14 **5)\<symbol>** &emsp;&emsp;\<symbol>提供了另一種組合圖形的方式,但與\<g>元素不同,它的圖形不會呈現,并且它可以聲明viewBox和preserveAspectRatio兩個屬性,如下所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100"> <symbol id="ring" viewBox="0 0 300 200"> <circle cx="80" cy="80" r="50" /> <circle cx="120" cy="120" r="50" /> </symbol> <use fill="white" stroke="green" stroke-width="10" xlink:href="#ring" /> </svg> ~~~ **6)\<image>** &emsp;&emsp;\<use>元素可以引用SVG文件的某個部分,而\<image>元素可以引用整個SVG文件或柵格圖像(如下所示),并且能控制引用文件的尺寸和preserveAspectRatio屬性,效果如圖15所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <image xlink:href="img/avatar.png" width="150" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/b4/3f/b43fb07a935c87474eff98b1db2f00aa_310x210.png =200x) 圖 15 ## 四、變形、圖案和漸變 **1)變形** &emsp;&emsp;transform屬性定義了一系列圖形元素變形的規則,包括位移(translate)、縮放(scale)、旋轉(rotate)和傾斜(skew)。注意,與CSS3中的transform屬性不同,SVG中的transform屬性作用的對象是坐標系統,而不是元素本身。 &emsp;&emsp;translate()函數會接收兩個參數,沿x軸和y軸位移坐標系統,如圖16所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" transform="translate(50, 30)" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/3b/8d/3b8d0eb5a9f5635a8e65559d6e19d013_623x210.png =400x) 圖 16 &emsp;&emsp;scale()函數也會接收兩個參數(這點與CSS3中的scale()不同),沿x軸和y軸縮放坐標系統,如圖17所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" transform="scale(2, 3)" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/76/8d/768d9ab8294a25b6fe6684fa8e00441e_622x210.png =400x) 圖 17 &emsp;&emsp;rotate()函數可接收三個參數,第一個是旋轉角度,另外兩個是原點坐標,也就是坐標系統按照該原點旋轉,如圖18所示,第三個矩形指定了原點。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" transform="rotate(30)" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" transform="rotate(30, 50, 30)" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/e1/27/e127d19b060def31e7c1bff9c7bbcf25_936x210.png =600x) 圖 18 &emsp;&emsp;傾斜分為兩個函數:skewX()和skewY(),分別會沿著x軸和y軸傾斜,如圖19所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" transform="skewX(30)" /> </svg> <svg xmlns="http://www.w3.org/2000/svg" width="150" height="100" viewBox="0 0 300 200"> <rect width="50" height="50" fill="#F60" transform="skewY(30)" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/a9/d6/a9d6d52ee2762133f70c34028fb1b5c9_938x210.png =600x) 圖 19 **2)圖案** &emsp;&emsp;要創建一個圖案,就得使用\<pattern>元素包裹圖形元素,再利用patternUnits屬性確定平鋪圖案的方式。它有兩個關鍵字可選,默認的objectBoundingBox會讓\<pattern>元素的尺寸以百分數或0~1之間的小數表示,參照對象分別是引用\<pattern>的圖形元素的寬和高。 &emsp;&emsp;以下面的圖案為例,它的寬和高都是10%,參照的圓形的寬高都是200,計算出的實際值就都是20,效果如圖20所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="250" height="200"> <defs> <pattern id="star1" width="10%" height="10%" patternUnits="objectBoundingBox"> <circle cx="10" cy="10" r="10" /> </pattern> </defs> <circle cx="100" cy="100" r="100" fill="url(#star1)" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/a3/b7/a3b7ed7d2d0aa03b6ff523239edb4df2_410x414.png =200x) 圖 20 &emsp;&emsp;另一個userSpaceOnUse會讓\<pattern>元素的尺寸以絕對值表示,如下所示,因為\<pattern>元素的寬高都為25,所以圖案會有空白間隙,得到的效果如圖21所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="250" height="200"> <defs> <pattern id="star2" width="25" height="25" patternUnits="userSpaceOnUse"> <circle cx="10" cy="10" r="10" /> </pattern> </defs> <circle cx="100" cy="100" r="100" fill="url(#star2)" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/6c/38/6c3898016539d121bc149b831c685566_404x414.png =200x) 圖 21 &emsp;&emsp;\<pattern>元素還包含另一個patternContentUnits屬性,用于處理圖案內部的排列方式,它的兩個關鍵字也是objectBoundingBox和userSpaceOnUse,后者是該屬性的默認值。 &emsp;&emsp;objectBoundingBox會讓\<pattern>中的圖形元素以小數定義,如下所示。三個屬性值都是0.1(不能用百分數),參照的仍然是引用\<pattern>的圖形元素,計算得到的實際值都是20,效果如圖22所示,每個圖案只顯示四分之一個圓。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="250" height="200"> <defs> <pattern id="star3" width="10%" height="10%" patternContentUnits="objectBoundingBox"> <circle cx=".1" cy=".1" r=".1" /> </pattern> </defs> <circle cx="100" cy="100" r="100" fill="url(#star3)" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/08/e0/08e09d4d82582a7ae485126f775aa503_410x414.png =200x) 圖 22 **3)漸變** &emsp;&emsp;\<linearGradient>元素用于繪制線性漸變,其子元素\<stop>可指定某處的色標(即漸變點),如下所示,在起點、中點和止點處聲明了三種顏色,其中stop-opacity用于聲明不透明度(取值范圍0~1),1表示完全不透明,得到的效果如圖23所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="250" height="200"> <defs> <linearGradient id="gradient"> <stop offset="0" stop-color="#F60" /> <stop offset="50%" stop-color="#CCC" stop-opacity=".5"/> <stop offset="100%" stop-color="#FC0" /> </linearGradient> </defs> <rect width="200" height="100" fill="url(#gradient)" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/ce/c4/cec4a1c84389b5ca4e160e5e2b4f8783_407x207.png =300x) 圖 23 &emsp;&emsp;如果要改變線性漸變的方向,可通過修改起點和終點的坐標實現,例如沿垂直線漸變,代碼如下,得到的效果如圖24所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="250" height="200"> <defs> <linearGradient id="gradientVertical" x1="0" y1="0" x2="0" y2="100%"> <stop offset="0" stop-color="#F60" /> <stop offset="50%" stop-color="#CCC" stop-opacity=".5" /> <stop offset="100%" stop-color="#FC0" /> </linearGradient> </defs> <rect width="200" height="100" fill="url(#gradientVertical)" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/f7/d4/f7d4859b8b6abe56892ec8f2a5075cd5_410x210.png =300x) 圖 24 &emsp;&emsp;\<linearGradient>元素還有一個spreadMethod屬性,可指定在漸變范圍之外的填充方式,它有三個值可選,如下所列。 &emsp;&emsp;(1)pad:默認值,用起點和終點的顏色填充。 &emsp;&emsp;(2)reflect:按終點到起點,起點到終點的方式重復填充。 &emsp;&emsp;(3)repeat:按起點到終點的方式重復填充。 &emsp;&emsp;下面用一個示例來演示spreadMethod屬性,如圖25所示,從左往右,spreadMethod屬性的值依次是pad、reflect和repeat。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="800" height="200"> <defs> <linearGradient id="spreadMethod" x1="20%" y1="30%" x2="60%" y2="70%"> <stop offset="0" stop-color="#F60" /> <stop offset="40%" stop-color="#CCC" /> <stop offset="80%" stop-color="#FC0" /> </linearGradient> <linearGradient id="gradientPad" href="#spreadMethod" spreadMethod="pad" /> <linearGradient id="gradientReflect" href="#spreadMethod" spreadMethod="reflect" /> <linearGradient id="gradientRepeat" href="#spreadMethod" spreadMethod="repeat" /> </defs> <rect width="200" height="100" fill="url(#gradientPad)" /> <rect width="200" height="100" fill="url(#gradientReflect)" x="210" /> <rect width="200" height="100" fill="url(#gradientRepeat)" x="420" /> </svg> ~~~ :-: ![](https://img.kancloud.cn/b0/f0/b0f03f2003aa9a78c7109e5d3b3b14aa_1247x210.png =600x) 圖 25 &emsp;&emsp;另外一種徑向漸變由\<radialGradient>元素控制,具體可參考官方文檔。 ## 五、文本 **1)\<text>** &emsp;&emsp;\<text>元素用于處理SVG文件中的文本,在該元素中可修改字體樣式,包括字體名稱、大小、顏色、外觀等。在下面的示例中,聲明了四個\<text>元素,并為它們添加了各自的樣式,效果如圖26所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="250" height="100"> <style> .small { font: italic 13px sans-serif; } .heavy { font: bold 30px sans-serif; } .Rrrrr { font: italic 40px serif; fill: red; } </style> <text x="20" y="35" class="small">My</text> <text x="40" y="35" class="heavy">name</text> <text x="55" y="55" class="small">is</text> <text x="65" y="55" class="Rrrrr">Strick!</text> </svg> ~~~ :-: ![](https://img.kancloud.cn/dd/70/dd7074267cad4f764498b783873b4128_511x210.png =300x) 圖 26 **2)對齊** &emsp;&emsp;在\<text>元素中對齊文本得用text-anchor屬性,它的對齊方式為起點(start)、居中(middle)和終點(end)。在下面的示例中,為了便于觀察這三個關鍵字的行為,畫了一條參考線,如圖27所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="120" height="150"> <path d="M60,15 L60,110 M30,40 L90,40 M30,75 L90,75 M30,110 L90,110" stroke="grey" /> <text text-anchor="start" x="60" y="40">Start</text> <text text-anchor="middle" x="60" y="75">Middle</text> <text text-anchor="end" x="60" y="110">End</text> </svg> ~~~ :-: ![](https://img.kancloud.cn/af/41/af41c946aa7461c937ba83d2742790df_253x314.png =200x) 圖 27 &emsp;&emsp;SVG中的文本對齊與CSS中的略有不同,當起點對齊時,第一個字符會貼著參考線;當居中對齊時,文本的中間位置會被參考線貫穿;當終點對齊時,文本的最后一個字符會貼著參考線。 **3)\<tspan>** &emsp;&emsp;在\<text>元素中,通過其子元素\<tspan>可調整文本屬性,從而實現一段文本呈現不同的效果,如下所示,這段文本為斜體,而\<tspan>元素中的文本被加粗并且賦予了紅色(如圖28所示)。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="200" height="100"> <style> text { font: italic 18px serif; } tspan { font: bold 20px sans-serif; fill: red; } </style> <text x="10" y="30" class="small"> My name is <tspan>Strick</tspan>! </text> </svg> ~~~ :-: ![](https://img.kancloud.cn/ea/68/ea68dbb057a4ef812577ae5aed3ca06d_410x210.png =300x) 圖 28 **4)長度** &emsp;&emsp;textLength屬性用于定義文本的長度,lengthAdjust屬性用于設置字符間距和字形,如下所示,默認值spacing只會控制字符間距,而spacingAndGlyphs還能控制字形,如圖29所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="200" height="60"> <text y="20" textLength="90%" lengthAdjust="spacing">Big text length</text> <text y="40" textLength="90%" lengthAdjust="spacingAndGlyphs">Big text length</text> </svg> ~~~ :-: ![](https://img.kancloud.cn/ed/07/ed07a88d0b356ab324306a99c348d231_410x133.png =300x) 圖 29 **5)文本路徑** &emsp;&emsp;將文本放置在\<textPath>元素中,就可讓文本按任意的路徑排列,而不是以往的水平或垂直排列。在下面的示例中,文本按一條螺旋曲線排列,如圖30所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="150" height="120"> <defs> <path id="curve" d="M10,90 Q90,90 90,45 Q90,10 50,10 Q10,10 10,40 Q10,70 45,70 Q70,70 75,50" /> </defs> <text> <textPath href="#curve"> My name is Strick! What is your name? </textPath> </text> </svg> ~~~ :-: ![](https://img.kancloud.cn/03/77/0377f9ccd4ef7da6266a6926e47b91bd_311x250.png =200x) 圖 30 ## 六、動畫 **1)\<animate>** &emsp;&emsp;\<animate>是一個動畫元素,它可以包含在圖形元素中,多個\<animate>元素可以實現多重動畫。例如將矩形先沿著水平方向,再沿著垂直方向位移,最后在位移結束后切換背景色的動畫,代碼如下所示,效果如圖31。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="200" height="100"> <rect id="move" width="50" height="50" fill="#F60"> <animate attributeType="XML" dur="1s" repeatCount="1" attributeName="x" from="0" to="50" fill="freeze" begin="1s" id="line" /> <animate attributeType="XML" dur="1s" repeatCount="1" attributeName="y" from="0" to="30" fill="freeze" begin="2s" /> <animate attributeType="XML" dur="3s" repeatCount="indefinite" attributeName="fill" values="#F60;#FC0;#CCC" begin="line.end" /> </rect> </svg> ~~~ :-: ![](https://img.kancloud.cn/8d/94/8d94029ae728144159223c677724f6e5_428x220.gif =300x) 圖 31 &emsp;&emsp;\<animate>元素包含多個動畫屬性,此處只使用了其中的幾個,具體說明如下,其中fill="freeze"是指動畫結束后保持最后的動作。 &emsp;&emsp;(1)attributeName:執行動畫的屬性。 &emsp;&emsp;(2)attributeType:屬性類型,可選值包括XML和CSS。 &emsp;&emsp;(3)from:屬性的起始值。 &emsp;&emsp;(4)to:屬性的結束值。 &emsp;&emsp;(5)dur:動畫持續時間。 &emsp;&emsp;(6)repeatCount:動畫執行次數,可以是有限次的整數,也可以是無限次的indefinite。 &emsp;&emsp;(7)begin:動畫開始時機,可以是秒數,也可以是某個動作,例如上面第一個動畫結束后執行顏色的切換。 &emsp;&emsp;\<set>元素是對\<animate>元素的補充,可為那些不能過渡的屬性提供動畫,例如在某個時刻顯示文本,如下所示,點擊矩形可顯示“change color”。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="200" height="100"> <!--省略矩形代碼--> <text x="100" y="20" text-anchor="middle" style="display:none"> <set attributeName="display" attributeType="CSS" to="block" begin="move.click" dur="1s" fill="freeze" /> change color </text> </svg> ~~~ **2)\<animateTransform>** &emsp;&emsp;對于transform屬性的動畫,得用\<animateTransform>元素完成。下面的示例演示了旋轉矩形(如圖32所示),其中type屬性用于指定變形的動作,可選的值有translate、scale、rotate、skewX和skewY。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="180" height="160"> <rect id="move" width="50" height="50" fill="#F60" x="80" y="80"> <animateTransform attributeName="transform" attributeType="XML" type="rotate" from="0 80 80" to="360 80 80" dur="5s" repeatCount="indefinite" /> </rect> </svg> ~~~ :-: ![](https://img.kancloud.cn/4d/59/4d59ccaf789351889db3af52c07758bb_383x341.gif =200x) 圖 32 **3)\<animateMotion>** &emsp;&emsp;\<animateMotion>元素可讓圖形沿著任意路徑運動,無論是直線還是曲線,都能實現。在下面的示例中,橙色矩形會沿著S型曲線來回運動,如圖33所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="200" height="100"> <path fill="none" stroke="#000" d="M20,50 C20,-50 180,150 180,50 C180-50 20,150 20,50 z" /> <rect width="20" height="10" fill="#F60"> <animateMotion dur="10s" repeatCount="indefinite" path="M20,50 C20,-50 180,150 180,50 C180-50 20,150 20,50 z" /> </rect> </svg> ~~~ :-: ![](https://img.kancloud.cn/bc/b3/bcb3b031f74c47fda7a2fd677ae419d4_424x223.gif =300x) 圖 33 &emsp;&emsp;如果要讓矩形始終沿著平行于曲線的方向運動,那么可以將rotate屬性設為auto,如圖34所示。 ~~~html <svg xmlns="http://www.w3.org/2000/svg" width="200" height="100"> <path fill="none" stroke="#000" d="M20,50 C20,-50 180,150 180,50 C180-50 20,150 20,50 z" /> <rect width="20" height="10" fill="#F60"> <animateMotion dur="10s" repeatCount="indefinite" rotate="auto" path="M20,50 C20,-50 180,150 180,50 C180-50 20,150 20,50 z" /> </rect> </svg> ~~~ :-: ![](https://img.kancloud.cn/66/48/66484a22ca04d36d3db45941038f623b_422x223.gif =300x) 圖 34 ***** > 原文出處: [博客園-HTML躬行記](https://www.cnblogs.com/strick/category/1770829.html) [知乎專欄-HTML躬行記](https://zhuanlan.zhihu.com/c_1250826149041238016) 已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎閱讀。 ![](https://box.kancloud.cn/2e1f8ecf9512ecdd2fcaae8250e7d48a_430x430.jpg =200x200) 推薦一款前端監控腳本:[shin-monitor](https://github.com/pwstrick/shin-monitor),不僅能監控前端的錯誤、通信、打印等行為,還能計算各類性能參數,包括 FMP、LCP、FP 等。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看