整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          HTML5(八)-SVG 之 path 詳解

          ath 是 SVG 基本形狀中最強大的一個,不僅可以實現我們上一篇《HTML5(七)——SVG基礎入門》中,介紹的 SVG 預定義的 line、rect、circle、ellipse、line、polyline、polygon 六種基本形狀。還可以實現更復雜的效果,我們就開始學習 path 如何應用。

          一、path 路徑詳解

          1.1、path 命令

          path 用于定義一個路徑,其中命令就是控制這條路徑的,以下命令就是可用于路徑數據:

          注:以上所有命令大小寫都可以,區別是大寫命令表示絕對定位,小寫表示相對定位。

          1.2、path 使用

          使用語法:<path d=" M x1 y1 L x2 y2 H x3.... " stroke="red"></path>

          d:引出路徑,d 中的值由多條命令組合而成。

          圓弧在實際場景中應用非常廣泛,A 命令中參數較多,large-arc 和 sweep 較難理解,詳細介紹下。

          使用語法:<path d="M x y A rx ry x-axis-rotation large-arc sweep x y"></path>

          如上圖所示,A 到 B 兩個點再加半徑,可以繪制出 4 條弧線,具體選哪一條呢?就是由 large-arc (是否是大弧)和 sweep(是否逆時針旋轉) 兩個參數決定。

          large-arc = 1 表示弧度大于等于180,反之就是小于180。

          sweep = 0 表示逆時針旋轉,反正順時針旋轉。

          所以上述 4 條弧線分別對應的兩個參數為:

          • 1:(0 0)
          • 2:(0,1)
          • 3:(1,1)
          • 4:(1,0)

          eg:使用 path 繪制一條直線、半圓、直線,連接起來形成一個拱橋,代碼如下:

          <svg  version="1.1" height="400" width="550">
           <path d="
            M 0 100  //(0,100)是起點
            L 100 100  // 畫一條直接到 (100,100)
            A 100 100 0 1 1 300 100  // 畫一段圓弧
            L 400 100 //畫一條直線到 (400,100)
          " stroke="black" stroke-width="1" fill="none"></path>    
          </svg>

          運行結果如下:

          可以自己修改上述 A 中 參數觀察半圓的變化。

          1.3、js 操作path

          我們經常使用js動態添加、移除元素等,可以實現更炫酷的特效,那js能動態操作path嗎?如何操作呢?

          我們使用js動態繪制一個與上邊案例eg1一樣的path。

          <svg  version="1.1" height="400" width="550" id="svg"></svg>
          <script >
           window.onload = function(){
            let svg = document.getElementById("svg")
            let path = document.createElement("path")
            path.setAttribute('d',"M 0 100  L 100 100  A 100 100 0 1 1 300 100   L 400 100")
            svg.appendChild(path)
          }
          </script>

          運行代碼,我們發現沒有報錯,也沒有顯示任何結果。

          添加:alert(path),打印出 [object HTMLUnknownElement]。

          說明 html 把 path 當作普通的 html 標簽解析了,發現并不認識該標簽,所以頁面沒有任何效果,此時我們需要介紹一個新的創建元素方法。

          createElementNS介紹

          createElementNS 是創建一個具有指定的命名空間URI和限定名稱的元素。

          使用語法:document.createElementNS(namespaceURI, qualifiedName[, options]);

          • namespaceURI 指定與元素相關聯的命名空間URI的字符串。創建的元素的namespaceURI (en-US)屬性使用namespaceURI的值進行初始化。
          • qualifiedName指定要創建的元素的類型的字符串。 創建的元素的nodeName (en-US)屬性使用qualifiedName的值進行初始化。
          • options可選的一個可選的包含單個屬性的ElementCreationOptions對象,其值是預先使用customElements.define()定義的自定義元素的標簽名稱。為了向后兼容自定義元素規范的早期版本,一些瀏覽器允許您在此使用字符串替代對象,其中字符串的值是自定義元素的標簽名稱。

          生成path元素代碼:

          let path = document.createElementNS(
            "http://www.w3.org/2000/svg",
            "path"
          )

          js操作屬性時,html元素與SVG元素區別:

          普通html元素可以使用兩種方法:

          1. setAttribute(x,val) / getAttribute(x)
          2. obj.x

          SVG操作方法只有一種

          1. setAttribute(x,val) / getAttribute(x)

          eg3:圖表中餅圖是特別常見的,我們就先使用 js 動態地繪制一個扇形圓弧。

          <svg  version="1.1" height="400" width="550" id="svg"></svg>
          <script >
           function d2a(n){
            return Math.PI*n/180
           }
           function pie(ang1,ang2,r,cx,cy){
            let svg = document.getElementById("svg")
            let path = document.createElementNS("http://www.w3.org/2000/svg","path")
            let arr = []
            let x1 = cx + Math.sin(d2a(ang1))*r
            let y1 = cy - Math.cos(d2a(ang1))*r
            let x2 = cx + Math.sin(d2a(ang2))*r
            let y2 = cy - Math.cos(d2a(ang2))*r
            arr.push(`M ${cx} ${cy} L ${x1} ${y1} A ${r} ${r} 0 0 1 ${x2} ${y2} `)
            arr.push("Z")
            path.setAttribute('d',arr.join(' '))
            svg.appendChild(path)
           }
           window.onload = function(){
            pie(20,180,200,200,200)
           }
          </script>

          運行結果如圖所示:

          如果有興趣,可以自己修改開始角度和結束角度,可以繪制出很多種不同效果的圓弧。

          二、樣式以及優先級

          上述代碼

          <path d="
            M 0 100  //(0,100)是起點
            L 100 100  // 畫一條直接到 (100,100)
          " stroke="black" stroke-width="1" fill="none"></path>

          上述屬性可以分為兩類:

          • 只能為屬性 - 決定圖形或路徑形狀的
          • 可以放樣式 - 視覺上的效果

          如 troke、fill等是控制視覺上的效果,這樣的屬性可以放入 style 樣式中。所以上述代碼可以改寫為:

          <path d="
            M 0 100  //(0,100)是起點
            L 100 100  // 畫一條直接到 (100,100)
          " style="stroke:black;stroke-width:1;fill:none"></path>

          該樣式可以放到 head 的 style 中,代碼為:

          path{
           fill:none;
           stroke:black;
           stroke-width:1
          }

          還可以通過 class、id、標簽等添加樣式,他們的優先級分別為:

          屬性< * < 標簽 < class < id < 行間

          path 的樣式控制同樣適用于 SVG 預定義的 rect、circle、ellipse 等元素。

          如果覺得還不錯!

          點個關注,下篇解密 SVG 動畫 !

          擊右上方紅色按鈕關注“web秀”,讓你真正秀起來

          前言

          通常我們說的 Web 動畫,其實包含了以下三大類:

          1、CSS3 動畫

          2、javascript 動畫(canvas)

          3、html 動畫(SVG)

          3 種動畫各有優劣,實際應用中根據情況作出取舍,本文討論的是我認為 SVG 中在實際項目中非常有應用價值 SVG 線條動畫。

          SVG 的歷史和優勢(W3C)

          在 2003 年一月,SVG 1.1 被確立為 W3C 標準。 參與定義 SVG 的組織有:太陽微系統、Adobe、蘋果公司、IBM 以及柯達。 與其他圖像格式相比,使用 SVG 的優勢在于:

          1、SVG 可被非常多的工具讀取和修改(比如記事本)

          2、SVG 與 JPEG 和 GIF 圖像比起來,尺寸更小,且可壓縮性更強。

          3、SVG 是可伸縮的

          4、SVG 圖像可在任何的分辨率下被高質量地打印

          5、SVG 可在圖像質量不下降的情況下被放大

          6、SVG 圖像中的文本是可選的,同時也是可搜索的(很適合制作地圖)

          7、SVG 可以與 Java 技術一起運行

          8、SVG 是開放的標準

          9、SVG 文件是純粹的 XML

          10、SVG 的主要競爭者是 Flash。

          與 Flash 相比,SVG 最大的優勢是與其他標準(比如 XSL 和 DOM)相兼容。而 Flash 則是未開源的私有技術。

          SVG 是什么

          可縮放矢量圖形,即SVG,是W3C XML的分枝語言之一,用于標記可縮放的矢量圖形。(摘自MDN)

          上面代碼中,先談談 svg 標簽:

          • version: 表示 <svg> 的版本,目前只有 1.0,1.1 兩種
          • xmlns:http://www.w3.org/2000/svg 固定值
          • xmlns:xlink:http://www.w3.org/1999/xlink 固定值
          • xml:space:preserve 固定值,上述三個值固定,表示命名空間,當數據單獨存在svg文件內時,這3個值不能省略
          • class:就是我們熟悉的 class 類選擇器
          • width | height: 定義 svg 畫布的大小
          • viewbox: 定義了畫布上可以顯示的區域,當 viewBox 的大小和 svg 不同時,viewBox 在屏幕上的顯示會縮放至 svg 同等大小

          有了 svg 標簽,我們就可以愉快的在內部添加 SVG 圖形了

          SVG 基本形狀

          SVG 線條動畫基礎入門知識

          MDN Web 有基本形狀的文檔,建議去看看。包含矩形、圓形、橢圓、線條、多邊形、折線等等。

          好了,有了基本的了解,我們繼續今天的話題,SVG 線條動畫。

          SVG 線條動畫

          先看看效果圖,然后想想如果是你,該怎么實現這個效果了?

          SVG 線條動畫基礎入門知識

          ok,像以前一樣,我們先來解析一下(按步驟實現):

          1、svg畫個按鈕(基礎形狀-矩形)

          2、矩形只保留下方底邊

          3、實現鼠標:hover事件 + 動畫效果

          svg畫個按鈕

          <div class="button"> 
           <svg 
           viewBox="0 0 320 60" 
           version="1.1" 
           xmlns="http://www.w3.org/2000/svg" 
           > 
           <rect class="shape" height="60" width="320"></rect> 
           </svg> 
           <div class="hover-text">Web 秀</div> 
          </div>
          

          添加樣式

          .button { 
           position: absolute; 
           width: 320px; 
           height: 60px; 
           top: 50%; 
           left: 50%; 
           transform: translate(-50%, -50%); 
          } 
          .hover-text { 
           position: absolute; 
           line-height: 60px; 
           width: 320px; 
           top: 0; 
           color: #1199ff; 
           font-size: 28px; 
           text-align: center; 
           cursor: pointer; 
          } 
          .shape { 
           fill: transparent; 
           stroke-width: 4px; 
           stroke: #1199ff; 
          }
          

          SVG 線條動畫基礎入門知識

          button垂直水平居中、shape透明填充,邊框寬度4px,邊框顏色#1199ff。

          也許你會對fill、stroke-width等屬性有點懵,下面看看他們的描述:

          • fill:類比 css 中的 background-color,給 svg 圖形填充顏色;
          • stroke-width:類比 css 中的 border-width,給 svg 圖形設定邊框寬度;
          • stroke:類比 css 中的 border-color,給 svg 圖形設定邊框顏色;
          • stroke-linejoin | stroke-linecap:設定線段連接處的樣式;
          • stroke-dasharray:值是一組數組,沒數量上限,每個數字交替表示劃線與間隔的寬度;
          • stroke-dashoffset:則是劃線與間隔的偏移量

          重點講講能夠實現線條動畫的關鍵屬性 stroke-dasharray 。屬性 stroke-dasharray 可控制用來描邊的點劃線的圖案范式。

          SVG 矩形只留底邊

          這里我們給按鈕添加stroke-dasharray:

          .shape { 
           ... 
           stroke-dasharray: 160 520; 
           stroke-dashoffset: -460; 
          }
          

          SVG 線條動畫基礎入門知識

          SVG hover動畫

          .button:hover .hover-text { 
           transition: 0.5s; 
           color: pink; 
          } 
           
          .button:hover .shape { 
           -webkit-animation: draw 0.5s linear forwards; 
           animation: draw 0.5s linear forwards; 
          } 
           
          @keyframes draw { 
           0% { 
           stroke-dasharray: 160 520; 
           stroke-dashoffset: -460; 
           stroke-width: 4px; 
           } 
           100% { 
           stroke-dasharray: 760; 
           stroke-dashoffset: 0; 
           stroke-width: 2px; 
           stroke: pink; 
           } 
          }
          

          hover時,改變文字顏色,利用stroke-dasharray和stroke-dashoffset實現動畫效果。

          后續文章將會詳述非規則圖形,如何使用 PS + AI 生成 path 路徑,實現 SVG 動畫,敬請期待。

          公告

          喜歡小編的點擊關注,了解更多知識!

          源碼地址和源文件下載請點擊下方“了解更多”

          擊右上方紅色按鈕關注“web秀”,讓你真正秀起來

          前言

          通常我們說的 Web 動畫,其實包含了以下三大類:

          1、CSS3 動畫

          2、javascript 動畫(canvas)

          3、html 動畫(SVG)

          3 種動畫各有優劣,實際應用中根據情況作出取舍,本文討論的是我認為 SVG 中在實際項目中非常有應用價值 SVG 線條動畫。

          SVG 的歷史和優勢(W3C)

          在 2003 年一月,SVG 1.1 被確立為 W3C 標準。 參與定義 SVG 的組織有:太陽微系統、Adobe、蘋果公司、IBM 以及柯達。 與其他圖像格式相比,使用 SVG 的優勢在于:

          1、SVG 可被非常多的工具讀取和修改(比如記事本)

          2、SVG 與 JPEG 和 GIF 圖像比起來,尺寸更小,且可壓縮性更強。

          3、SVG 是可伸縮的

          4、SVG 圖像可在任何的分辨率下被高質量地打印

          5、SVG 可在圖像質量不下降的情況下被放大

          6、SVG 圖像中的文本是可選的,同時也是可搜索的(很適合制作地圖)

          7、SVG 可以與 Java 技術一起運行

          8、SVG 是開放的標準

          9、SVG 文件是純粹的 XML

          10、SVG 的主要競爭者是 Flash。

          與 Flash 相比,SVG 最大的優勢是與其他標準(比如 XSL 和 DOM)相兼容。而 Flash 則是未開源的私有技術。

          SVG 是什么

          可縮放矢量圖形,即SVG,是W3C XML的分枝語言之一,用于標記可縮放的矢量圖形。(摘自MDN)

          上面代碼中,先談談 svg 標簽:

          • version: 表示 <svg> 的版本,目前只有 1.0,1.1 兩種
          • xmlns:http://www.w3.org/2000/svg 固定值
          • xmlns:xlink:http://www.w3.org/1999/xlink 固定值
          • xml:space:preserve 固定值,上述三個值固定,表示命名空間,當數據單獨存在svg文件內時,這3個值不能省略
          • class:就是我們熟悉的 class 類選擇器
          • width | height: 定義 svg 畫布的大小
          • viewbox: 定義了畫布上可以顯示的區域,當 viewBox 的大小和 svg 不同時,viewBox 在屏幕上的顯示會縮放至 svg 同等大小

          有了 svg 標簽,我們就可以愉快的在內部添加 SVG 圖形了

          SVG 基本形狀

          SVG 線條動畫基礎入門知識

          MDN Web 有基本形狀的文檔,建議去看看。包含矩形、圓形、橢圓、線條、多邊形、折線等等。

          好了,有了基本的了解,我們繼續今天的話題,SVG 線條動畫。

          SVG 線條動畫

          先看看效果圖,然后想想如果是你,該怎么實現這個效果了?

          SVG 線條動畫基礎入門知識

          ok,像以前一樣,我們先來解析一下(按步驟實現):

          1、svg畫個按鈕(基礎形狀-矩形)

          2、矩形只保留下方底邊

          3、實現鼠標:hover事件 + 動畫效果

          svg畫個按鈕

          <div class="button"> 
           <svg 
           viewBox="0 0 320 60" 
           version="1.1" 
           xmlns="http://www.w3.org/2000/svg" 
           > 
           <rect class="shape" height="60" width="320"></rect> 
           </svg> 
           <div class="hover-text">Web 秀</div> 
          </div>
          

          添加樣式

          .button { 
           position: absolute; 
           width: 320px; 
           height: 60px; 
           top: 50%; 
           left: 50%; 
           transform: translate(-50%, -50%); 
          } 
          .hover-text { 
           position: absolute; 
           line-height: 60px; 
           width: 320px; 
           top: 0; 
           color: #1199ff; 
           font-size: 28px; 
           text-align: center; 
           cursor: pointer; 
          } 
          .shape { 
           fill: transparent; 
           stroke-width: 4px; 
           stroke: #1199ff; 
          }
          

          SVG 線條動畫基礎入門知識

          button垂直水平居中、shape透明填充,邊框寬度4px,邊框顏色#1199ff。

          也許你會對fill、stroke-width等屬性有點懵,下面看看他們的描述:

          • fill:類比 css 中的 background-color,給 svg 圖形填充顏色;
          • stroke-width:類比 css 中的 border-width,給 svg 圖形設定邊框寬度;
          • stroke:類比 css 中的 border-color,給 svg 圖形設定邊框顏色;
          • stroke-linejoin | stroke-linecap:設定線段連接處的樣式;
          • stroke-dasharray:值是一組數組,沒數量上限,每個數字交替表示劃線與間隔的寬度;
          • stroke-dashoffset:則是劃線與間隔的偏移量

          重點講講能夠實現線條動畫的關鍵屬性 stroke-dasharray 。屬性 stroke-dasharray 可控制用來描邊的點劃線的圖案范式。

          SVG 矩形只留底邊

          這里我們給按鈕添加stroke-dasharray:

          .shape { 
           ... 
           stroke-dasharray: 160 520; 
           stroke-dashoffset: -460; 
          }
          

          SVG 線條動畫基礎入門知識

          SVG hover動畫

          .button:hover .hover-text { 
           transition: 0.5s; 
           color: pink; 
          } 
           
          .button:hover .shape { 
           -webkit-animation: draw 0.5s linear forwards; 
           animation: draw 0.5s linear forwards; 
          } 
           
          @keyframes draw { 
           0% { 
           stroke-dasharray: 160 520; 
           stroke-dashoffset: -460; 
           stroke-width: 4px; 
           } 
           100% { 
           stroke-dasharray: 760; 
           stroke-dashoffset: 0; 
           stroke-width: 2px; 
           stroke: pink; 
           } 
          }
          

          hover時,改變文字顏色,利用stroke-dasharray和stroke-dashoffset實現動畫效果。

          后續文章將會詳述非規則圖形,如何使用 PS + AI 生成 path 路徑,實現 SVG 動畫,敬請期待。

          公告

          喜歡小編的點擊關注,了解更多知識!

          源碼地址和源文件下載請點擊下方“了解更多”


          主站蜘蛛池模板: 中文字幕视频一区| 成人精品一区二区三区不卡免费看| 成人区人妻精品一区二区不卡| 国产高清在线精品一区小说 | 波多野结衣一区二区三区高清在线| 国产精品美女一区二区视频| 国产福利电影一区二区三区,免费久久久久久久精 | 3D动漫精品一区二区三区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久国产免费一区| 91久久精一区二区三区大全| 精品天海翼一区二区| 国产精品一区二区三区高清在线 | 无码喷水一区二区浪潮AV| 无码日韩人妻av一区免费| 激情亚洲一区国产精品| 一区高清大胆人体| 末成年女A∨片一区二区| 日韩精品一区二区三区四区 | 久久久久无码国产精品一区| 另类免费视频一区二区在线观看| 国产日韩精品一区二区三区在线| 中文字幕在线播放一区| 大伊香蕉精品一区视频在线| 中文无码AV一区二区三区| 国产精品无圣光一区二区| 日本不卡一区二区视频a| 精品无码人妻一区二区免费蜜桃| 日韩在线不卡免费视频一区| 国产乱码精品一区二区三区中| 亚洲天堂一区在线| 在线精品一区二区三区电影| 日韩精品电影一区| 中文字幕在线视频一区| 一区二区三区四区免费视频| 蜜桃传媒一区二区亚洲AV| 手机福利视频一区二区| 亚洲国产激情一区二区三区| 国产精品高清一区二区三区 | 一区二区中文字幕在线观看| 中文字幕人妻无码一区二区三区 |