前端實現動畫 即便很炫的那種,說白了 各類 @keyframe a b c d 組合加上本身的創意,也不是很難,直到有一天看到一個 像蚯蚓同樣 描邊的 動畫,感受挺不錯,後來發現是svg 作的,因而學習了下 svg的基礎知識,搞了了一個顯示本身名字的動畫css
引用w3c
svg 中 定義 一個路徑 ,至關於 用挖掘機修一條路,以後咱們就能夠沿着這條路走徹底程, 描邊動畫也就是沿着這個路徑進行html
//大概長這樣
<path d="
M153 334
C153 334 151 334 151 334"
style="fill:white;stroke:red;stroke-width:2"/>
/>
複製代碼
d
用來描述路徑, style
就是 定義路徑的樣式, 不過和普通的html標籤有微微的區別,我當時是這樣來轉換的,一下就明白了前端
咱們看到 d
中 有不少 大寫字母 M
C
,是什麼意思呢? 大寫字母表明 絕對定位, 小寫字母表明 相對定位bash
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 結束當前路徑
複製代碼
標註的 是咱們 須要用到的,瞭解了這些 咱們能夠 寫字了網絡
首先咱們開始定義一個 svg 和 path 標籤svg
<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;
}
複製代碼
因爲要寫三個字,爲了外邊,咱們全用大寫字母指令(絕對定位),運用剛纔瞭解的知識, 將起始點 在x 50 y 50 下筆 而後 在 x120,y50 鏈接一根線 就能夠看到 李 字 的 "一" 就出來了動畫
<path d="M50 50 "/>
複製代碼
接下來咱們來一點藝術範,寫帶點幅度的 "木" 字頭 首先用 A 在 "一" 上分 換一個 弧線 <A 半徑x,半徑y,0,大弧,終點x座標,終點y座標> 以後 用 "L" 寫兩撇spa
<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"/>
複製代碼
果真字如其人,騷的一批,
以後就是依葫蘆畫瓢,寫下其他的兩個字,代碼以下
<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>
複製代碼
效果以下
其實 實現描邊動畫 就兩個關鍵屬性
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,可是仍是那句話,知其因此然 本身去折騰一下,會發現不少樂趣