溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于CSS如何實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動畫并封裝成React組件

發(fā)布時間:2021-11-09 13:35:17 來源:億速云 閱讀:351 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹基于CSS如何實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動畫并封裝成React組件,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

正文

首先我們看一下materialUI的按鈕點(diǎn)擊效果:

基于CSS如何實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動畫并封裝成React組件

本質(zhì)上也是用了css3動畫的特性, 筆者查看源代碼和通過點(diǎn)擊發(fā)現(xiàn)materialUI會根據(jù)點(diǎn)擊位置不同而作不同位置的動畫,這個有點(diǎn)意思.我們先不講這么復(fù)雜的例子,下面通過css3的方案來實(shí)現(xiàn)一個類似的效果.筆者實(shí)現(xiàn)的效果如下:

基于CSS如何實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動畫并封裝成React組件

上圖已經(jīng)是筆者基于react封裝好的一個按鈕Button組件,那么我們就先一步步實(shí)現(xiàn)它吧.

1. 原理

這個動效的原理其實(shí)也很簡單,就是利用css3的transition過渡動畫,配合::after偽對象就可以實(shí)現(xiàn),點(diǎn)擊的時候由于元素會激活:active偽類, 然后我們基于這個偽類, 在::after偽對象上做背景的動畫即可. 偽代碼如下:

.xButton { 
  position: relative; 
  overflow: hidden; 
  display: inline-block; 
  padding: 6px 1em; 
  border-radius: 4px; 
  color: #fff; 
  background-color: #000; 
  user-select:none;   // 禁止用戶選中 
  cursor: pointer; 
} 
 
