整合營銷服務商

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

          免費咨詢熱線:

          零基礎教你學前端-47、SVG繪制路徑

          零基礎教你學前端-47、SVG繪制路徑

          SVG中,使用 path 標簽來定義一個路徑。它是一個單標簽,基本語法為:尖角號 path,斜線尖角號。應用路徑,我們可以繪制任意形狀的圖形。

          path標簽的重要屬性 d,用來定義繪制路徑的命令,d 是 draw 的縮寫,就是繪制的意思。

          繪制路徑的命令有很多,先看兩個常用的命令:

          M 命令,是 moveto 的縮寫,定義繪制圖形的起點坐標。例如 M 150 0 (大M,空格,150,空格,0),也可以寫成 M150 0 (大M, 150,空格,0) ,表示路徑從屏幕坐標的 x 150,y 0 (直接讀) 這個點開始繪制。

          L 命令,是 lineto 的縮寫,用來繪制一條直線。例如 l 75 200 (讀小l,空格,75,空格,200) ,也可以寫成 l75 200 (讀作小l,75,空格,200),表示從上一個結束點到 x 75,y 200 (直接讀) 這個點繪制一條直線。

          注意:命令的字母大小寫,表示的意義是不同的。大寫字母表示絕對定位,小寫字母表示相對定位。絕對定位是相對于屏幕坐標原點的位置,相對定位是相對于上一個繪制點的位置。

          打開編輯器,新建一個 path.html 文件,補全基礎代碼,在 body 里添加一個 svg 標簽,定義屬性 width 等于 400,height 等于 210。

          在 svg 里添加 path 標簽,定義屬性 d,它的值定義為 "M150 0 L75 200 L225 200"。保存文件。

          在瀏覽器中預覽,一個具有默認黑色的三角形就繪制好了。

          這里你可能會問:用 polygon 繪制多邊形不也可以嗎,為什么用 path 呢?其實,path 的繪制能力非常強,比如繪制一條貝塞爾曲線。

          “貝賽爾曲線”是由法國數學家皮埃爾·貝塞爾(Pierre Bézier)發明的,由此為計算機矢量圖形學奠定了基礎。

          在 path 中,繪制“貝賽爾曲線” 使用 Q 命令。

          Q 是 quadratic Bézier curve ([k??rv]) 的縮寫,用來繪制二次貝塞爾曲線,需要定義控制點和終點的坐標。例如 q 150 -300 300 0,表示控制點坐標是 x 150,y -300,終點坐標是 x 300,y 0。這個比較難理解,大家來看一下二次貝塞爾曲線繪制示意圖。

          回到編輯器,為了強化練習,我們來繪制一張二次貝塞爾曲線模擬靜態圖。(此時會展示繪制完以后的效果圖)

          A為起點,B為控制點,C為終點。在AB,BC 兩條紅色的線段上,有一條綠色的切線,藍色的為繪制的貝塞爾曲線。

          我們先來繪制三個點。在上個 svg 結尾處添加一個 br 標簽。回車換行。

          添加一個新的 svg 標簽,屬性 width 等于 450,height 等于 400。

          我首先繪制三個點。在 svg 標簽里添加一個 circle 標簽,定義屬性 cx 等于 100,cy 等于 350,r 等于 3。

          復制兩個 circle,分別改寫一下圓心的位置坐標。

          這里我們能成組的給三個小圓定義顏色等屬性嗎?可以的。

          在SVG中,我們可以使用 g 標簽把多個繪圖元素包裹起來,在 g 標簽上定義公共的屬性。

          我們給三個小圓定義一個父標簽 g,定義屬性 fill,值為 black。保存。

          回到瀏覽器,刷新,三個小圓點做好了。

          接下來繪制三個點的名稱。

          回到編輯器,再創建一個 g 標簽,在 g 標簽里添加一個 text 標簽,填入文本大寫字幕 A。給 text 定義屬性 x 等于 100,y 等于 350,dx 等于 -30。

          復制兩份 text 標簽,修改文本內容分別為 B,和 C。再修改一下屬性。

          最后給 g 定義三個文本的公共屬性,font-size 等于 30,fill 等于 black,text-anchor 等于 middle。保存。

          回到瀏覽器,刷新,三個點的名稱定義好了。

          接下來繪制AB,BC兩條線段。

          回到編輯器,在 svg 里的首行創建一個 path 標簽,定義 d 屬性,值為 "M 100 350 l 150 -300" (直接讀,注意那個小 l ) ,定義 stroke 屬性,值為 red,定義 stroke-width 屬性,值為 3,fill 屬性,值為 none。

          復制一個 path,修改一下 d 屬性的值。保存。

          回到瀏覽器,刷新,兩條紅色的線段繪制好了。

          接下來繪制綠色的切線。

          回到編輯器,創建第三個 path 標簽,定義 d 屬性,值為 "M 175 200 l 150 0" (直接讀,注意那個小 l ) ,定義 stroke 屬性,值為 green,定義 stroke-width 屬性,值為 3,fill 屬性,值為 none。保存。

          回到瀏覽器,刷新,一條綠色的切線繪制好了。

          最后繪制主角兒,貝塞爾曲線。

          回到編輯器,創建第四個 path 標簽,定義 d 屬性,值為 "M 100 350 q 150 -300 300 0" (直接讀,注意大M,小 q ) ,定義 stroke 屬性,值為 blue,定義 stroke-width 屬性,值為 5,fill 屬性,值為 none。保存。

          回到瀏覽器,刷新,完整的二次貝塞爾曲線模擬圖就繪制好了。

          返回編輯器,我們可以把輔助的點和線都去掉,保存。

          回到瀏覽器,刷新,只顯示了第四條 path 路徑,貝塞爾曲線!

          文章配套視頻鏈接:https://www.bilibili.com/video/BV1oU4y1278g?p=48

          我個人的博客網站樹下魅狐的首頁,使用了SVG路徑動畫來繪制LOGO。該動畫采用SVG+CSS的方式完成的。今天在這里快速的分享一下制作過程。

          關于SVG

          SVG是用于描述二維圖形的一種語言。SVG允許使用三種類型的圖形對象:矢量圖形(例如:由直線和曲線組成的路徑),圖像和文本。圖形對象可以進行分組,樣式設置,轉換和合成。SVG和XML文件混合使用時,它可以使用XML語法,當SVG和HTML文件混合使用時,它又可以使用HTML的語法。

          SVG的全稱是Scalable Vector Graphics,翻譯過來是可伸縮矢量圖形。因此,SVG圖形在放大或縮小的情況下其圖形的質量不會有損失。SVG除了可以制作圖像外,還可以用于制作各種小動畫。在使用SVG之前,先得了解一下各大瀏覽器對其兼容性,下面通過一張圖片來詳細了解:

          基于CSS和SVG實現路徑動畫

          在開始介紹制作過程之前,通過一個動畫了解一下最終的動畫形態:

          第一步:SVG文件

          第一步,我們可以通過Adobe Illustrator軟件生成一個自己想要的SVG路徑。在本例中,我將字符“RAMOSTEAR”通過Adobe Illustrator生成了路徑并導出到編輯器中,代碼如下:

          <svg id="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 938.57 122.65">
                  <g>
                      <path id="p1" class="cls-1"
                            d="M86.87,39.76c0-27.22-19.94-35.65-44.18-35.65H2V118.54H28V77.37h13.6l21.84,41.17h29L66.49,72.78C78.71,67.26,86.87,56.57,86.87,39.76ZM28,24.66H40.58c13.6,0,20.9,3.8,20.9,15.1s-7.3,17.06-20.9,17.06H28Z"/>
                      <path id="p2" class="cls-1"
                            d="M132.31,4.11,96.67,118.54h26.51l7-27.22H164.6l6.94,27.22H199L163.36,4.11Zm3,67,2.71-10.55c2.9-11.42,6.08-24.82,8.88-36.9h.7c2.75,12.08,6.24,25.48,9.14,36.9l2.68,10.55Z"/>
                      <path id="p3" class="cls-1"
                            d="M257.33,44.66l-3.79,15.83h-.71L249,44.66,237.77,4.11H210.62V118.54h21.55V83.11c0-12.88-2.17-40.78-3.48-53.15h.61l8.19,30.71,9.06,27.57h12.57L268,60.67,276.8,30h.52c-1.21,12.37-3.47,40.27-3.47,53.15v35.43h21.91V4.11H268.59Z"/>
                      <path id="p4" class="cls-1"
                            d="M358.53,2c-27.25,0-46,20.56-46,58.8,0,39.14,18.77,59.85,46,59.85s46-20.71,46-59.85C404.56,22.56,385.79,2,358.53,2Zm0,96.28c-11.93,0-19.47-12.8-19.47-37.48,0-23.78,7.54-36.43,19.47-36.43S378,37,378,60.8C378,85.48,370.47,98.28,358.53,98.28Z"/>
                      <path id="p5" class="cls-1"
                            d="M483.46,54l-14-5.93c-11-4.12-18.64-6.64-18.64-13.52,0-6.69,5.79-10.22,14.32-10.22,11.18,0,18.31,3.15,26.37,8.94L504.55,17a55.46,55.46,0,0,0-38-15c-24.86,0-41.93,15.15-41.93,34.1,0,16.65,11.57,26.38,24.25,31.2l14.91,6.36c10.83,4.54,17.63,6.53,17.63,14.77,0,5.59-5.08,9.85-16.07,9.85s-21.76-4.86-30.42-12l-14.86,17.79a65.91,65.91,0,0,0,43.57,16.53c28.32,0,44.28-16.48,44.28-35.5C507.9,69,498.44,59.66,483.46,54Z"/>
                      <polygon id="p6" class="cls-1"
                               points="521.97 25.82 556.28 25.82 556.28 118.54 582.18 118.54 582.18 25.82 616.48 25.82 616.48 4.11 521.97 4.11 521.97 25.82"/>
                      <polygon id="p7" class="cls-1"
                               points="664.01 70.49 706.45 70.49 706.45 48.77 664.01 48.77 664.01 25.82 713.97 25.82 713.97 4.11 638.11 4.11 638.11 118.54 715.72 118.54 715.72 96.82 664.01 96.82 664.01 70.49"/>
                      <path id="p8" class="cls-1"
                            d="M764.4,4.11,728.76,118.54h26.5l7-27.22h34.43l7,27.22h27.45L795.44,4.11Zm3,67,2.7-10.55c2.9-11.42,6.08-24.82,8.88-36.9h.7c2.76,12.08,6.24,25.48,9.14,36.9l2.69,10.55Z"/>
                      <path id="p9" class="cls-1"
                            d="M935.14,118.54,909.27,72.78c12.22-5.53,20.38-16.21,20.38-33,0-27.22-19.94-35.65-44.19-35.65H844.78V118.54h26V77.37h13.6l21.84,41.17ZM870.73,24.66h12.63c13.6,0,20.9,3.8,20.9,15.1s-7.3,17.06-20.9,17.06H870.73Z"/>
                  </g>
              </svg>
          

          借助工具,可以快速生成我們想要的圖形,你也可以手動書寫,但效率很低(不推薦)

          第二步:獲取路徑長度

          我們將上述的代碼插入到事先準備好的HTML文件中,然后通過JavaScript來獲得每個路徑的總長度。首先,將SVG代碼插入到HTML代碼中,如下:

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <link rel="stylesheet" href="css/style.css">
              <title>SVG TEXT ANIMATION</title>
          </head>
          <body>
              <svg id="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 938.57 122.65">
                  //...
              </svg>
              <script src="js/app.js"></script>
          </body>
          </html>
          

          接下來,在app.js中通過querySelectorAll()函數獲取所有的路徑,并通過getTotalLength()函數來獲得每一個路徑的總長度,代碼如下:

          const paths=document.querySelectorAll("#logo path");
          const polygons=document.querySelectorAll("#logo polygon");
          for(let i=0;i<paths.length;i++){
              console.log(paths[i].getAttribute("id")+" -> "+paths[i].getTotalLength());
          }
          for(let i=0;i<polygons.length;i++){
              console.log(polygons[i].getAttribute("id")+" -> "+polygons[i].getTotalLength());
          }
          

          說明:

          在使用Adobe Illustrator導出SVG時,不完全是路徑(path),還參雜著兩個多邊形(polygon),所以還需獲得polygon的路徑長度。

          在瀏覽器中打開HTML文件,你可以在控制臺中看到如下的日志信息:

          app.js:3 p1 -> 587.9400634765625
          app.js:3 p2 -> 537.8978271484375
          app.js:3 p3 -> 756.9060668945312
          app.js:3 p4 -> 523.8944091796875
          app.js:3 p5 -> 525.183349609375
          app.js:3 p8 -> 537.9104614257812
          app.js:3 p9 -> 587.8800048828125
          app.js:8 p6 -> 417.8800048828125
          app.js:8 p7 -> 568.8799438476562
          

          這樣,我們就獲得了所有圖形的路徑長度。接下來,就可以在CSS文件中操作這些參數。

          第三步:樣式文件

          前面我們已經獲取了所有圖形的路徑總長度,現在就可以利用CSS3的@keyframes和animation來定義動畫。動畫的定義很簡單,主要是改變路徑的stroke-dasharray和stroke-dashoffset兩個參數。stroke-dasharray用于設置路徑的總長度,stroke-dashoffset用于設置路徑的偏移量。一開始,將各路徑的長度和偏移量都設置為同一個值,然后再利用animation將偏移量變為0,這樣就可以形成一個類似手寫文字的動畫效果。主要的CSS代碼如下:

          .cls-1{
              stroke: #fff;
              stroke-width: 2px;
          }
          #logo{
              width: 80%;
              position: absolute;
              top: 50%;
              left: 50%;
              transform: translate(-50%,-50%);
              animation: text-fill-anim 0.5s ease forwards 4s;
          }
          
          #p1{
              stroke-dasharray: 587.9400634765625;
              stroke-dashoffset: 587.9400634765625;
              animation: text-anim 3s ease forwards;
          }
          #p2{
              stroke-dasharray: 537.8978271484375;
              stroke-dashoffset: 537.8978271484375;
              animation: text-anim 3s ease forwards 0.2s;
          }
          #p3{
              stroke-dasharray: 756.9060668945312;
              stroke-dashoffset: 756.9060668945312;
              animation: text-anim 3s ease forwards 0.4s;
          }
          #p4{
              stroke-dasharray: 523.8944091796875;
              stroke-dashoffset: 523.8944091796875;
              animation: text-anim 3s ease forwards 0.6s;
          }
          #p5{
              stroke-dasharray: 525.183349609375;
              stroke-dashoffset: 525.183349609375;
              animation: text-anim 3s ease forwards 0.8s;
          }
          #p6{
              stroke-dasharray: 417.8800048828125;
              stroke-dashoffset: 417.8800048828125;
              animation: text-anim 3s ease forwards 1s;
          }
          #p7{
              stroke-dasharray: 568.8799438476562;
              stroke-dashoffset: 568.8799438476562;
              animation: text-anim 3s ease forwards 1.2s;
          }
          #p8{
              stroke-dasharray: 537.9104614257812;
              stroke-dashoffset: 537.9104614257812;
              animation: text-anim 3s ease forwards 1.4s;
          }
          #p9{
              stroke-dasharray: 587.8800048828125;
              stroke-dashoffset: 587.8800048828125;
              animation: text-anim 3s ease forwards 1.6s;
          }
          
          @keyframes text-anim {
              to{
                  stroke-dashoffset: 0;
              }
          }
          @keyframes text-fill-anim {
              to{
                  fill: white;
              }
          }
          

          這樣,通過簡單的三步,一個SVG+CSS的路徑動畫就制作完成了。

          說明:

          JS文件中的函數主要是輔助我們計算每個圖形的路徑長度,在動畫制作完成后,可以將其刪除。

          視頻教程

          你可以通過下面的一段視頻,了解整個動畫的制作過程。


          <script src="https://lf3-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>


          自己動手寫SVG路徑動畫(零基礎三步曲視頻教程)

          SVG 中我們可以使用 <path> 元素來定義路徑。<path> 的功能很強大,既可以創建基本的圖形,也可以創建更復雜的形狀。<path> 路徑是由一些命令來控制的,每個命令對應一個字母,字母區分大小寫。

          SVG中的path命令

          <path> 元素可以用于定義路徑,元素中有一個 d 屬性,這個 d 屬性是一系列命令的集合。

          <path> 元素中支持下列命令,如果是大寫命令表示絕對定位,小寫則表示相對定位:

          命令

          參數

          描述

          M

          x y

          移動畫筆到給定坐標,即起始點

          L

          x y

          繪制一條到給定坐標的線,可提供多組坐標繪制折線

          H

          x y

          繪制一條到 x 坐標的橫線

          V

          y

          繪制一條到 y 坐標的豎線

          C

          x yx1 y1 x2 y2

          繪制一條從當前點到(x,y)的三次貝塞爾曲線,(x1,y1)為曲線的開始控制點,(x2,y2)為曲線的終點控制點

          S

          x y x1 y1

          繪制一條從當前點到(x,y)的三次貝塞爾曲線,(x1,y1)為新端點的控制點

          Q

          x y x1 y1

          繪制一條從當前點到(x,y),控制點為(x1,y1)的二次貝塞爾曲線

          T

          x y

          繪制一條從當前點到(x,y)的二次貝塞爾曲線

          A

          rx ry x-axis-rotation large-arc-flag sweep-flag x y

          繪制當前點到(x,y)的橢圓弧,橢圓弧的 x,y軸半徑分別為 rx,ry。橢圓相對于 x 軸旋轉 x-axis-rotation 度。large-arc-flag 等于0表示弧線小于180度,等于1表示弧線大于180度。sweep-flag 等于0 表示弧線逆時針旋轉,等于1表示弧線順時針選裝

          Z


          閉合路徑

          示例:

          例如我們使用路徑命令繪制一個矩形:

          <!DOCTYPE html>
          <html>
              <head>
                  <meta charset="utf-8">
                  <title>SVG學習(9xkd.com)</title>
                  <link rel="styleSheet" type="text/css" href="./style.css">
              </head>
              <body>
                  <svg width="500" height="500">
                      <path d="M50 50 L200 50 L200 150 L50 150 Z" style="fill:#f5bf8d;" />
                  </svg>
              </body>
          </html>    
          

          在瀏覽器中的演示效果:


          其中 M 命令指定了開始點的位置,即左上角 (50,50),L 命令可以用于繪制一條直線段,這個直線段從當前位置移到指定位置。上述三個 L 位置分別為右上角 (200,50)、右下角 (200,150)、左下角(50,150)。Z 命令為閉合路徑命令。

          繪制一段弧線

          使用 <path> 中的 A 和 a 命令,可以繪制圓弧,使用 A 命令(絕對坐標)作為其端點,a 命令(相對坐標) 作為起點。

          示例:

          例如下面這個例子:

          <!DOCTYPE html>
          <html>
              <head>
                  <meta charset="utf-8">
                  <title>SVG學習(9xkd.com)</title>
                  <link rel="styleSheet" type="text/css" href="./style.css">
              </head>
              <body>
                  <svg width="500px" height="500px" >
                      <path d="M50,40 A30,50 0 0,1 100,110" fill="transparent" stroke="green"/>
                  </svg>
              </body>
          </html>    
          

          在瀏覽器中的演示效果:



          從代碼中可以看到,這段弧線的起點為 (50,40),終點為(100, 110),圓弧的半徑為 A 命令上的前兩個參數,即 rx 為30,ry 為 50。A 命令上的第三個參數為 x-axis-rotation, 被設置為了0,第四個 large-arc-flag 的值等于 0 ,這表示弧線小于180度。

          鏈接:https://www.9xkd.com/


          主站蜘蛛池模板: 亚洲国产精品第一区二区| 色噜噜狠狠一区二区| 51视频国产精品一区二区| 国内精品视频一区二区八戒| 亚洲综合无码AV一区二区| 日本一区二三区好的精华液| 国产在线一区二区三区| 一区二区三区在线免费观看视频| 日韩人妻精品一区二区三区视频| 日本精品高清一区二区| 国产aⅴ一区二区| 成人h动漫精品一区二区无码| 91成人爽a毛片一区二区| 中文字幕一区二区三| 国产福利酱国产一区二区| 亚洲一区影音先锋色资源| 综合人妻久久一区二区精品| 日本精品一区二区三区在线视频一 | 国模丽丽啪啪一区二区| 午夜一区二区在线观看| 色综合视频一区二区三区44| 美女视频一区三区网站在线观看| 亚洲综合无码一区二区| 亚洲va乱码一区二区三区| 99久久精品国产一区二区成人 | 另类一区二区三区| 国产在线aaa片一区二区99| 中文字幕VA一区二区三区| 国产成人精品一区二区三区| 久久国产精品免费一区二区三区| 一区二区在线免费视频| 国产成人精品a视频一区| 99久久精品国产免看国产一区| 中文字幕永久一区二区三区在线观看| 亚洲第一区在线观看| 国产一区二区精品| 中文字幕一区视频| 大帝AV在线一区二区三区| 亚洲毛片不卡av在线播放一区| 日韩人妻无码一区二区三区| 一区高清大胆人体|