svg描邊動(dòng)畫神器stroke

最近重構(gòu)博客垂涯,瀏覽了許多很酷炫的網(wǎng)站鸵赫,發(fā)現(xiàn)他們的logo很多用到了描邊動(dòng)畫。
仔細(xì)研究一番宵蕉,發(fā)現(xiàn)其實(shí)還蠻簡(jiǎn)單的。主要用到了svg的stroke屬性节榜。

stroke屬性簡(jiǎn)介

stroke就是元素的一個(gè)輪廓屬性羡玛,可應(yīng)用于任何種類的線條,文字和元素宗苍。即給現(xiàn)有圖形增加輪廓用

一些會(huì)用到的stroke屬性

stroke

表示的是輪廓的顏色稼稿。值和color一樣,支持rgba透明通道(為啥不是stroke-color讳窟?)

stroke-width

表示輪廓的寬度让歼,可選值<length> | <percentage> | inherit

比較重要的屬性:

stroke-dasharray

可控制用來輪廓描邊的點(diǎn)劃線的圖案范式,就和名字一樣丽啡,它的值是一組值谋右,用來控制虛線中每段虛線的長(zhǎng)度和虛線間的距離,類似[長(zhǎng)度,距離,長(zhǎng)度,距離]的表示

image.png

點(diǎn)擊運(yùn)行示例感受一下區(qū)別

<svg >
  <g fill="none" stroke="black" stroke-width="4">
    <!-- 長(zhǎng)度5补箍,間隔5-->
    <path stroke-dasharray="5,5" d="M5 20 l215 0" />
    <!-- 長(zhǎng)度10改执,間隔5-->
    <path stroke-dasharray="10,5" d="M5 40 l215 0" />
    <!-- 長(zhǎng)度10啸蜜,間隔10-->
    <path stroke-dasharray="10,10" d="M5 60 l215 0" />
    <!-- 長(zhǎng)度20,間隔10辈挂,長(zhǎng)度5衬横,間隔5,長(zhǎng)度5终蒂,間隔10-->
    <path stroke-dasharray="20,10,5,5,5,10" d="M5 80 l215 0" />
  </g>
</svg>
stroke-dashoffset

表示虛線的起始偏移蜂林,可選值<percentage> |<length> | inherit

實(shí)踐一:簡(jiǎn)單進(jìn)度條

搭配css animation 幾行代碼就可以實(shí)現(xiàn)一些簡(jiǎn)單的進(jìn)度條動(dòng)畫
簡(jiǎn)單原理:使用SVG構(gòu)建兩個(gè)元素:直線和圓形,通過css animation 去控制stroke-dasharray屬性拇泣,改變虛線點(diǎn)的長(zhǎng)度噪叙,同時(shí)要保證間距足夠長(zhǎng),以免看到虛線的第二段挫酿,這里我用了2000构眯,一般情況下是通過計(jì)算得到這個(gè)值,我這里圖省事就直接設(shè)置一個(gè)足夠大的值就了事了早龟。

點(diǎn)擊查看在線演示

#svgForStroke line {
    animation:dasharray 2s ease infinite alternate backwards running;
    stroke-dasharray: 100 1000;
    transition: all 4s ease;
}
 .circle {
    animation:circleLoading 2s ease infinite alternate backwards running;
}
 @keyframes circleLoading {
     from {  stroke-dasharray: 0 2000  }
     to {  stroke-dasharray: 1100 2000  }
 }
@keyframes dasharray {
    from {  stroke-dasharray: 100 1000  }
    to {  stroke-dasharray: 20 1000  }
}

<!-- 直線進(jìn)度條 -->
<svg id="svgForStroke" width="400" height="200" xmlns="http://www.w3.org/2000/svg">
    <g>
        <line stroke="green" stroke-width="10" stroke-linejoin="miter" stroke-linecap="butt" x1="20" y1="90" x2="120" y2="90"></line>
    </g>
</svg>
<!-- 圓弧進(jìn)度條 -->
<svg id="svgCircle" width="440" height="440" viewbox="0 0 440 440">
    <circle cx="220" cy="220" r="170" stroke-width="50" stroke="#D1D3D7" fill="none"></circle>
    <circle class="circle" cx="220" cy="220" r="170" stroke-width="50" stroke="#00A5E0" fill="none" transform="matrix(0,-1,1,0,0,440)" stroke-dasharray="0 1069"></circle>
</svg>

實(shí)踐二:加載失敗動(dòng)畫

演示:

failure.gif

實(shí)踐一中的線段進(jìn)度條惫霸,和圓弧進(jìn)度條稍微拼接改進(jìn)一下就可以做很有意思的組合動(dòng)畫

  1. 借助stroke-dashoffset,通過改變起始偏移讓線段有位移效果
  2. 外層用圓形進(jìn)度條葱弟,里面放2個(gè)路徑壹店。

基本的結(jié)構(gòu)非常簡(jiǎn)單

<svg viewBox="0 0 100 100">
    <circle cx="50" cy="50" r="40" fill="none"></circle>
    <path class="line1" d="M30 30 L70 70" fill="none"></path>
    <path class="line2" d="M70 30 L30 70" fill="none"></path>
</svg>
//用于獲取圓的周長(zhǎng),待會(huì)會(huì)用到芝加,當(dāng)然你也可以自己算硅卢。2πr
const node = document.querySelector('circle');
console.log(node.getTotalLength())//250.9  

//TODO : 不知道為啥小于2πr計(jì)算得到的值,改天看看

動(dòng)畫實(shí)現(xiàn) 點(diǎn)擊查看

先介紹那么多藏杖。等玩出花來再寫個(gè)進(jìn)階玩法

參考內(nèi)容

  1. https://css-tricks.com/svg-line-animation-works/
  2. http://www.zhangxinxu.com/wordpress/2014/04/animateion-line-drawing-svg-path-%E5%8A%A8%E7%94%BB-%E8%B7%AF%E5%BE%84/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末将塑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蝌麸,更是在濱河造成了極大的恐慌点寥,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件来吩,死亡現(xiàn)場(chǎng)離奇詭異敢辩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弟疆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門戚长,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怠苔,你說我怎么就攤上這事同廉。” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵恤溶,是天一觀的道長(zhǎng)乓诽。 經(jīng)常有香客問我,道長(zhǎng)咒程,這世上最難降的妖魔是什么鸠天? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮帐姻,結(jié)果婚禮上稠集,老公的妹妹穿的比我還像新娘。我一直安慰自己饥瓷,他們只是感情好剥纷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呢铆,像睡著了一般晦鞋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棺克,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天悠垛,我揣著相機(jī)與錄音,去河邊找鬼娜谊。 笑死确买,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纱皆。 我是一名探鬼主播湾趾,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼派草!你這毒婦竟也來了搀缠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤近迁,失蹤者是張志新(化名)和其女友劉穎胡嘿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钳踊,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年勿侯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拓瞪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡助琐,死狀恐怖祭埂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤蛆橡,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布舌界,位于F島的核電站,受9級(jí)特大地震影響泰演,放射性物質(zhì)發(fā)生泄漏呻拌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一睦焕、第九天 我趴在偏房一處隱蔽的房頂上張望藐握。 院中可真熱鬧,春花似錦垃喊、人聲如沸猾普。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)初家。三九已至,卻和暖如春乌助,著一層夾襖步出監(jiān)牢的瞬間溜在,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工眷茁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炕泳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓上祈,卻偏偏與公主長(zhǎng)得像培遵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子登刺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容