正文從下面開始。css
今天的小技巧是使用純 CSS 生成火焰,逼真一點的火焰。git
嗯,長什麼樣子?在 CodePen 上輸入關鍵字 CSS Fire
,能找到這樣的:github
或者這樣的:算法
咱們但願,僅僅使用 CSS ,效果能再更進一步嗎?能不能是這樣子:性能
嗯,咱們須要使用 filter
+ mix-blend-mode
的組合來完成。動畫
不少 CSS 華而不實的效果都是filter
+mix-blend-mode
,頗有意思,可是業務中根本用不上,固然多瞭解瞭解總沒壞處。
如上圖,整個蠟燭的骨架, 除去火焰的部分很簡單,掠過不講。主要來看看火焰這一塊如何生成,而且如何賦予動畫效果。spa
模糊濾鏡疊加對比度濾鏡產生的融合效果。3d
單獨將兩個濾鏡拿出來,它們的做用分別是:調試
filter: blur()
: 給圖像設置高斯模糊效果。filter: contrast()
: 調整圖像的對比度。可是,當他們「合體」的時候,產生了奇妙的融合現象。code
先來看一個簡單的例子:
仔細看兩圓相交的過程,在邊與邊接觸的時候,會產生一種邊界融合的效果,經過對比度濾鏡把高斯模糊的模糊邊緣給幹掉,利用高斯模糊實現融合效果。
利用上述 filter blur & filter contrast
,咱們要先生成一個相似火焰形狀的三角形。(略去過程)
這裏相似火焰形狀的三角形的具體實現過程,在這篇文章有詳細的講解: 你所不知道的 CSS 濾鏡技巧與細節
父元素添加 filter: blur(5px) contrast(20)
,會變成這樣:
看着已經有點樣子了,接下來是火焰動畫,咱們先去掉父元素的 filter: blur(5px) contrast(20)
,而後繼續 。
這裏也是利用了 filter
的融合效果,咱們在上述火焰中,利用 SASS 隨機均勻分佈大量大小不一的圓形棕色 div ,隱匿在火焰三角內部,大概是這樣:
接下來,咱們再利用 SASS,給中間每一個小圓賦予一個從下往上逐漸消失的動畫,而且均勻賦予不一樣的 animation-delay
,看起來會是這樣:
OK,最重要的一步,咱們再把父元素的 filter: blur(5px) contrast(20)
打開,神奇的火焰效果就出來了:
固然,上述效果已經很不錯了。通過各類嘗試,調整參數,最後我發現加上 mix-blend-mode: screen
混合模式,效果更好,獲得頭圖上面的最終效果以下:
完整源碼在個人 CodePen 上:CodePen Demo -- CSS Fire
固然,掌握了這種方法後,這種生成火焰的技巧也能夠遷移到其餘效果去。下圖是我鼓搗到另一個小 Demo,當 hover 到元素的時候,產生火焰效果:
嗯,這些其實都是對濾鏡及混合模式的一些搭配運用。按照慣例,確定有人會留言噴了,整這些花裏胡哨的有什麼用,性能又很差,業務中敢上不把你的腿給打骨折。
於我而言,虛心接受各類批評質疑及各類不一樣的觀點,固然我是以爲搞技術一方面是實用,另外一方面是興趣使然,自娛自樂。但願噴子繞道~
回到正題,瞭解了這種黏糊糊溼答答的技巧後,還能夠折騰出其餘不少有意思的效果,固然可能須要更多的去嘗試,以下面使用一個標籤實現的滴水效果:
動畫雖然美好,可是具體使用的過程當中,仍然有一些須要注意的地方:
filter: blur(5px) contrast(150%) brightness(1.5)
,可是濾鏡的前後順序不一樣產生的效果也是不同的;也就是說,使用filter: blur(5px) contrast(150%) brightness(1.5)
和filter: brightness(1.5) contrast(150%) blur(5px)
處理同一張圖片,獲得的效果是不同的,緣由在於濾鏡的色值處理算法對圖片處理的前後順序。
blur()
混合 contrast()
濾鏡效果,設置不一樣的顏色會產生不一樣的效果,這個顏色疊加的具體算法暫時沒有找到很具體的規則細則,使用時比較好的方法是多嘗試不一樣顏色,觀察取最好的效果;本文只是簡單的介紹了整個思路過程,許多 CSS 代碼細節,調試過程沒有展示出來。主要幾個 CSS 屬性默認你們已經掌握了大概,閱讀後能夠自行去了解補充更多細節:
filter
mix-blend-mode
更多精彩 CSS 技術文章彙總在個人 Github -- iCSS ,持續更新,歡迎點個 star 訂閱收藏。
好了,本文到此結束,但願對你有幫助 :)
若是還有什麼疑問或者建議,能夠多多交流,原創文章,文筆有限,才疏學淺,文中如有不正之處,萬望告知。
最後,新開通的公衆號求關注,形式但願是更短的篇幅,質量更高一些的技巧類文章,包括但不侷限於 CSS: