国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - 編程技術(shù) - 如何用純 CSS 打造類 MaterialUI 的按鈕點(diǎn)擊動(dòng)畫并封裝成 React 組件

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

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

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

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

前言

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

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

正文

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

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

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

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

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

1. 原理

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

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

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

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

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

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

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

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

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

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

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

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

經(jīng)過優(yōu)化后的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. //適應(yīng)其父元素
  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. //設(shè)置初始狀態(tài)
  62. transition:0s;
  63. }
  64. }
  65. 復(fù)制代碼

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

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

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

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲高清久久 | 91在线精品一区二区三区 | 午夜激情在线免费观看 | 午夜在线小视频 | 亚洲视频免费 | 午夜欧美一区二区三区在线播放 | 视频三区| 久久午夜网站 | 日韩在线免费电影 | 国产色| 精品96久久久久久中文字幕无 | 亚洲综合精品久久 | 亚洲艹 | 日本视频免费 | 高清免费在线 | 麻豆乱码国产一区二区三区 | 美女视频一区 | 99久久毛片免费观看 | 国产片性视频免费播放 | 久久久亚洲国产天美传媒修理工 | 99免费在线播放99久久免费 | 色综合久久天天综合网 | 麻豆av一区| 高清在线一区 | 精品久久久久久 | 久草成人网 | 欧美一区二区三区的 | 日韩成人一级片 | 精品国产一区二区在线 | 天天躁人人躁人人躁狂躁 | 有码在线 | 黄色电影天堂 | 中文字幕免费观看 | 久久久一区二区三区 | 黑人av| 欧美中文在线 | 91久久精品国产91久久 | 亚洲成人精品在线观看 | 中文字幕不卡 | 久久一区| 在线亚洲精品 |