輕鬆使用純css3打造有點意思的故障藝術(附React加強組件版)

2021-01-14 酷扯兒

本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫

前言

很早之前就看到國外很多酷炫的網站在實踐"故障藝術", 或者錯位動畫", 感覺非常有意思, 現在APP端的抖音啟動界面有著這種設計的影子, 作為一名用於探索未知的前端工程師, 有必要好好實踐一下這一設計.

正文

接下來筆者將帶大家使用純Css3來實現"故障動畫", 並將這一特效封裝成React/vue組件, 供大家學習和使用. 先來看看實現的效果:

當然在下面的文章中筆者還會介紹其他風格的"故障動畫".

實現原理

該效果的實現依賴於Css3的新特性mix-blend-mode和background-blend-mode.接下來筆者簡單介紹一下:

1. mix-blend-mode

該屬性描述了元素的內容應該與元素的直系父元素的內容和元素的背景如何混合. 具體的屬性值介紹如下:

mix-blend-mode: normal;(正常)mix-blend-mode: multiply(正片疊底)mix-blend-mode: screen;(濾色)mix-blend-mode: overlay;(疊加)mix-blend-mode: darken; (變暗)mix-blend-mode: lighten; (變亮)mix-blend-mode: color-dodge; (顏色減淡)mix-blend-mode: color-burn; (顏色加深)mix-blend-mode: hard-light; (強光)mix-blend-mode: soft-light;(柔光)mix-blend-mode: difference; (差值)mix-blend-mode: exclusion; (排除)mix-blend-mode: hue;(色相)mix-blend-mode: saturation; (飽和度)mix-blend-mode: color; (顏色)mix-blend-mode: luminosity; (亮度)mix-blend-mode: initial;(初始)mix-blend-mode: inherit; (繼承)mix-blend-mode: unset; (復原)

有點類似於PS裡面的圖層疊加模式.另一個css屬性background-blend-mode和mix-blend-mode類似, 主要針對背景的混合模式, 這裡我們主要採用mix-blend-mode來實現我們的故障效果.

2. 動畫結構分析

由上圖我們可以分析出, "故障動畫"包含4個元素: 背景, 前置文字, 後置文字, 故障線. 具體分解如下:

通過以上分析我們大致可以寫出基本的dom結構來了, 有經驗的朋友可能會想到使用偽元素來實現前置/後置文字/故障線, 雖然這種方式可以節省很多dom結構, 但是缺點就是封裝的靈活度會降低, 所以筆者採用如下結構:

<div className="blink-item"><div className="text text-front">趣談前端</div> <div className="text text-back">趣談前端</div></div>複製代碼

這裡故障線我們採用偽元素來實現. 所以在文章開頭的動畫實現就變得很簡單了,我們只需要設置一個畫布背景,然後用內容混合讓文字疊加, 最後設計文字和故障線的動畫即可. 接下來我們看看具體的實現步驟.

實現方案

我們先來實現文字的混合效果, 故障線和畫布背景, css代碼如下:

