TL;DR本文主要是講解關(guān)于 SVG 的一些高級動畫特效,比如 SVG 動畫標簽,圖形漸變,路徑動畫,線條動畫,SVG 裁剪等。 例如:路徑動畫 圖形漸變: 線條動畫: 以及,相關(guān)的動畫的矩陣知識,這個也是現(xiàn)在 CSS 動畫里面最重要,同時也是最為欠缺的知識點: 文章會先從基本語法入手,然后,慢慢深入。介紹一些動畫基本原理和對應(yīng)的數(shù)學(xué)原理知識點。并且文章后面,還附有相關(guān)語法的介紹,當你在遇到不熟悉語法的時候可以參考參考。 前面一篇文章,主要介紹了一些 SVG 的基本概念和基本圖形。接下來我們需要了解一下,SVG 處理矢量這個特性之外,還有啥內(nèi)容吸引我們,能讓 SVG 現(xiàn)在普及度這么高? 原文參考:前端小吉米 SVG Animation在 SVG 中,如果我們想實現(xiàn)一個動畫效果,可以使用 CSS,JS,或者直接使用 SVG 中自帶的 使用 CSS 的話,有兩種選擇一種是通過
而使用 SVG 中自定的 先看一個 SVG animate DEMO:
通過將 animate 標簽嵌套在指定的圖形里面,即可實現(xiàn)變換的效果。另外,還有 animateTransform,它主要是用來做變形動畫的。
簡單來說:
里面一些技術(shù)細節(jié)我們這里就不過多講解了。這里,主要想介紹一下 animate 中的 morph 的效果。 animate morph該效果主要做的就是圖形內(nèi)部的漸變。如圖: 這種動畫是怎么實現(xiàn)呢? 直接看代碼吧:
這么多,是不是感覺有點懵逼。不過,我們細分來看一下其實很簡單。里面主要是利用
而 values 就很簡單了。它是直接結(jié)合 像上面那樣,可以在指定元素里面嵌套多個 animate,既實現(xiàn)了形狀的改變,又實現(xiàn)了顏色的改變。Morph 比較常用于數(shù)字的更迭,比如,倒數(shù) 10s 的相關(guān)動畫。到這里,Morpah 相關(guān)的知識點就結(jié)束了。 接著,讓我們來看一下 SVG 中,另外一非常重要的標簽 -- 該標簽可以讓指定的元素,繞著指定的路徑進行運動。所以這對于復(fù)雜的路徑來說非常有用,因為我們很難使用 transform 去模擬復(fù)雜的變換路徑??匆粋€ DEMO animateMotionanimateMotion 大致的屬性和 這些屬性,我們慢慢介紹,先從最簡單的開始吧。首先,我們來看一個 DEMO:
如果,你想要更復(fù)雜的路徑,可以直接使用
或者使用
動畫效果為: 所以,一般而言我們在定義 AM 的路徑的時候,只用一種方式定義即可,否則會發(fā)生相應(yīng)的覆蓋: 在 AM 運動中,還有一個很重要的概念就是旋轉(zhuǎn)角。默認情況下,運動物體的角度是按照它和坐標軸的初始角度確定的。例如: 這樣看起來確實有些別扭,那能不能讓物體垂直于路徑進行運動呢? 有的,根據(jù)
例如:
在動畫設(shè)置標簽中,還有一個更簡單的-- set該標簽也是用來模擬 有的,因為 set 針對于所有屬性,甚至包括 style 里面的相關(guān) CSS 屬性。所以,可以靠它來很好描述一些非
矩陣動畫上面差不多簡單闡述了關(guān)于 SVG 一些比較有特點的動畫。當然,還有比較重要的線條動畫,這個我們放到后面進行講解。這里先來看一下所有動畫中,非常重要的矩陣原理。線性代數(shù)應(yīng)該是大學(xué)里面來說,最容易學(xué)的一門科目,MD。。。還記得,大學(xué)線代期末考試的時候,100 分的同學(xué)應(yīng)該說是如韭菜地般,一抓一大片(對不起,我沒能和他們同流合污。) 那矩陣是如何在動畫中使用的呢? 簡單的說,矩陣中的每個元素其實可以等價代換為每個因式里面的系數(shù): 上面也叫作 三維矩陣。即,它涉及到 x,y,z 軸的計算。那對于我們平面 2D 變換來說,那么此時矩陣又是哪種形式呢? 很簡單,只要將 z 軸永遠置為一個常數(shù)就 OK。這里,慣例上是直接取 0 0 1 來設(shè)置。 不信的話,大家只要代進去乘以乘,應(yīng)該就可以得到結(jié)果了。所以,在二維中,具體變換方式為: 后面,我們也會依據(jù)這個公式進行相關(guān)的變形操作。那矩陣變換是怎么運用到 CSS/SVG 當中呢? 在 CSS 中,是直接使用
當然,在 SVG 中也是一樣的:
所以,我們主要的重點就是講解一下
對應(yīng)于我們上面的公式有: 在接觸
實際上,在底層還是使用 matrix 實現(xiàn)的變換。就拿 translate 舉個例子吧。 translate 的格式為:
相當于參考當前原點,在 x/y 軸上移動 dx/dy 的距離。那么映射到矩陣,應(yīng)該如何表示呢? 很簡單,它等同于:
使用代數(shù)證明一下: 假設(shè)有 變?yōu)榫仃嚍椋?/p> 根據(jù),上面的表達式有:
所以,就是 X 在原有 X 軸坐標上向右移動 20 的距離,Y 相對于原有移動 30 的距離。 那么其他幾個屬性呢?也是怎么變化的嗎? 恩,類似。只是里面取值不一樣:
注意,上面三個都會改變原有物體的坐標系?。?! 這點很重要,換句話說,后面每次變換都是基于前面一個的變換結(jié)果的。 詳情看圖: 詳情可以參考:MDN matrix 不過,這并不是我們使用 matrix 的重點,也不是它的優(yōu)勢。它的優(yōu)勢在于可計算,即,能夠?qū)?fù)雜的動畫集合到一個表達式中,并且,后續(xù)的變換可以直接基于當前的 matrix。 我們先來了解一下,如果多個變換動畫一起使用,matrix 應(yīng)該如何表達呢? 只需要找到我們變換動畫對應(yīng)的矩陣,然后相乘即可。例如,先旋轉(zhuǎn) 45°,然后放大 1.5 倍,則有變換動畫為:
注意,雖然,你定義動畫是分開的,但此時的動畫是同時進行的。為啥?因為,這兩個動畫實際上可以整合成為一個變換矩陣: 并且,位置是不可以調(diào)換的。比如, 而上面強調(diào)的順序關(guān)系,實際上就可以理解為矩陣不滿足交換律的原則。因為一旦交換,結(jié)果很可能不一樣。 矩陣高級用法上面的內(nèi)容只是簡單的描述了關(guān)于矩陣的概念。在實際中,矩陣可以說是真正利器。 假設(shè)現(xiàn)在有一個動畫,要求你將一個物體從一個點通過拋物線的方式移動到另外一個點,那么此時要求 JS/CSS 隨你挑。此時,你會不會感覺,呼吸急促,頭腦發(fā)熱呢? 恩,matrix 可以治,而且包治百病。不過,matrix 有一個限制點,它只能用于一次線性動畫表達式。即,針對于拋物線,橢圓曲線這類復(fù)雜曲線來說,不太合適。那么有什么辦法嗎? 有的,微分思想。每一段動畫其實都可以通過一定范圍內(nèi)的直線拼接而成,那么這樣,我們就可以將一段拋物線拆分為由幾段線段構(gòu)成的曲線。當然,如果你分的越細,擬合度就越高。這里我們不打算過度你和,我們簡單的將一段拋物線分為 5段。 如圖: 那么接下來就是摳細節(jié)。這里,依次取傾角為 45°,30°,0°,-45°,-30° 這 5 段直線。每段分配的時間比例為 20%、25%、10%、25%、20% 這主要是用于 keyframe 的設(shè)定。現(xiàn)在,用數(shù)學(xué)來分析一下,這個動畫到底該怎么弄。 現(xiàn)在,已知兩點之間的距離為 100px。那么我們同樣根據(jù)上述比例分,則有 20px, 25px, 10px, 25px, 20px。 這里我們以 45° 傾角為參考點,則終點坐標為 (20,20); 。那么,該段的矩陣為:
CSS 中的變形動畫為:
然后,第二段就為:
使用矩陣的乘法法,則有:
變形動畫為:
剩余幾段也是這樣的做法。最終,整個 keyframe 就應(yīng)該表示為:
整個動畫過程差不多都是這樣。當然,矩陣也不僅僅局限于這幾個動畫,憑借著高度定制化和靈活性的特點,這它還常常用于進行回彈,彈跳等動畫中。如果大家有興趣,后期也可以對這類動畫進行簡單的講解。 后面,我們最后來了解一下 SVG 中很重要的線條動畫。 線條動畫SVG 中的線條動畫常常用作過渡屏(splash screen)中。例如: 或者,一些比較炫酷的 LOGO 中,比如 AllowTeam 的: 看到這些炫酷的效果,大家有沒有動心想學(xué)一學(xué),看看自己到底能否做的這么好呢? OK,我們現(xiàn)在來正式介紹一下線條動畫。在 SVG 中,最長用到的線條標簽就是 而在具體變化當中用到的是關(guān)于
放大看有: 另外,stroke-dasharray 并不局限于只能設(shè)置兩個值,要知道,它本身的含義是設(shè)置最小重復(fù)單元,即, 放大看則有:
而實際理解的話,就是假設(shè)當 width 為 1。此時比例為 2。那么 miter = 2。那么超過 2 的 miter 部分則會被 cut 掉??梢詤⒄眨?/p> 他主要是配合
OK,介紹完關(guān)于 path 的所有 stroke 屬性之后,我們就要開始動手寫一下讓線條動起來的代碼。簡單來說,就是通過
不過,這里我們不打算使用 Path 來做啥復(fù)雜的動畫,這主要考慮到手頭沒有一些 SVG 生成工具。所以,這里我們就以 Text 來做吧(因為做起來真的簡單)。 這里,先以 IV-WEB 這段文字來做動畫。 先給大家看一下最終結(jié)果: 那么這種動畫是怎么做的呢? 這里,我主要介紹一下關(guān)于 CSS 相關(guān),SVG 就一個 Text 我直接貼代碼了:
上面是通過創(chuàng)建一個居中定位的字體,然后使用 3 個 text 重疊。具體 CSS 我們下面來說一下。首先,我們營造的效果是從無到有,就需要使用
然后,通過
下面才是重點內(nèi)容。此時,這 3 個 text 的起始點重合。我現(xiàn)在既要他們在運行時不完全重合,又要他們的線條能進行滾動。不啰嗦了,直接看代碼吧:
這就是上面 3 個不同的 text 運用的動畫。 大致過程就是這樣,詳情可以查看: IVWEB 線條動畫。
具體效果如圖: 給點提示:
后面看看這篇文章反響如何,到時候再決定是否再寫一篇續(xù)集,介紹該作業(yè)的原理。 SVG 文字在 SVG 中定義文字直接使用 text-anchor用來定義參考點和實際字符之間的定位關(guān)系。格式為:
直接看代碼解釋吧:
第一個 A,參考的是 (60,40) 的點,定義為 而剩下兩個也是同樣的道理: tspan現(xiàn)在,假如我們想在 text 里面添加一些特殊的字符效果,比如斜體,加粗等。由于,text 標簽不能實現(xiàn)嵌套,所以,為了解決這個痛點,提出了
tspan 里面同樣可以自定義相關(guān)的自身屬性。詳細的可以參考 tspan 我這里就不詳述了。 在 Path 展示 textText 一般可以橫放,豎放。那有沒有啥辦法讓文字可以按照一定的路徑任意排放呢? 有的,這里可以使用
如圖: 具體細節(jié)我這里就不多說了。 Clip在 DOM 中如果想展示一個圖片的部分,或者以某種形狀展示圖片的部分,一般是通過一個 cover div 來實現(xiàn)的。不過,如果涉及到不規(guī)則圖形的話,那么 DOM 就有天生缺陷了(當然使用 CSS 里的 clipPath 里面可以接任何圖形,比如,path,rect 甚至是 text。使用的時候,直接在 style 中,指定
或者說,如果我們想畫一個圓的裁剪區(qū)域的話:
Appendix 參考標簽g分組標簽應(yīng)該毫無意外排第一,因為其實作為繪制圖形中最常和最基本的標簽。前面一篇文章也主要介紹過了,這里做點補充。 每一個分組標簽都帶有 因為,后面我們可以使用該 id 標簽添加動畫,重用該分組等。
每個分組里面可以含有一些描述標簽,比如
use該標簽就是結(jié)合
里面使用 defs用來保存一些代碼,使其不會被瀏覽器解析。并且里面的分組可以被 use 屬性的 style 樣式所覆蓋。
symbol該標簽和 恩,確實。不過,defs 是官方推薦,用來包裹一些模板 svg 代碼而創(chuàng)造出來,用來增加可讀性的標簽。而 symbol 是存粹的作為一個模板。它可以獨立于 svg 的 viewbox 來自定義子 viewbox 和 preserveAspectRatio。
同樣使用該模板,也是使用 image既然 這時候,就需要用到
同樣,該
markermarker 一般是用來畫箭頭或者線段始末的標識圖形。
如圖: 這里我們只需要里了解即可,因為在實際畫的時候,直接使用相關(guān)工具生成更加方便。 a這里的 a 標簽和我們直接在 HTML 使用的超鏈接 a 標簽類似。也是用來定義一個外鏈的。
個人公眾號SVG 動畫精髓24
TL;DR本文主要是講解關(guān)于 SVG 的一些高級動畫特效,比如 SVG 動畫標簽,圖形漸變,路徑動畫,線條動畫,SVG 裁剪等。 例如:路徑動畫 圖形漸變: 線條動畫: 以及,相關(guān)的動畫的矩陣知識,這個也是現(xiàn)在 CSS 動畫里面最重要,同時也是最為欠缺的知識點: 文章會先從基本語法入手,然后,慢慢深入。介紹一些動畫基本原理和對應(yīng)的數(shù)學(xué)原理知識點。并且文章后面,還附有相關(guān)語法的介紹,當你在遇到不熟悉語法的時候可以參考參考。 前面一篇文章,主要介紹了一些 SVG 的基本概念和基本圖形。接下來我們需要了解一下,SVG 處理矢量這個特性之外,還有啥內(nèi)容吸引我們,能讓 SVG 現(xiàn)在普及度這么高? 原文參考:前端小吉米 SVG Animation在 SVG 中,如果我們想實現(xiàn)一個動畫效果,可以使用 CSS,JS,或者直接使用 SVG 中自帶的 使用 CSS 的話,有兩種選擇一種是通過
而使用 SVG 中自定的 先看一個 SVG animate DEMO:
通過將 animate 標簽嵌套在指定的圖形里面,即可實現(xiàn)變換的效果。另外,還有 animateTransform,它主要是用來做變形動畫的。
簡單來說:
里面一些技術(shù)細節(jié)我們這里就不過多講解了。這里,主要想介紹一下 animate 中的 morph 的效果。 animate morph該效果主要做的就是圖形內(nèi)部的漸變。如圖: 這種動畫是怎么實現(xiàn)呢? 直接看代碼吧:
這么多,是不是感覺有點懵逼。不過,我們細分來看一下其實很簡單。里面主要是利用
而 values 就很簡單了。它是直接結(jié)合 像上面那樣,可以在指定元素里面嵌套多個 animate,既實現(xiàn)了形狀的改變,又實現(xiàn)了顏色的改變。Morph 比較常用于數(shù)字的更迭,比如,倒數(shù) 10s 的相關(guān)動畫。到這里,Morpah 相關(guān)的知識點就結(jié)束了。 接著,讓我們來看一下 SVG 中,另外一非常重要的標簽 -- 該標簽可以讓指定的元素,繞著指定的路徑進行運動。所以這對于復(fù)雜的路徑來說非常有用,因為我們很難使用 transform 去模擬復(fù)雜的變換路徑??匆粋€ DEMO animateMotionanimateMotion 大致的屬性和 這些屬性,我們慢慢介紹,先從最簡單的開始吧。首先,我們來看一個 DEMO:
如果,你想要更復(fù)雜的路徑,可以直接使用
或者使用
動畫效果為: 所以,一般而言我們在定義 AM 的路徑的時候,只用一種方式定義即可,否則會發(fā)生相應(yīng)的覆蓋: 在 AM 運動中,還有一個很重要的概念就是旋轉(zhuǎn)角。默認情況下,運動物體的角度是按照它和坐標軸的初始角度確定的。例如: 這樣看起來確實有些別扭,那能不能讓物體垂直于路徑進行運動呢? 有的,根據(jù)
例如:
在動畫設(shè)置標簽中,還有一個更簡單的-- set該標簽也是用來模擬 有的,因為 set 針對于所有屬性,甚至包括 style 里面的相關(guān) CSS 屬性。所以,可以靠它來很好描述一些非
矩陣動畫上面差不多簡單闡述了關(guān)于 SVG 一些比較有特點的動畫。當然,還有比較重要的線條動畫,這個我們放到后面進行講解。這里先來看一下所有動畫中,非常重要的矩陣原理。線性代數(shù)應(yīng)該是大學(xué)里面來說,最容易學(xué)的一門科目,MD。。。還記得,大學(xué)線代期末考試的時候,100 分的同學(xué)應(yīng)該說是如韭菜地般,一抓一大片(對不起,我沒能和他們同流合污。) 那矩陣是如何在動畫中使用的呢? 簡單的說,矩陣中的每個元素其實可以等價代換為每個因式里面的系數(shù): 上面也叫作 三維矩陣。即,它涉及到 x,y,z 軸的計算。那對于我們平面 2D 變換來說,那么此時矩陣又是哪種形式呢? 很簡單,只要將 z 軸永遠置為一個常數(shù)就 OK。這里,慣例上是直接取 0 0 1 來設(shè)置。 不信的話,大家只要代進去乘以乘,應(yīng)該就可以得到結(jié)果了。所以,在二維中,具體變換方式為: 后面,我們也會依據(jù)這個公式進行相關(guān)的變形操作。那矩陣變換是怎么運用到 CSS/SVG 當中呢? 在 CSS 中,是直接使用
當然,在 SVG 中也是一樣的:
所以,我們主要的重點就是講解一下
對應(yīng)于我們上面的公式有: 在接觸
實際上,在底層還是使用 matrix 實現(xiàn)的變換。就拿 translate 舉個例子吧。 translate 的格式為:
相當于參考當前原點,在 x/y 軸上移動 dx/dy 的距離。那么映射到矩陣,應(yīng)該如何表示呢? 很簡單,它等同于:
使用代數(shù)證明一下: 假設(shè)有 變?yōu)榫仃嚍椋?/p> 根據(jù),上面的表達式有:
所以,就是 X 在原有 X 軸坐標上向右移動 20 的距離,Y 相對于原有移動 30 的距離。 那么其他幾個屬性呢?也是怎么變化的嗎? 恩,類似。只是里面取值不一樣:
注意,上面三個都會改變原有物體的坐標系?。?! 這點很重要,換句話說,后面每次變換都是基于前面一個的變換結(jié)果的。 詳情看圖: 詳情可以參考:MDN matrix 不過,這并不是我們使用 matrix 的重點,也不是它的優(yōu)勢。它的優(yōu)勢在于可計算,即,能夠?qū)?fù)雜的動畫集合到一個表達式中,并且,后續(xù)的變換可以直接基于當前的 matrix。 我們先來了解一下,如果多個變換動畫一起使用,matrix 應(yīng)該如何表達呢? 只需要找到我們變換動畫對應(yīng)的矩陣,然后相乘即可。例如,先旋轉(zhuǎn) 45°,然后放大 1.5 倍,則有變換動畫為:
注意,雖然,你定義動畫是分開的,但此時的動畫是同時進行的。為啥?因為,這兩個動畫實際上可以整合成為一個變換矩陣: 并且,位置是不可以調(diào)換的。比如, 而上面強調(diào)的順序關(guān)系,實際上就可以理解為矩陣不滿足交換律的原則。因為一旦交換,結(jié)果很可能不一樣。 矩陣高級用法上面的內(nèi)容只是簡單的描述了關(guān)于矩陣的概念。在實際中,矩陣可以說是真正利器。 假設(shè)現(xiàn)在有一個動畫,要求你將一個物體從一個點通過拋物線的方式移動到另外一個點,那么此時要求 JS/CSS 隨你挑。此時,你會不會感覺,呼吸急促,頭腦發(fā)熱呢? 恩,matrix 可以治,而且包治百病。不過,matrix 有一個限制點,它只能用于一次線性動畫表達式。即,針對于拋物線,橢圓曲線這類復(fù)雜曲線來說,不太合適。那么有什么辦法嗎? 有的,微分思想。每一段動畫其實都可以通過一定范圍內(nèi)的直線拼接而成,那么這樣,我們就可以將一段拋物線拆分為由幾段線段構(gòu)成的曲線。當然,如果你分的越細,擬合度就越高。這里我們不打算過度你和,我們簡單的將一段拋物線分為 5段。 如圖: 那么接下來就是摳細節(jié)。這里,依次取傾角為 45°,30°,0°,-45°,-30° 這 5 段直線。每段分配的時間比例為 20%、25%、10%、25%、20% 這主要是用于 keyframe 的設(shè)定?,F(xiàn)在,用數(shù)學(xué)來分析一下,這個動畫到底該怎么弄。 現(xiàn)在,已知兩點之間的距離為 100px。那么我們同樣根據(jù)上述比例分,則有 20px, 25px, 10px, 25px, 20px。 這里我們以 45° 傾角為參考點,則終點坐標為 (20,20); 。那么,該段的矩陣為:
CSS 中的變形動畫為:
然后,第二段就為:
使用矩陣的乘法法,則有:
變形動畫為:
剩余幾段也是這樣的做法。最終,整個 keyframe 就應(yīng)該表示為:
整個動畫過程差不多都是這樣。當然,矩陣也不僅僅局限于這幾個動畫,憑借著高度定制化和靈活性的特點,這它還常常用于進行回彈,彈跳等動畫中。如果大家有興趣,后期也可以對這類動畫進行簡單的講解。 后面,我們最后來了解一下 SVG 中很重要的線條動畫。 線條動畫SVG 中的線條動畫常常用作過渡屏(splash screen)中。例如: 或者,一些比較炫酷的 LOGO 中,比如 AllowTeam 的: 看到這些炫酷的效果,大家有沒有動心想學(xué)一學(xué),看看自己到底能否做的這么好呢? OK,我們現(xiàn)在來正式介紹一下線條動畫。在 SVG 中,最長用到的線條標簽就是 而在具體變化當中用到的是關(guān)于
放大看有: 另外,stroke-dasharray 并不局限于只能設(shè)置兩個值,要知道,它本身的含義是設(shè)置最小重復(fù)單元,即, 放大看則有:
而實際理解的話,就是假設(shè)當 width 為 1。此時比例為 2。那么 miter = 2。那么超過 2 的 miter 部分則會被 cut 掉??梢詤⒄眨?/p> 他主要是配合
OK,介紹完關(guān)于 path 的所有 stroke 屬性之后,我們就要開始動手寫一下讓線條動起來的代碼。簡單來說,就是通過
不過,這里我們不打算使用 Path 來做啥復(fù)雜的動畫,這主要考慮到手頭沒有一些 SVG 生成工具。所以,這里我們就以 Text 來做吧(因為做起來真的簡單)。 這里,先以 IV-WEB 這段文字來做動畫。 先給大家看一下最終結(jié)果: 那么這種動畫是怎么做的呢? 這里,我主要介紹一下關(guān)于 CSS 相關(guān),SVG 就一個 Text 我直接貼代碼了:
上面是通過創(chuàng)建一個居中定位的字體,然后使用 3 個 text 重疊。具體 CSS 我們下面來說一下。首先,我們營造的效果是從無到有,就需要使用
然后,通過
下面才是重點內(nèi)容。此時,這 3 個 text 的起始點重合。我現(xiàn)在既要他們在運行時不完全重合,又要他們的線條能進行滾動。不啰嗦了,直接看代碼吧:
這就是上面 3 個不同的 text 運用的動畫。 大致過程就是這樣,詳情可以查看: IVWEB 線條動畫。
具體效果如圖: 給點提示:
后面看看這篇文章反響如何,到時候再決定是否再寫一篇續(xù)集,介紹該作業(yè)的原理。 SVG 文字在 SVG 中定義文字直接使用 text-anchor用來定義參考點和實際字符之間的定位關(guān)系。格式為:
直接看代碼解釋吧:
第一個 A,參考的是 (60,40) 的點,定義為 而剩下兩個也是同樣的道理: tspan現(xiàn)在,假如我們想在 text 里面添加一些特殊的字符效果,比如斜體,加粗等。由于,text 標簽不能實現(xiàn)嵌套,所以,為了解決這個痛點,提出了
tspan 里面同樣可以自定義相關(guān)的自身屬性。詳細的可以參考 tspan 我這里就不詳述了。 在 Path 展示 textText 一般可以橫放,豎放。那有沒有啥辦法讓文字可以按照一定的路徑任意排放呢? 有的,這里可以使用
如圖: 具體細節(jié)我這里就不多說了。 Clip在 DOM 中如果想展示一個圖片的部分,或者以某種形狀展示圖片的部分,一般是通過一個 cover div 來實現(xiàn)的。不過,如果涉及到不規(guī)則圖形的話,那么 DOM 就有天生缺陷了(當然使用 CSS 里的 clipPath 里面可以接任何圖形,比如,path,rect 甚至是 text。使用的時候,直接在 style 中,指定
或者說,如果我們想畫一個圓的裁剪區(qū)域的話:
Appendix 參考標簽g分組標簽應(yīng)該毫無意外排第一,因為其實作為繪制圖形中最常和最基本的標簽。前面一篇文章也主要介紹過了,這里做點補充。 每一個分組標簽都帶有 因為,后面我們可以使用該 id 標簽添加動畫,重用該分組等。
每個分組里面可以含有一些描述標簽,比如
use該標簽就是結(jié)合
里面使用 defs用來保存一些代碼,使其不會被瀏覽器解析。并且里面的分組可以被 use 屬性的 style 樣式所覆蓋。
symbol該標簽和 恩,確實。不過,defs 是官方推薦,用來包裹一些模板 svg 代碼而創(chuàng)造出來,用來增加可讀性的標簽。而 symbol 是存粹的作為一個模板。它可以獨立于 svg 的 viewbox 來自定義子 viewbox 和 preserveAspectRatio。
同樣使用該模板,也是使用 image既然 這時候,就需要用到
同樣,該
markermarker 一般是用來畫箭頭或者線段始末的標識圖形。
如圖: 這里我們只需要里了解即可,因為在實際畫的時候,直接使用相關(guān)工具生成更加方便。 a這里的 a 標簽和我們直接在 HTML 使用的超鏈接 a 標簽類似。也是用來定義一個外鏈的。
TL;DR本文主要是講解關(guān)于 SVG 的一些高級動畫特效,比如 SVG 動畫標簽,圖形漸變,路徑動畫,線條動畫,SVG 裁剪等。 例如:路徑動畫 圖形漸變: 線條動畫: 以及,相關(guān)的動畫的矩陣知識,這個也是現(xiàn)在 CSS 動畫里面最重要,同時也是最為欠缺的知識點: 文章會先從基本語法入手,然后,慢慢深入。介紹一些動畫基本原理和對應(yīng)的數(shù)學(xué)原理知識點。并且文章后面,還附有相關(guān)語法的介紹,當你在遇到不熟悉語法的時候可以參考參考。 前面一篇文章,主要介紹了一些 SVG 的基本概念和基本圖形。接下來我們需要了解一下,SVG 處理矢量這個特性之外,還有啥內(nèi)容吸引我們,能讓 SVG 現(xiàn)在普及度這么高? 原文參考:前端小吉米 SVG Animation在 SVG 中,如果我們想實現(xiàn)一個動畫效果,可以使用 CSS,JS,或者直接使用 SVG 中自帶的 使用 CSS 的話,有兩種選擇一種是通過
而使用 SVG 中自定的 先看一個 SVG animate DEMO:
通過將 animate 標簽嵌套在指定的圖形里面,即可實現(xiàn)變換的效果。另外,還有 animateTransform,它主要是用來做變形動畫的。
簡單來說:
里面一些技術(shù)細節(jié)我們這里就不過多講解了。這里,主要想介紹一下 animate 中的 morph 的效果。 animate morph該效果主要做的就是圖形內(nèi)部的漸變。如圖: 這種動畫是怎么實現(xiàn)呢? 直接看代碼吧:
這么多,是不是感覺有點懵逼。不過,我們細分來看一下其實很簡單。里面主要是利用
而 values 就很簡單了。它是直接結(jié)合 像上面那樣,可以在指定元素里面嵌套多個 animate,既實現(xiàn)了形狀的改變,又實現(xiàn)了顏色的改變。Morph 比較常用于數(shù)字的更迭,比如,倒數(shù) 10s 的相關(guān)動畫。到這里,Morpah 相關(guān)的知識點就結(jié)束了。 接著,讓我們來看一下 SVG 中,另外一非常重要的標簽 -- 該標簽可以讓指定的元素,繞著指定的路徑進行運動。所以這對于復(fù)雜的路徑來說非常有用,因為我們很難使用 transform 去模擬復(fù)雜的變換路徑??匆粋€ DEMO animateMotionanimateMotion 大致的屬性和 這些屬性,我們慢慢介紹,先從最簡單的開始吧。首先,我們來看一個 DEMO:
如果,你想要更復(fù)雜的路徑,可以直接使用
或者使用
動畫效果為: 所以,一般而言我們在定義 AM 的路徑的時候,只用一種方式定義即可,否則會發(fā)生相應(yīng)的覆蓋: 在 AM 運動中,還有一個很重要的概念就是旋轉(zhuǎn)角。默認情況下,運動物體的角度是按照它和坐標軸的初始角度確定的。例如: 這樣看起來確實有些別扭,那能不能讓物體垂直于路徑進行運動呢? 有的,根據(jù)
例如:
在動畫設(shè)置標簽中,還有一個更簡單的-- set該標簽也是用來模擬 有的,因為 set 針對于所有屬性,甚至包括 style 里面的相關(guān) CSS 屬性。所以,可以靠它來很好描述一些非
矩陣動畫上面差不多簡單闡述了關(guān)于 SVG 一些比較有特點的動畫。當然,還有比較重要的線條動畫,這個我們放到后面進行講解。這里先來看一下所有動畫中,非常重要的矩陣原理。線性代數(shù)應(yīng)該是大學(xué)里面來說,最容易學(xué)的一門科目,MD。。。還記得,大學(xué)線代期末考試的時候,100 分的同學(xué)應(yīng)該說是如韭菜地般,一抓一大片(對不起,我沒能和他們同流合污。) 那矩陣是如何在動畫中使用的呢? 簡單的說,矩陣中的每個元素其實可以等價代換為每個因式里面的系數(shù): 上面也叫作 三維矩陣。即,它涉及到 x,y,z 軸的計算。那對于我們平面 2D 變換來說,那么此時矩陣又是哪種形式呢? 很簡單,只要將 z 軸永遠置為一個常數(shù)就 OK。這里,慣例上是直接取 0 0 1 來設(shè)置。 不信的話,大家只要代進去乘以乘,應(yīng)該就可以得到結(jié)果了。所以,在二維中,具體變換方式為: 后面,我們也會依據(jù)這個公式進行相關(guān)的變形操作。那矩陣變換是怎么運用到 CSS/SVG 當中呢? 在 CSS 中,是直接使用
當然,在 SVG 中也是一樣的:
所以,我們主要的重點就是講解一下
對應(yīng)于我們上面的公式有: 在接觸
實際上,在底層還是使用 matrix 實現(xiàn)的變換。就拿 translate 舉個例子吧。 translate 的格式為:
相當于參考當前原點,在 x/y 軸上移動 dx/dy 的距離。那么映射到矩陣,應(yīng)該如何表示呢? 很簡單,它等同于:
使用代數(shù)證明一下: 假設(shè)有 變?yōu)榫仃嚍椋?/p> 根據(jù),上面的表達式有:
所以,就是 X 在原有 X 軸坐標上向右移動 20 的距離,Y 相對于原有移動 30 的距離。 那么其他幾個屬性呢?也是怎么變化的嗎? 恩,類似。只是里面取值不一樣:
注意,上面三個都會改變原有物體的坐標系?。?! 這點很重要,換句話說,后面每次變換都是基于前面一個的變換結(jié)果的。 詳情看圖: 詳情可以參考:MDN matrix 不過,這并不是我們使用 matrix 的重點,也不是它的優(yōu)勢。它的優(yōu)勢在于可計算,即,能夠?qū)?fù)雜的動畫集合到一個表達式中,并且,后續(xù)的變換可以直接基于當前的 matrix。 我們先來了解一下,如果多個變換動畫一起使用,matrix 應(yīng)該如何表達呢? 只需要找到我們變換動畫對應(yīng)的矩陣,然后相乘即可。例如,先旋轉(zhuǎn) 45°,然后放大 1.5 倍,則有變換動畫為:
注意,雖然,你定義動畫是分開的,但此時的動畫是同時進行的。為啥?因為,這兩個動畫實際上可以整合成為一個變換矩陣: 并且,位置是不可以調(diào)換的。比如, 而上面強調(diào)的順序關(guān)系,實際上就可以理解為矩陣不滿足交換律的原則。因為一旦交換,結(jié)果很可能不一樣。 矩陣高級用法上面的內(nèi)容只是簡單的描述了關(guān)于矩陣的概念。在實際中,矩陣可以說是真正利器。 假設(shè)現(xiàn)在有一個動畫,要求你將一個物體從一個點通過拋物線的方式移動到另外一個點,那么此時要求 JS/CSS 隨你挑。此時,你會不會感覺,呼吸急促,頭腦發(fā)熱呢? 恩,matrix 可以治,而且包治百病。不過,matrix 有一個限制點,它只能用于一次線性動畫表達式。即,針對于拋物線,橢圓曲線這類復(fù)雜曲線來說,不太合適。那么有什么辦法嗎? 有的,微分思想。每一段動畫其實都可以通過一定范圍內(nèi)的直線拼接而成,那么這樣,我們就可以將一段拋物線拆分為由幾段線段構(gòu)成的曲線。當然,如果你分的越細,擬合度就越高。這里我們不打算過度你和,我們簡單的將一段拋物線分為 5段。 如圖: 那么接下來就是摳細節(jié)。這里,依次取傾角為 45°,30°,0°,-45°,-30° 這 5 段直線。每段分配的時間比例為 20%、25%、10%、25%、20% 這主要是用于 keyframe 的設(shè)定?,F(xiàn)在,用數(shù)學(xué)來分析一下,這個動畫到底該怎么弄。 現(xiàn)在,已知兩點之間的距離為 100px。那么我們同樣根據(jù)上述比例分,則有 20px, 25px, 10px, 25px, 20px。 這里我們以 45° 傾角為參考點,則終點坐標為 (20,20); 。那么,該段的矩陣為:
CSS 中的變形動畫為:
然后,第二段就為:
使用矩陣的乘法法,則有:
變形動畫為:
剩余幾段也是這樣的做法。最終,整個 keyframe 就應(yīng)該表示為:
整個動畫過程差不多都是這樣。當然,矩陣也不僅僅局限于這幾個動畫,憑借著高度定制化和靈活性的特點,這它還常常用于進行回彈,彈跳等動畫中。如果大家有興趣,后期也可以對這類動畫進行簡單的講解。 后面,我們最后來了解一下 SVG 中很重要的線條動畫。 線條動畫SVG 中的線條動畫常常用作過渡屏(splash screen)中。例如: 或者,一些比較炫酷的 LOGO 中,比如 AllowTeam 的: 看到這些炫酷的效果,大家有沒有動心想學(xué)一學(xué),看看自己到底能否做的這么好呢? OK,我們現(xiàn)在來正式介紹一下線條動畫。在 SVG 中,最長用到的線條標簽就是 而在具體變化當中用到的是關(guān)于
放大看有: 另外,stroke-dasharray 并不局限于只能設(shè)置兩個值,要知道,它本身的含義是設(shè)置最小重復(fù)單元,即, 放大看則有:
而實際理解的話,就是假設(shè)當 width 為 1。此時比例為 2。那么 miter = 2。那么超過 2 的 miter 部分則會被 cut 掉。可以參照: 他主要是配合
OK,介紹完關(guān)于 path 的所有 stroke 屬性之后,我們就要開始動手寫一下讓線條動起來的代碼。簡單來說,就是通過
不過,這里我們不打算使用 Path 來做啥復(fù)雜的動畫,這主要考慮到手頭沒有一些 SVG 生成工具。所以,這里我們就以 Text 來做吧(因為做起來真的簡單)。 這里,先以 IV-WEB 這段文字來做動畫。 先給大家看一下最終結(jié)果: 那么這種動畫是怎么做的呢? 這里,我主要介紹一下關(guān)于 CSS 相關(guān),SVG 就一個 Text 我直接貼代碼了:
上面是通過創(chuàng)建一個居中定位的字體,然后使用 3 個 text 重疊。具體 CSS 我們下面來說一下。首先,我們營造的效果是從無到有,就需要使用
然后,通過
下面才是重點內(nèi)容。此時,這 3 個 text 的起始點重合。我現(xiàn)在既要他們在運行時不完全重合,又要他們的線條能進行滾動。不啰嗦了,直接看代碼吧:
這就是上面 3 個不同的 text 運用的動畫。 大致過程就是這樣,詳情可以查看: IVWEB 線條動畫。
具體效果如圖: 給點提示:
后面看看這篇文章反響如何,到時候再決定是否再寫一篇續(xù)集,介紹該作業(yè)的原理。 SVG 文字在 SVG 中定義文字直接使用 text-anchor用來定義參考點和實際字符之間的定位關(guān)系。格式為:
直接看代碼解釋吧:
第一個 A,參考的是 (60,40) 的點,定義為 而剩下兩個也是同樣的道理: tspan現(xiàn)在,假如我們想在 text 里面添加一些特殊的字符效果,比如斜體,加粗等。由于,text 標簽不能實現(xiàn)嵌套,所以,為了解決這個痛點,提出了
tspan 里面同樣可以自定義相關(guān)的自身屬性。詳細的可以參考 tspan 我這里就不詳述了。 在 Path 展示 textText 一般可以橫放,豎放。那有沒有啥辦法讓文字可以按照一定的路徑任意排放呢? 有的,這里可以使用
如圖: 具體細節(jié)我這里就不多說了。 Clip在 DOM 中如果想展示一個圖片的部分,或者以某種形狀展示圖片的部分,一般是通過一個 cover div 來實現(xiàn)的。不過,如果涉及到不規(guī)則圖形的話,那么 DOM 就有天生缺陷了(當然使用 CSS 里的 clipPath 里面可以接任何圖形,比如,path,rect 甚至是 text。使用的時候,直接在 style 中,指定
或者說,如果我們想畫一個圓的裁剪區(qū)域的話:
Appendix 參考標簽g分組標簽應(yīng)該毫無意外排第一,因為其實作為繪制圖形中最常和最基本的標簽。前面一篇文章也主要介紹過了,這里做點補充。 每一個分組標簽都帶有 因為,后面我們可以使用該 id 標簽添加動畫,重用該分組等。
每個分組里面可以含有一些描述標簽,比如
use該標簽就是結(jié)合
里面使用 defs用來保存一些代碼,使其不會被瀏覽器解析。并且里面的分組可以被 use 屬性的 style 樣式所覆蓋。
symbol該標簽和 恩,確實。不過,defs 是官方推薦,用來包裹一些模板 svg 代碼而創(chuàng)造出來,用來增加可讀性的標簽。而 symbol 是存粹的作為一個模板。它可以獨立于 svg 的 viewbox 來自定義子 viewbox 和 preserveAspectRatio。
同樣使用該模板,也是使用 image既然 這時候,就需要用到
同樣,該
markermarker 一般是用來畫箭頭或者線段始末的標識圖形。
如圖: 這里我們只需要里了解即可,因為在實際畫的時候,直接使用相關(guān)工具生成更加方便。 a這里的 a 標簽和我們直接在 HTML 使用的超鏈接 a 標簽類似。也是用來定義一個外鏈的。
|
|