成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何用純 CSS 打造類 MaterialUI 的按鈕點(diǎn)擊動(dòng)畫并封裝成 React 組件

開(kāi)發(fā) 前端
筆者先后開(kāi)發(fā)過(guò)基于vue,react,angular等框架的項(xiàng)目,碧如vue生態(tài)的elementUI, ant-design-vue, iView等成熟的UI框架, react生態(tài)的ant-design, materialUI等,這些第三方UI框架極大的降低了我們開(kāi)發(fā)一個(gè)項(xiàng)目的成本和復(fù)雜度,使開(kāi)發(fā)者更專注于實(shí)現(xiàn)業(yè)務(wù)邏輯和服務(wù)化。

[[434036]]

前言

作為一個(gè)前端框架的重度使用者,在技術(shù)選型上也會(huì)非常注意其生態(tài)和完整性.筆者先后開(kāi)發(fā)過(guò)基于vue,react,angular等框架的項(xiàng)目,碧如vue生態(tài)的elementUI, ant-design-vue, iView等成熟的UI框架, react生態(tài)的ant-design, materialUI等,這些第三方UI框架極大的降低了我們開(kāi)發(fā)一個(gè)項(xiàng)目的成本和復(fù)雜度,使開(kāi)發(fā)者更專注于實(shí)現(xiàn)業(yè)務(wù)邏輯和服務(wù)化.

但隨著對(duì)用戶體驗(yàn)的越來(lái)越重視,對(duì)交互體驗(yàn)要求的提高以及css3等新標(biāo)準(zhǔn)的出現(xiàn),使得web更加大放異彩, 各種動(dòng)效的實(shí)現(xiàn)都變得非常容易.筆者在研究materialUI框架時(shí)對(duì)于它的交互及其贊嘆.所以為了自己能實(shí)現(xiàn)一個(gè)類似materialUI的按鈕點(diǎn)擊動(dòng)畫,并封裝到自己的UI庫(kù)中,筆者特地總結(jié)了一些思路,希望可以和廣大的前端工程師們一起探討.

正文

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

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

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

