一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - 如何用純 CSS 打造類 MaterialUI 的按鈕點擊動畫并封裝成 React 組件

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

2021-11-09 20:55趣談前端徐小夕 編程技術

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

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

前言

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

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

正文

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

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

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

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

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

1. 原理

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

  1. .xButton{
  2. position:relative;
  3. overflow:hidden;
  4. display:inline-block;
  5. padding:6px1em;
  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,#fff10%,transparent11%);
  22. background-repeat:no-repeat;
  23. background-position:50%;
  24. transform:scale(12,12);
  25. opacity:0;
  26. transition:transform.6scubic-bezier(.75,.23,.43,.82),opacity.6s;
  27. }
  28. &:active::after{
  29. transform:scale(0,0);
  30. opacity:.5;
  31. }
  32. }

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

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

2. 組件設計思路

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

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

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

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

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

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

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

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

經過優化后的css長這樣:

  1. .xButton{
  2. box-sizing:border-box;
  3. display:inline-block;
  4. padding:6px1em;
  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:1pxsolid#ccc;
  23. color:rgba(0,0,0,0.65);
  24. background-color:#fff;
  25. &::after{
  26. background-image:radial-gradient(circle,#ccc10%,transparent11%);
  27. }
  28. }
  29. //形狀
  30. &.circle{
  31. border-radius:1.5em;
  32. }
  33. //適應其父元素
  34. &.block{
  35. //width:100%;
  36. display:block;
  37. }
  38. }
  39. .ripple{
  40. position:relative;
  41. overflow:hidden;
  42. &::after{
  43. content:"";
  44. display:block;
  45. position:absolute;
  46. width:100%;
  47. height:100%;
  48. top:0;
  49. left:0;
  50. pointer-events:none;
  51. background-image:radial-gradient(circle,#fff10%,transparent11%);
  52. background-repeat:no-repeat;
  53. background-position:50%;
  54. transform:scale(12,12);
  55. opacity:0;
  56. transition:transform.6s,opacity.6s;
  57. }
  58. &:active::after{
  59. transform:scale(0,0);
  60. opacity:.3;
  61. //設置初始狀態
  62. transition:0s;
  63. }
  64. }
  65. 復制代碼

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

  1. //index.js
  2. import{Button}from'@/components'
  3. importstylesfrom'./index.css'
  4. exportdefaultfunction(){
  5. return(
  6. default
  7. "warning">warning
  8. "primary">primary
  9. "info">info
  10. "pure">pure
  11. "primary"shape="circle">circle
  12. "primary"block>primary&block
  13. "warning"shape="circle"blockonClick={()=>{alert('block')}}>circle&block
  14. )
  15. }

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

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

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

原文鏈接:https://mp.weixin.qq.com/s/12RK-qqnXKxawZMIa_ViRA

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久最新地址获取 | 传说之下羊妈挤羊奶网站 | 国产精品日韩在线观看 | а天堂中文最新版在线 | а天堂中文最新版在线 | 逼逼爱 | 亚洲第一区在线观看 | 精品精品国产自在久久高清 | 99精品国产综合久久久久 | 色狠狠色狠狠综合天天 | 波多野结衣女老师 | 亚洲精品在线看 | 精品久久久久国产免费 | 亚洲444777KKK在线观看 | 成人快插 | sp啪啪调教打屁股网站 | 国内精品视频一区二区三区八戒 | 精品国产免费一区二区三区 | 亚洲AV国产国产久青草 | 日韩精品中文字幕视频一区 | 99re8在这里只有精品23 | 秋霞717理论片在线观看 | 亚洲精品无码不卡在线观看 | 456老汉gay | 18欧美同性videos可播放 | 成人福利视频网址 | h肉动漫在线视频无修无遮挡 | 免费视频 久久久 | 大又大又粗又爽女人毛片 | 成人免费观看在线视频 | 好男人资源大全免费观看 | 婚前试爱全集免费观看 | 天美传媒传媒免费观看 | 亚洲精品成人A8198A片漫画 | 污文啊好棒棒啊好了 | 国产a不卡片精品免费观看 国产aaa伦理片 | 欧美精品久久久久久久免费观看 | 视频一区二区三区在线 | 欧美高清videosdesex0| poverty中国老妇人 | 亚洲 欧美 中文 日韩 视频 |