.ripple { 
  &::after { 
    content: ""; 
    display: block; 
    position: absolute; 
    width: 100%; 
    height: 100%; 
    top: 0; 
    left: 0; 
    background-image: radial-gradient(circle, #fff 10%, transparent 11%); 
    background-repeat: no-repeat; 
    background-position: 50%; 
    transform: scale(12, 12); 
    opacity: 0; 
    transition: transform .6s cubic-bezier(.75,.23,.43,.82), opacity .6s; 
  } 
  &:active::after { 
    transform: scale(0, 0); 
    opacity: .5; 
  } 
}

以上代碼就是通過設(shè)置transform的scale以及透明度, 并且設(shè)置一個漸變的徑向背景圖像來實(shí)現(xiàn)水波紋動畫的為了實(shí)現(xiàn)更優(yōu)雅的動畫,上面的css動畫的實(shí)現(xiàn)可以借助cubic-bezier這個在線工具,他可以生成各種不同形式的貝塞爾曲線.工具長這樣:

基于CSS如何實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動畫并封裝成React組件

2. 組件設(shè)計(jì)思路

僅僅用上述代碼雖然可以實(shí)現(xiàn)一個按鈕點(diǎn)擊的動畫效果,但是并不通用, 也不符合作為一個經(jīng)驗(yàn)豐富的程序員的風(fēng)格,所以接下來我們要一步步把它封裝成一個通用的按鈕組件,讓它無所不用.

組件的設(shè)計(jì)思路我這里參考ant-design的模式, 基于開閉原則,我們知道一個可擴(kuò)展的按鈕組件一般都具備如下特點(diǎn):

  • 允許用戶修改按鈕樣式

  • 對外暴露按鈕事件方法

  • 提供按鈕主題和外形配置

  • 可插拔,可組合 基于以上幾點(diǎn),我們來設(shè)計(jì)這個react組件.

3. 基于react和css3的button組件具體實(shí)現(xiàn)

首先,我們的組件是采用react實(shí)現(xiàn), 技術(shù)點(diǎn)我會采用比較流行的umi腳手架, classnames庫以及css Module, 代碼很簡單, 我們來看看吧.

import classnames from 'classnames' 
import styles from './index.less' 
 
/** 
 * @param {onClick} func 對外暴露的點(diǎn)擊事件 
 * @param {className} string 自定義類名 
 * @param {type} string 按鈕類型 primary | warning | info | default | pure 
 * @param {shape} string 按鈕形狀 circle | radius(默認(rèn)) 
 * @param {block} boolean 按鈕展示 true | false(默認(rèn)) 
 */ 
export default function Button(props) { 
  let { children, onClick, className, type, shape, block } = props 
  return <div 
            className={classnames(styles.xButton, styles.ripple, styles[type], styles[shape], block ? styles.block : '', className)} 
            onClick={onClick} 
        > 
            { children } 
        </div> 
}

這是button的js部分,也是組件設(shè)計(jì)的核心, 按鈕組件對外暴露了onCpck, className, type, shape, block這幾個props, className用于修改組件類名以便控制組件樣式, type主要是控制組件的風(fēng)格, 類似于antd的primary等樣式, shape用來控制是否是圓形按鈕還是圓角按鈕, block用來控制按鈕是否是塊.具體形式如下:

基于CSS如何實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動畫并封裝成React組件

經(jīng)過優(yōu)化后的css長這樣:

.xButton { 
  box-sizing: border-box; 
  display: inline-block; 
  padding: 6px 1em; 
  border-radius: 4px; 
  color: #fff; 
  font-family: inherit; 
  background-color: #000; 
  user-select:none;   // 禁止用戶選中 
  cursor: pointer; 
  text-align: center; 
  &.primary { 
    background-color: #09f; 
  } 
  &.warning { 
    background-color: #F90; 
  } 
  &.info { 
    background-color: #C03; 
  } 
  &.pure { 
    border: 1px solid #ccc; 
    color: rgba(0, 0, 0, 0.65); 
    background-color: #fff; 
    &::after { 
      background-image: radial-gradient(circle, #ccc 10%, transparent 11%); 
    } 
  } 
 
  // 形狀 
  &.circle { 
    border-radius: 1.5em; 
  } 
 
  // 適應(yīng)其父元素 
  &.block { 
    // width: 100%; 
    display: block; 
  } 
} 
 
.ripple { 
  position: relative; 
  overflow: hidden; 
  &::after { 
    content: ""; 
    display: block; 
    position: absolute; 
    width: 100%; 
    height: 100%; 
    top: 0; 
    left: 0; 
    pointer-events: none; 
    background-image: radial-gradient(circle, #fff 10%, transparent 11%); 
    background-repeat: no-repeat; 
    background-position: 50%; 
    transform: scale(12, 12); 
    opacity: 0; 
    transition: transform .6s, opacity .6s; 
  } 
  &:active::after { 
    transform: scale(0, 0); 
    opacity: .3; 
    //設(shè)置初始狀態(tài) 
    transition: 0s; 
  } 
}

我們實(shí)現(xiàn)按鈕樣式的切換完全是用css module帶來的高靈活性, 使其讓屬性和類名高度關(guān)聯(lián). 接下來看看我們?nèi)绾问褂冒桑?/p>

// index.js 
import { Button } from '@/components' 
import styles from './index.css' 
export default function() { 
  return ( 
    <div className={styles.normal}> 
      <Button className={styles.btn}>default</Button> 
      <Button className={styles.btn} type="warning">warning</Button> 
      <Button className={styles.btn} type="primary">primary</Button> 
      <Button className={styles.btn} type="info">info</Button> 
      <Button className={styles.btn} type="pure">pure</Button> 
      <Button className={styles.btn} type="primary" shape="circle">circle</Button> 
      <Button className={styles.mb16} type="primary" block>primary&block</Button> 
      <Button type="warning" shape="circle" block onClick={() => { alert('block')}}>circle&block</Button> 
    </div> 
  ) 
}

之前我們看到的按鈕樣式就是通過如上代碼生成的,是不是很簡單呢? 來我們再次看看點(diǎn)擊的動效:

基于CSS如何實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動畫并封裝成React組件

其實(shí)不僅僅是react, 我們使用同樣的原理也可以實(shí)現(xiàn)一個vue版的按鈕組件或者一個angular版的組件,變得只是語法而已.這樣的組件設(shè)計(jì)思路和元素被官方用在很多ui庫中, 比如單一職責(zé)原理, 組件的開閉原則, 去中心,可組合等,希望對大家今后設(shè)計(jì)組件有所幫助。

以上是“基于CSS如何實(shí)現(xiàn)MaterialUI按鈕點(diǎn)擊動畫并封裝成React組件”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

css
AI