精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何用純 CSS 打造類 MaterialUI 的按鈕點擊動畫并封裝成 React 組件

開發 前端
筆者先后開發過基于vue,react,angular等框架的項目,碧如vue生態的elementUI, ant-design-vue, iView等成熟的UI框架, react生態的ant-design, materialUI等,這些第三方UI框架極大的降低了我們開發一個項目的成本和復雜度,使開發者更專注于實現業務邏輯和服務化。

[[434036]]

前言

作為一個前端框架的重度使用者,在技術選型上也會非常注意其生態和完整性.筆者先后開發過基于vue,react,angular等框架的項目,碧如vue生態的elementUI, ant-design-vue, iView等成熟的UI框架, react生態的ant-design, materialUI等,這些第三方UI框架極大的降低了我們開發一個項目的成本和復雜度,使開發者更專注于實現業務邏輯和服務化.

但隨著對用戶體驗的越來越重視,對交互體驗要求的提高以及css3等新標準的出現,使得web更加大放異彩, 各種動效的實現都變得非常容易.筆者在研究materialUI框架時對于它的交互及其贊嘆.所以為了自己能實現一個類似materialUI的按鈕點擊動畫,并封裝到自己的UI庫中,筆者特地總結了一些思路,希望可以和廣大的前端工程師們一起探討.

正文

首先我們看一下materialUI的按鈕點擊效果:

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

上圖已經是筆者基于react封裝好的一個按鈕Button組件,那么我們就先一步步實現它吧.

1. 原理

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

  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.   } 

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

2. 組件設計思路

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

組件的設計思路我這里參考ant-design的模式, 基于開閉原則,我們知道一個可擴展的按鈕組件一般都具備如下特點:

  • 允許用戶修改按鈕樣式
  • 對外暴露按鈕事件方法
  • 提供按鈕主題和外形配置
  • 可插拔,可組合 基于以上幾點,我們來設計這個react組件.