1. 原理

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

  1. .xButton { 
  2.   position: relative
  3.   overflow: hidden; 
  4.   display: inline-block; 
  5.   padding: 6px 1em; 
  6.   border-radius: 4px; 
  7.   color: #fff; 
  8.   background-color: #000; 
  9.   user-select:none;   // 禁止用戶選中 
  10.   cursor: pointer; 
  11.  
  12. .ripple { 
  13.   &::after { 
  14.     content: ""
  15.     display: block; 
  16.     position: absolute
  17.     width: 100%; 
  18.     height: 100%; 
  19.     top: 0; 
  20.     left: 0; 
  21.     background-image: radial-gradient(circle, #fff 10%, transparent 11%); 
  22.     background-repeat: no-repeat; 
  23.     background-position: 50%; 
  24.     transform: scale(12, 12); 
  25.     opacity: 0; 
  26.     transition: transform .6s cubic-bezier(.75,.23,.43,.82), opacity .6s; 
  27.   } 
  28.   &:active::after { 
  29.     transform: scale(0, 0); 
  30.     opacity: .5; 
  31.   } 

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

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

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

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

  • 允許用戶修改按鈕樣式
  • 對(duì)外暴露按鈕事件方法
  • 提供按鈕主題和外形配置
  • 可插拔,可組合 基于以上幾點(diǎn),我們來(lái)設(shè)計(jì)這個(gè)react組件.

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

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

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

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

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

  1. .xButton { 
  2.   box-sizing: border-box; 
  3.   display: inline-block; 
  4.   padding: 6px 1em; 
  5.   border-radius: 4px; 
  6.   color: #fff; 
  7.   font-family: inherit; 
  8.   background-color: #000; 
  9.   user-select:none;   // 禁止用戶選中 
  10.   cursor: pointer; 
  11.   text-align: center; 
  12.   &.primary { 
  13.     background-color: #09f; 
  14.   } 
  15.   &.warning { 
  16.     background-color: #F90; 
  17.   } 
  18.   &.info { 
  19.     background-color: #C03; 
  20.   } 
  21.   &.pure { 
  22.     border: 1px solid #ccc; 
  23.     color: rgba(0, 0, 0, 0.65); 
  24.     background-color: #fff; 
  25.     &::after { 
  26.       background-image: radial-gradient(circle, #ccc 10%, transparent 11%); 
  27.     } 
  28.   } 
  29.  
  30.   // 形狀 
  31.   &.circle { 
  32.     border-radius: 1.5em; 
  33.   } 
  34.  
  35.   // 適應(yīng)其父元素 
  36.   &.block { 
  37.     // width: 100%; 
  38.     display: block; 
  39.   } 
  40.  
  41. .ripple { 
  42.   position: relative
  43.   overflow: hidden; 
  44.   &::after { 
  45.     content: ""
  46.     display: block; 
  47.     position: absolute
  48.     width: 100%; 
  49.     height: 100%; 
  50.     top: 0; 
  51.     left: 0; 
  52.     pointer-events: none; 
  53.     background-image: radial-gradient(circle, #fff 10%, transparent 11%); 
  54.     background-repeat: no-repeat; 
  55.     background-position: 50%; 
  56.     transform: scale(12, 12); 
  57.     opacity: 0; 
  58.     transition: transform .6s, opacity .6s; 
  59.   } 
  60.   &:active::after { 
  61.     transform: scale(0, 0); 
  62.     opacity: .3; 
  63.     //設(shè)置初始狀態(tài) 
  64.     transition: 0s; 
  65.   } 
  66. 復(fù)制代碼 

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

  1. // index.js 
  2. import { Button } from '@/components' 
  3. import styles from './index.css' 
  4. export default function() { 
  5.   return ( 
  6.     <div className={styles.normal}> 
  7.       <Button className={styles.btn}>default</Button> 
  8.       <Button className={styles.btn} type="warning">warning</Button> 
  9.       <Button className={styles.btn} type="primary">primary</Button> 
  10.       <Button className={styles.btn} type="info">info</Button> 
  11.       <Button className={styles.btn} type="pure">pure</Button> 
  12.       <Button className={styles.btn} type="primary" shape="circle">circle</Button> 
  13.       <Button className={styles.mb16} type="primary" block>primary&block</Button> 
  14.       <Button type="warning" shape="circle" block onClick={() => { alert('block')}}>circle&block</Button> 
  15.     </div> 
  16.   ) 

之前我們看到的按鈕樣式就是通過(guò)如上代碼生成的,是不是很簡(jiǎn)單呢? 來(lái)我們?cè)俅慰纯袋c(diǎn)擊的動(dòng)效:

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

本文轉(zhuǎn)載自微信公眾號(hào)「趣談前端」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系趣談前端公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 趣談前端
相關(guān)推薦

2021-10-19 22:23:47

CSSBeautiful按鈕

2022-02-21 07:02:16

CSSbeautiful按鈕

2017-04-27 14:05:59

CSS動(dòng)畫前端

2022-08-29 17:39:53

應(yīng)用開(kāi)發(fā)css動(dòng)畫

2017-05-03 11:30:20

CSS3小黃人動(dòng)畫

2022-07-18 09:01:58

React函數(shù)組件Hooks

2016-09-19 21:37:58

vue特效組件Web

2015-07-10 09:47:43

CSSMacBook Air

2022-10-10 08:39:19

CSS前端

2023-07-03 08:51:41

選擇器detailssummary

2021-01-12 10:38:10

工具代碼開(kāi)發(fā)

2021-08-23 06:25:57

CSS 技巧animation

2022-03-28 08:44:15

css3水波動(dòng)畫

2021-02-09 07:26:38

前端css技術(shù)熱點(diǎn)

2021-07-15 07:23:25

React動(dòng)畫頁(yè)面

2023-12-21 10:26:30

??Prettier

2023-11-01 08:33:45

CSS動(dòng)畫效果

2016-11-25 13:50:15

React組件SFC

2022-05-13 08:48:50

React組件TypeScrip

2021-04-30 17:35:16

前端開(kāi)發(fā)技術(shù)熱點(diǎn)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 九九久久久 | 国产精品美女久久久久aⅴ国产馆 | 天天色影视综合 | 国产精品日韩欧美一区二区三区 | av永久| 国产精品美女久久久久aⅴ国产馆 | 在线观看中文字幕 | 午夜精品三区 | 不卡欧美 | 亚洲天堂一区 | 久久久久国产 | 在线亚洲欧美 | av电影一区二区 | 天天干 夜夜操 | 午夜精品一区二区三区在线观看 | 色综网| 请别相信他免费喜剧电影在线观看 | 久久这里只有精品首页 | 久久tv在线观看 | 七七婷婷婷婷精品国产 | 青青草免费在线视频 | 欧美日韩国产高清视频 | 亚州精品天堂中文字幕 | 女同av亚洲女人天堂 | 黄色成人免费看 | 紧缚调教一区二区三区视频 | 天堂一区二区三区四区 | 伊人导航 | 中文字幕亚洲一区 | 2022精品国偷自产免费观看 | 久久久久久国产精品免费免费 | 青青久在线视频 | 一级黄色毛片免费 | 中文字幕成人av | 草久免费视频 | 成人a免费 | 天堂色 | 成人免费视频网站在线观看 | 毛片av免费看 | 午夜影院操 | 国产日韩欧美 |