1. 程式人生 > >如何用svg畫一個騷氣的名字

如何用svg畫一個騷氣的名字

1. 前言

前端實現動畫 即使很炫的那種,說白了 各種 @keyframe a b c d 組合加上自己的創意,也不是很難,直到有一天看到一個 像蚯蚓一樣 描邊的 動畫,感覺挺不錯,後來發現是svg 做的,於是學習了下 svg的基礎知識,搞了了一個顯示自己名字的動畫

2. svg 在本文中需要的基礎知識

2.1 什麼是svg

引用w3c
  • SVG 指可伸縮向量圖形 (Scalable Vector Graphics)
  • SVG 用來定義用於網路的基於向量的圖形
  • SVG 使用 XML 格式定義圖形
  • SVG 影象在放大或改變尺寸的情況下其圖形質量不會有所損失
  • SVG 是全球資訊網聯盟的標準
  • SVG 與諸如 DOM 和 XSL 之類的 W3C 標準是一個整體

2.2 路徑

svg 中 定義 一個路徑 ,相當於 用挖掘機修一條路,之後我們就可以沿著這條路走完全程, 描邊動畫也就是沿著這個路徑進行

//大概長這樣
<path d="
    M153 334
    C153 334 151 334 151 334"
    style="fill:white;stroke:red;stroke-width:2"/>
/>

複製程式碼

d 用來描述路徑, style 就是 定義路徑的樣式, 不過和普通的html標籤有微微的區別,我當時是這樣來轉換的,一下就明白了

  • fill => background-color
  • stroke => border-color
  • stroke-width => border-width

我們看到 d 中 有很多 大寫字母 M C,是什麼意思呢? 大寫字母代表 絕對定位, 小寫字母代表 相對定位

M = moveto 移動到
L = lineto 連線一根線到
H = horizontal lineto  水平連線
V = vertical lineto    垂直連線
C = curveto
S = smooth curveto
Q = quadratic Belzier curve
T = smooth quadratic Belzier curveto
A = elliptical Arc     橢圓的線 貝塞爾曲線  
Z = closepath          結束當前路徑
複製程式碼

標註的 是我們 需要用到的,瞭解了這些 我們可以 寫字了

3. 開始寫李金珂三個字

3.1 定義樣式

首先我們開始定義一個 svg 和 path 標籤

<body>
<svg>
    <path></path>
</svg>
</body>
複製程式碼

定義樣式

    svg,
    body,
    html {
      width: 100%;
      height: 100%;
      padding: 0;
      margin: 0;
    }

    svg {
      background: #ccc;
    }
複製程式碼

將svg設為全屏,背景色為灰色,分別設定三個字的顏色

    path {
      stroke-width: 3px;
      stroke-linecap: round;           //以圓滑的方式連線兩條線
      fill: none;                      //不填充
    }

    path:nth-child(1) {
      stroke: #396;
    }

    path:nth-child(2) {
      stroke: gold;
    }

    path:nth-child(3) {
      stroke: #06a;
    }
複製程式碼

3.2 開始繪製座標,寫 (李) 字

由於要寫三個字,為了外邊,我們全用大寫字母指令(絕對定位),運用剛才瞭解的知識, 將起始點 在x 50 y 50 下筆 然後 在 x120,y50 連線一根線 就可以看到 李 字 的 "一" 就出來了

    <path d="M50 50 "/>
複製程式碼

接下來我們來一點藝術範,寫帶點幅度的 "木" 字頭 首先用 A 在 "一" 上分 換一個 弧線 <A 半徑x,半徑y,0,大弧,終點x座標,終點y座標> 之後 用 "L" 寫兩撇

    <path d="M50 50
              L120 50
              A15 2 0 1 0 110 30
              L105 100
              v -50
              L 70 85
              L141 70
              L104 120"/>
複製程式碼

效果如下,有一點點抽象派,需要有一點點藝術品位才能欣賞的來



剛開始有點生疏,不過之後找到了感覺,慢慢羅位子,終於一個李字 寫了出來

    <path d="M50 50
              L120 50
              A15 2 0 1 0 110 30
              L105 100
              v -50
              L 70 85
              L141 70
              L104 120
              v 100
              A 1 2 0 0 1 69 204
              L31 167
              L196 127"/>
複製程式碼


果然字如其人,騷的一批,

3.3 寫完剩下 兩個字

之後就是依葫蘆畫瓢,寫下其餘的兩個字,程式碼如下

  <svg>
    <path d="M50 50
              L120 50
              A15 2 0 1 0 110 30
              L105 100
              v -50
              L 70 85
              L141 70
              L104 120
              v 100
              A 1 2 0 0 1 69 204
              L31 167
              L196 127"/>
    <path d="M500 50
        L 410 136
        M457 89
        L 610 136
        M 445 155
        h 70
        M 445 175
        h 70
        M 475 155
        v 90
        M 457 232
        L 428 213
        M 520 232
        L 538 213
        M 405 245
        h 140"/>
    <path d="M780 50
        h 90
        h -45
        v 70
        h -50
        h 100
        h -50
        v 80
        L 740 233
        L 932 157
        A 4 3 0 0 1 1036 96
        L 980 130
        v 30
        h 30
        v -25
        h -30
        h 30
        v 150
        L 945 222"/>
</svg>
複製程式碼

效果如下



4. 新增動畫

其實 實現描邊動畫 就兩個關鍵屬性

stroke-dasharray:定義描邊的虛線長度,如果提供奇數個,則會自動複製該值成偶數
stroke-dashoffset:定義虛線描邊的偏移量(在路徑開始的前面,看不到)
複製程式碼

將這兩個 值 設定為一樣的值,且相對大一點, 這時你會發現剛才辛辛苦苦寫的字看不見了

stroke-dashoffset: 2000;
stroke-dasharray: 2000; 
複製程式碼

將值改為0 就出來了,所以只需要一個動畫 將 值 緩慢的 改為0 就行了

    path {
      stroke-width: 3px;
      stroke-linecap: round;
      fill: none;
      stroke-dashoffset: 2000;
      stroke-dasharray: 2000; 
       animation: path 10s linear forwards;
    }
    @keyframes path {
      to {
        stroke-dashoffset: 0;
      }
    }
複製程式碼

重新整理一下,大功告成

結語

其實有很多工具 可以線上生成 這種 svg,但是還是那句話,知其所以然 自己去折騰一下,會發現很多樂趣