.blink {// ... background-color: #000; .blink-item { &::after { content: ''; position: absolute; z-index: 3; left: 0; top: 30px; width: 100%; height: 4px; background-color: #000; } .text-front { color: #74fcfd; } .text-back { position: absolute; transform: translate(-5px, -100%); color: #ea3448; mix-blend-mode: lighten; } }}複製代碼

由以上代碼可知我們在後置文字的css樣式中採用了mix-blend-mode並設置成lighten, 當然我們也可以設置成其他模式的值. 我們接下來就來實現故障的文字動畫和故障線動畫, 這塊也很簡單, 我們採用css3的@keyframe動畫即可, 代碼如下:

@keyframes shakeFront {0% { transform: translate(1px, 1px); } 20% { transform: translate(-1px, 0); } 60% { transform: translate(-1px, 0); } 100% { transform: translate(1px, -1px); }}@keyframes shake { 0% { transform: translate(-5px, -100%); } 20% { transform: translate(-3px, -100%); } 60% { transform: translate(1px, calc(-100% - 1px)); } 100% { transform: translate(2px, calc(-100% + 1px)); }}@keyframes lineShake { 0% { top: 10%; } 20% { top: 60%; } 40% { top: 35%; } 60% { top: 2%; } 80% { top: 80%; } 100% { top: 99%; }}複製代碼

shakeFront和shake分別為後置文字和前置文字的動畫, lineShake為故障線的動畫. 最後, 我們只需要藉助css3的animation讓動畫循環播放即可.

封裝成react/vue組件

為了實現故障動畫更大的自由度以及降低工程師的使用成本, 筆者將其封裝成了react組件, vue組件的封裝思路類似, 感興趣的朋友可以自己試試. 這裡我們來拆解故障動畫組件設計的模型:

組件的設計思想往往是設計的複雜性和使用的便捷性的博弈, 為了讓使用者有更大的自由度, 往往會通過增加組件內部複雜度來彌補. 我們先來看看實現後的效果:

為了實現以上這種自定義配置, 我們需要進一步對已有的代碼進行封裝, 比如故障線我們使用偽元素來實現的, 那麼如何保證切換背景色之後能保證偽元素的背景色也響應的變化呢? 這裡筆者採用的是背景繼承, 即:

.blink {.blink-item { background-color: inherit; &::after { // ... background-color: inherit; animation: lineShake .5s infinite; }複製代碼

這樣我們只需要在.blink容器中動態傳入背景顏色, 即可實現我們想要的效果. React組件代碼如下:

import React from 'react'import './index.less'export default function Blink(props) {const { text = '趣談前端', fontSize = '48px', themeColor = '#000', textColor = ['#74fcfd', '#ea3448'] } = props return ( <div className='blink' style={{backgroundColor: themeColor}}> <div className="blink-item" data-text={text} style={{fontSize: fontSize}}> <div className="text text-front" style={{color: textColor[0]}}>{text}</div> <div className="text text-back" style={{color: textColor[1]}}>{text}</div> </div> </div> )}複製代碼

怎麼樣,是不是很簡單呢? 筆者已將組件代碼上傳到github, 大家可以安裝使用或者在其基礎上進一步完善, 比如基於背景圖片的故障動畫等等, 以上css3特性在現代瀏覽器中支持相對穩定, 在做H5開發中可以一試.

相關焦點

  • 如何用純css打造類materialUI的按鈕點擊動畫並封裝成react組件
    正文首先我們看一下materialUI的按鈕點擊效果:本質上也是用了css3動畫的特性, 筆者查看原始碼和通過點擊發現materialUI會根據點擊位置不同而作不同位置的動畫,這個有點意思.我們先不講這麼複雜的例子,下面通過css3的方案來實現一個類似的效果.筆者實現的效果如下:
  • 精通react/vue組件設計教你實現一個極具創意的加載(Loading)組件
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是筆者寫組件設計的第八篇文章, 今天帶大家用5分鐘實現一個極具創意的加載(loading)組件.涉及的核心知識點主要是css3相關特性, 如果大家非常熟悉,可直接跳過介紹直接看正文
  • 《精通react/vue組件設計》之快速實現一個可定製的進度條組件
    每一個組件只負責某一特定的表現或者功能)正文在開始組件設計之前希望大家對css3和js有一定的基礎.我們先看看實現後的組件效果:上圖可以知道封裝後的進度條組件通過對外暴露的接口(react/vue裡面可以看做
  • 《精通react/vue組件設計》之實現一個健壯的警告提示(Alert)組件
    正文在開始組件設計之前希望大家對css3和js有一定的基礎,並了解基本的react/vue語法.我們先看看實現後的組件效果:1. 組件設計思路按照之前筆者總結的組件設計原則,我們第一步是要確認需求.選手來說,如果沒用typescript,建議大家都用PropTypes, 它是react內置的類型檢測工具,我們可以直接在項目中導入. vue有自帶的屬性檢測方式,這裡就不一一介紹了.
  • 基於jsoneditor二次封裝一個可實時預覽的json編輯器組件react版
    ,這樣一方面可以提高組件復用性和可擴展性,另一方面也帶來了項目開發的靈活性和可維護,方便多人開發協作.接下來文章將介紹如何使用react,開發一個自定義json編輯器組件.我們這裡使用了jsoneditor這個第三方庫,官方地址: jsoneditor 通過實現一個json在線編輯器,來學習如何一步步封裝自己的組件(不限於react,vue,原理類似).
  • 精通React/Vue系列之帶你實現一個功能強大的通知提醒框
    如果對設計模式不是很了解,可以移步:15分鐘帶你了解前端工程師必知的javascript設計模式(附詳細思維導圖和源碼).正文在開始組件設計之前希望大家對css3和js有一定的基礎,並了解基本的react/vue語法.我們先來解構一下Notification組件, 一個Notification分為以下幾個部分:每一個區塊都可以自定義配置, 也可以組合其他組件.並且我們可以配置提醒框出現的位置,就像antd
  • react中關於hook介紹及其使用
    前言最近由於公司的項目開發,就學習了在react關於hook的使用,對其有個基本的認識以及如何在項目中去應用hook。簡單來說就是可以使用函數組件去使用react中的一些特性所要解決的問題:解決組件之間復用狀態邏輯很難得問題,hook能解決的就是在你無需修改之前組件結構的情況下復用狀態邏輯,在不使用hook的情況下,需要使用到一些高級的用法如高級組件、provider、customer等,這種方式對於新手來說不太友好
  • React SSR 同構入門與原理
    它有一個非常大的優勢就是,只是首次訪問會請求後臺服務加載相應文件,之後的訪問都是前端自己判斷 URL 展示相關組件,因此除了首次訪問速度慢些之外,之後的訪問速度都很快。執行命令: create-react-app react-csr 創建一個 React SPA 單頁面應用項目 。執行命令: npm run start 啟動項目。
  • 如何使用React Hooks實現容器組件?
    今天,我們就來通過使用React Hooks實現容器組件。在開始使用React Hooks實現容器組件之前,先來簡單了解一下到底什麼是React Hooks和容器組件。例如,如果讀者想分享,可以使用這個應用程式中Bit (Github) 的list組件:列表組件本身並沒有邏輯,但它有清楚明確的API,使其易於重用:
  • 基於Vue實現一個有點意思的拼拼樂小遊戲
    muse-ui 基於MaterialUI風格的移動端UI組件cube-ui 滴滴團隊開發的移動端UI組件庫vant 有贊團隊的電商風格的移動端組件庫atom-design atom風格的移動端ui組件庫mand-mobile 滴滴團隊研發的基於金融場景的移動端ui組件庫以上筆者推薦的都是社區比較完善,bug比較少的組件庫,大家可以感受一下。
  • 這5個React應用程式庫不要錯過……
    當筆者創建一個複雜的特性或組件時,總是在設計、產品和開發之間「遊蕩」。設計師可能會要求進行視覺或UX更改,產品部門可能要求更改UX。筆者只得不斷地反覆、重構和更新組件。通過確保組件或特性的正確測試,可以確保這種重構不會允許回歸潛入代碼庫。它節省了大量的人工測試時間,這給了人們更多信心。
  • 《前端5分鐘》之使用純css實現網站換膚和焦點圖切換動畫
    你將收穫網站換膚設計方案介紹:target偽類介紹和用法以及如何使用css實現網站換膚transition動畫以及如何用純css實現焦點圖動畫效果展示1.網站換膚2.焦點圖動畫)antd/element內置輪播圖組件slickunslider 最簡單的輪播圖組件fancyBox 可以為頁面上的圖片、html 內容和多媒體添加縮放功能sly 導航式、可單向滾動Sequence 可以創建響應式幻燈片、演示、旗幟廣告和以步驟為基礎的CSS 動畫框架PhotoSwipe 適用於行動裝置和桌面電腦,基於原生JavaScript的模塊組件以上介紹的方案都很成熟
  • 前端工程師必備的css3動畫技巧
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文是筆者之前文章用css3實現驚豔面試官的背景即背景動畫(高級附源碼)的續篇也是介紹css3技巧的文章,因為css這塊知識難點不是很多,更多的在於去熟悉css3的新特性和基礎理論知識。
  • 前端組件/庫打包利器rollup使用與配置實戰
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫目前主流的前端框架vue和react都採用rollup來打包,為了探索rollup的奧妙,接下來就讓我們一步步來探索,並基於rollup搭建一個庫打包腳手架,來發布自己的庫和組件。
  • React Native 0.63 發布,告警系統、顏色與交互能力改進
    組件棧:提供了一個一致的、不會使日誌消息混亂的組件棧幀信息,只顯示前三個。 摺疊組件棧幀:默認情況下摺疊與應用程式代碼無關的調用堆棧幀,可以在應用程式中快速查看問題,而不必通過 React Native 內部篩選。
  • 前端—— CSS3動畫
    雖說IE9以及更早版本的IE瀏覽器都不支持css3動畫,但是IE6-8瀏覽器已是江河日下,使用谷歌瀏覽器、火狐瀏覽器、IE10+瀏覽器以及移動端瀏覽器等這些支持css3動畫的瀏覽器的人數越來越多,所以如果很簡單的就能讓一部分人獲得更好的用戶體驗,那何樂而不為呢。
  • 官宣:ReactNative導航庫重大更新
    基於配置的組件在之前的版本中,我們創建一些導航路由,比如創建堆棧導航,底部Tab導航,都是採用的靜態的配置navigationOptions選項來完成的。但是在React Navigation 5.0中是做了基於組件的動態配置的鑫的方式,和以前的版本完全不一樣。
  • React-Router v6新特性解讀及遷移指南
    目前 v6已是測試最後一版,估計新的特性不出意外就是下面這些了:  新鉤子useRoutes代替react-router-config。  大小減少:從20kb到8kb1. <Switch>重命名為<Routes>該頂級組件將被重命名。但是,其功能大部分保持不變(嗨,瞎折騰)。
  • React學習筆記-條件渲染|javascript|運算符|react|render_網易訂閱
    在 React 中,你可以創建不同的組件來封裝各種你需要的行為。然後還可以根據應用的狀態變化只渲染其中的一部分。React 中的條件渲染和 JavaScript 中的一致,使用 JavaScript 操作符 if 或條件運算符來創建表示當前狀態的元素,然後讓 React 根據它們來更新 UI。