3. 基于react和css3的button組件具體實現

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

  1. import classnames from 'classnames' 
  2. import styles from './index.less' 
  3.  
  4. /** 
  5.  * @param {onClick} func 對外暴露的點擊事件 
  6.  * @param {className} string 自定義類名 
  7.  * @param {type} string 按鈕類型 primary | warning | info | default | pure 
  8.  * @param {shape} string 按鈕形狀 circle | radius(默認) 
  9.  * @param {block} boolean 按鈕展示 true | false(默認) 
  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部分,也是組件設計的核心, 按鈕組件對外暴露了onClick, className, type, shape, block這幾個props, className用于修改組件類名以便控制組件樣式, type主要是控制組件的風格, 類似于antd的primary等樣式, shape用來控制是否是圓形按鈕還是圓角按鈕, block用來控制按鈕是否是塊.具體形式如下:

經過優化后的css長這樣:

  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.   // 適應其父元素 
  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.     //設置初始狀態 
  64.     transition: 0s; 
  65.   } 
  66. 復制代碼 

我們實現按鈕樣式的切換完全是用css module帶來的高靈活性, 使其讓屬性和類名高度關聯. 接下來看看我們如何使用吧!

  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.   ) 

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

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

本文轉載自微信公眾號「趣談前端」,可以通過以下二維碼關注。轉載本文請聯系趣談前端公眾號。

 

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2021-10-19 22:23:47

CSSBeautiful按鈕

2022-02-21 07:02:16

CSSbeautiful按鈕

2017-04-27 14:05:59

CSS動畫前端

2022-08-29 17:39:53

應用開發css動畫

2017-05-03 11:30:20

CSS3小黃人動畫

2022-07-18 09:01:58

React函數組件Hooks

2016-09-19 21:37:58

vue特效組件Web

2015-07-10 09:47:43

CSSMacBook Air

2022-10-10 08:39:19

CSS前端

2021-01-12 10:38:10

工具代碼開發

2023-07-03 08:51:41

選擇器detailssummary

2021-08-23 06:25:57

CSS 技巧animation

2022-03-28 08:44:15

css3水波動畫

2021-02-09 07:26:38

前端css技術熱點

2021-07-15 07:23:25

React動畫頁面

2023-11-01 08:33:45

CSS動畫效果

2022-09-12 08:31:41

CSS3偽類URI

2022-12-26 08:25:16

CSS函數節流

2020-12-02 06:00:40

js-sdk

2022-05-13 08:48:50

React組件TypeScrip
點贊
收藏

51CTO技術棧公眾號

欧美成人ⅴideosxxxxx| 亚洲产国偷v产偷v自拍涩爱| 蜜桃成人av| 欧美调教femdomvk| 亚洲精品成人自拍| 精品人妻午夜一区二区三区四区 | 国产一区欧美日韩| 欧美精品电影在线| 亚洲图片另类小说| 999久久精品| 欧美主播一区二区三区美女| 老司机午夜免费福利视频| 午夜视频免费在线| 久久99国产精品久久99果冻传媒| 欧美激情乱人伦一区| 欧洲美熟女乱又伦| 露出调教综合另类| 欧美精品123区| av动漫在线观看| 国产激情在线| 久久尤物电影视频在线观看| 成人免费观看网址| 中文字幕一区二区人妻电影| 欧美aⅴ99久久黑人专区| 亚洲剧情一区二区| 久久黄色一级视频| 日韩av黄色| 色综合久久天天| 波多野结衣av一区二区全免费观看 | 日韩视频一区二区三区在线播放免费观看| 一区二区在线免费视频| 蜜臀av粉嫩av懂色av| 偷拍自拍亚洲| 精品视频999| 国产精品无码专区av在线播放| 青青草视频在线免费直播| 国产精品嫩草久久久久| 欧美婷婷久久| 免费黄网站在线观看| 成人免费视频免费观看| 91av一区二区三区| 亚洲一区精品在线观看| 肉肉av福利一精品导航| 91地址最新发布| 日本在线视频免费| 欧美午夜一区| 欧美华人在线视频| 欧美大片xxxx| 亚洲h色精品| 菠萝蜜影院一区二区免费| 中文字幕欧美激情极品| 国产探花在线精品一区二区| 亚洲精品在线观看www| 亚洲一区二区三区四区av| 嫩呦国产一区二区三区av| 欧美人狂配大交3d怪物一区| 一区二区三区入口| 草民电影神马电影一区二区| 欧美在线你懂得| 丰满少妇在线观看| 日韩av福利| 在线精品视频免费观看| 美女网站免费观看视频| 亚洲精品国产嫩草在线观看| 在线观看av一区| 鲁一鲁一鲁一鲁一av| 久久91超碰青草在哪里看| 欧美日韩国产影片| 午夜影院免费观看视频| 国产一区二区av在线| 日韩欧美在线影院| 日韩成人av影院| 免费成人蒂法| 国产亚洲欧洲在线| 手机av在线不卡| 亚洲国产不卡| 97国产在线视频| 日韩精品一区不卡| 国内外成人在线视频| 成人免费视频网站入口| 视频福利在线| 91老师片黄在线观看| 亚洲一区三区视频在线观看| bt在线麻豆视频| 精品久久久久久亚洲国产300| www.玖玖玖| 啪啪av大全导航福利综合导航| 3atv在线一区二区三区| a级片在线观看视频| 免费av一区二区三区四区| 色婷婷久久一区二区| 久久综合亚洲色hezyo国产| 午夜在线视频观看日韩17c| 国产精品美乳一区二区免费| 亚洲国产精品suv| 久久久久国产精品人| 亚洲AV无码成人精品一区| 草草在线视频| 欧美精选午夜久久久乱码6080| 极品白嫩的小少妇| 久久影视一区| 91国内在线视频| 一级做a爱片性色毛片| 成人一区二区在线观看| 亚洲高清视频一区二区| 国产精品一区hongkong| 欧美精品在线观看一区二区| 亚洲精品中文字幕在线播放| 天天做天天爱天天综合网| 欧美亚洲午夜视频在线观看 | 欧美xxxxxxxx| 国产农村妇女精品一区| 一区二区毛片| 9a蜜桃久久久久久免费| 秋霞影院午夜丰满少妇在线视频| 亚洲成av人片| 午夜啪啪小视频| 欧美人妖在线| 午夜精品一区二区三区在线| 国产精品一级视频| 国产清纯白嫩初高生在线观看91 | 日本免费成人网| 成人全视频在线观看在线播放高清| 精品福利一区二区三区免费视频| 制服丨自拍丨欧美丨动漫丨| 天堂久久一区二区三区| 精品久久久久久一区| 黄色影院在线看| 欧美一区二区美女| 免费一级suv好看的国产网站 | 国产精品九九久久久久久久| 午夜视频免费看| 亚洲国产另类av| 老女人性生活视频| 亚洲乱码精品| 成人网中文字幕| 男人的天堂在线视频免费观看| 一本色道**综合亚洲精品蜜桃冫 | 中文字幕乱码日本亚洲一区二区 | 国产精品99久久久久久久vr| 一区二区在线观| 国产69精品久久久久9999人| 伊人久久免费视频| www.国产毛片| 国产欧美一区二区在线| 欧美性猛交久久久乱大交小说| 日韩在线麻豆| 日本久久亚洲电影| 国产在线观看黄| 欧美手机在线视频| jizzjizz日本少妇| 另类成人小视频在线| 亚洲精品一卡二卡三卡四卡| 欧美日韩卡一| 精品久久久999| 国产草草影院ccyycom| 亚洲精品日日夜夜| 精品国产乱码久久久久夜深人妻| 欧美三级第一页| 国产在线精品一区二区三区| 国产高清视频色在线www| 亚洲国产欧美久久| 日本免费精品视频| 中文字幕欧美日本乱码一线二线| 亚洲色图偷拍视频| 欧美国产综合| 国内一区在线| 久久久人成影片一区二区三区在哪下载 | 国产一区视频在线播放| 九七久久人人| 日韩欧美国产一区在线观看| 国产成年人免费视频| 91麻豆免费看| 国内外成人免费在线视频| 亚洲网色网站| 鲁鲁视频www一区二区| 91国拍精品国产粉嫩亚洲一区 | 婷婷伊人五月天| heyzo一本久久综合| 国产一区亚洲二区三区| 久久精品不卡| 国产精品二区在线| 日韩欧美一区二区三区在线观看| 神马久久久久久| 国产综合在线播放| 欧美性猛交xxxx免费看| 国产一区二区三区视频播放| 成人午夜电影小说| 久久婷婷国产91天堂综合精品| 亚洲女同另类| 久久精品五月婷婷| 国产精品久久久久久久久久久久久久久 | 中文一区一区三区高中清不卡免费 | 国产精品色悠悠| 97人人爽人人澡人人精品| 亚洲人午夜精品免费| 国产丝袜视频在线观看| 欧美日韩综合视频网址| 在线看的片片片免费| 91在线国产观看| 日本高清一区二区视频| 日韩综合小视频| 亚洲理论电影在线观看| 色狮一区二区三区四区视频| 激情视频一区二区| 高清精品久久| 国产精品成人免费视频| 爱看av在线入口| 日韩中文在线中文网在线观看| 人人妻人人澡人人爽人人欧美一区 | 日韩极品少妇| 亚洲a级在线观看| 亚洲成人av观看| 韩剧1988免费观看全集| 伊人免费在线| 亚洲日本中文字幕| 日批免费在线观看| 欧美一区二区三级| 一级片在线免费观看视频| 欧美日韩综合视频| 九九热国产视频| 亚洲综合另类小说| 最新av电影网站| 中文字幕乱码一区二区免费| 国产精品无码久久久久久| 成人精品免费看| 无套白嫩进入乌克兰美女| 欧美a一区二区| 免费午夜视频在线观看| 99成人在线| 国产亚洲黄色片| 好看不卡的中文字幕| aaa免费在线观看| 久久精品青草| 伊人情人网综合| 久久密一区二区三区| 亚洲高清在线观看一区| 国产精品三级| 欧美日韩免费精品| 精品一区欧美| 鲁片一区二区三区| 午夜a一级毛片亚洲欧洲| 国内视频一区二区| 日本福利一区| 欧美久久电影| 精品国产a一区二区三区v免费| 欧洲高清一区二区| 精品99在线| 亚洲精品在线观看免费| 久久免费大视频| 一级全黄肉体裸体全过程| 91精品动漫在线观看| 佐佐木明希av| 欧美日本中文| 福利视频一区二区三区四区| 亚洲美女色禁图| 日本日本19xxxⅹhd乱影响| 国产日韩欧美一区在线| 日韩精品一区二区三区久久| 久久免费高清| 91制片厂毛片| 国产精品资源网| 野战少妇38p| 久久先锋影音av鲁色资源| www.99热| 亚洲欧美日韩在线播放| 麻豆91精品91久久久| 五月天激情小说综合| 无码人妻精品一区二区50| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 成人91视频| 日韩极品在线| 亚洲一区二区三区免费观看| 欧美在线免费| 91传媒久久久| 久久99国产精品免费网站| 人妻互换一二三区激情视频| 99re成人在线| 美国黄色片视频| 亚洲国产中文字幕在线视频综合 | 四季av中文字幕| 自拍av一区二区三区| 国产午夜视频在线播放| 在线精品亚洲一区二区不卡| 国内精品偷拍视频| 亚洲欧美在线磁力| 成人福利片网站| 欧美一级免费看| 亚洲91在线| 久久亚洲免费| 综合精品一区| 欧在线一二三四区| 国产高清精品在线| 少妇精品无码一区二区免费视频| 亚洲自拍偷拍av| 中文字幕人妻互换av久久| 日韩免费视频一区| av影片在线看| 97视频国产在线| 亚洲一区二区三区久久久| 久久久人人爽| 欧美在线资源| 久久人人爽av| 久久亚洲影视婷婷| 久草视频免费在线播放| 欧美色图一区二区三区| 天堂网在线资源| 美女av一区二区| 992tv国产精品成人影院| 国产区一区二区三区| 亚洲va在线| 杨幂毛片午夜性生毛片| 91一区二区在线观看| 在线免费日韩av| 欧美日韩国产高清一区| 美女毛片在线看| 韩国精品美女www爽爽爽视频| 欧美黄页免费| 亚洲精品一区二区三区樱花| 午夜一级久久| 欧美肉大捧一进一出免费视频| 亚洲色图另类专区| 在线观看毛片网站| 亚洲美女激情视频| 国产精品电影| 成人精品一二区| 中文精品久久| 亚洲激情在线看| 亚洲国产精品av| 无码人妻av一区二区三区波多野| 日韩成人在线免费观看| 后进极品白嫩翘臀在线播放| 2020国产精品久久精品不卡| 外国成人免费视频| 午夜免费福利视频在线观看| 国产日韩一级二级三级| 人妻丰满熟妇av无码区| 亚洲精品白浆高清久久久久久| 欧美hdxxx| 99www免费人成精品| 午夜视频一区| 亚洲免费观看在线| 亚洲福利一二三区| 亚洲欧美激情国产综合久久久| 色综合色综合久久综合频道88| 精品久久亚洲| www.欧美黄色| 波多野结衣在线aⅴ中文字幕不卡| 久久久久久久久精| 亚洲国产毛片完整版| 自拍偷拍亚洲视频| 久久亚洲高清| 免费的国产精品| 日韩在线中文字幕视频| 欧美α欧美αv大片| 草草在线观看| 欧美日韩一区二区视频在线| 视频一区在线播放| 殴美一级黄色片| 91精品国产综合久久久久| 中文字幕资源网在线观看| 岛国视频一区| 久久久精品午夜少妇| 调教驯服丰满美艳麻麻在线视频| 欧美图区在线视频| 国产三区在线观看| 国产精选在线观看91| 久久都是精品| 日本午夜在线观看| 亚洲精品在线网站| 亚洲a∨精品一区二区三区导航| 亚洲精品一区二区三区四区五区| 激情五月播播久久久精品| 黄色一级片在线| 亚洲欧美国产日韩中文字幕| 日本一区二区中文字幕| 亚洲国产精品无码观看久久| 久久色成人在线| 国产精品久久久久久69| 久久久人成影片一区二区三区观看| 亚洲欧美日本伦理| 久久久精品高清| 天天色综合天天| 1024视频在线| 精品在线一区| 久久99精品久久久久久动态图| 久久国产精品波多野结衣| 亚洲欧美激情另类校园| 日本一区二区三区视频在线看| 干日本少妇首页| 亚洲欧美日本韩国| 亚洲色图欧美视频| 91在线精品播放| 老司机一区二区三区| 欧美黑人性猛交xxx| 亚洲人成绝费网站色www| 美女久久精品| 亚洲性生活网站| 红桃av永久久久| 成人在线直播|