亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
HTML結(jié)構(gòu)
按鈕樣式
漣漪樣式
JavaScript實(shí)現(xiàn)
擴(kuò)展功能
其他技術(shù)
純CSS實(shí)現(xiàn)
ES6之前的JavaScript
jQuery
React
首頁(yè) web前端 css教程 如何重新創(chuàng)建材料設(shè)計(jì)按鈕的連鎖效果

如何重新創(chuàng)建材料設(shè)計(jì)按鈕的連鎖效果

Apr 02, 2025 am 03:34 AM

How to Recreate the Ripple Effect of Material Design Buttons

初識(shí)Material Design時(shí),其按鈕組件的設(shè)計(jì)理念令我印象深刻。它巧妙地運(yùn)用漣漪效果,以簡(jiǎn)潔優(yōu)雅的方式向用戶提供反饋。

這種效果是如何實(shí)現(xiàn)的呢?Material Design的按鈕不僅僅是簡(jiǎn)單的漣漪動(dòng)畫(huà),動(dòng)畫(huà)的位置還會(huì)根據(jù)點(diǎn)擊按鈕的位置而變化。

我們可以通過(guò)代碼實(shí)現(xiàn)同樣的效果。首先,我們將使用ES6 JavaScript提供一個(gè)簡(jiǎn)潔的解決方案,然后再探討一些替代方法。

HTML結(jié)構(gòu)

我們的目標(biāo)是避免任何多余的HTML標(biāo)記,因此我們將使用最少的代碼:

<button>了解更多</button>

按鈕樣式

我們需要使用JavaScript動(dòng)態(tài)設(shè)置漣漪元素的一些樣式,但其他所有樣式都可以用CSS完成。對(duì)于我們的按鈕,只需要包含兩個(gè)屬性。

button {
  position: relative;
  overflow: hidden;
}

使用position: relative允許我們?cè)跐i漪元素上使用position: absolute,這是我們控制其位置所必需的。同時(shí),overflow: hidden防止?jié)i漪超出按鈕的邊緣。其他所有屬性都是可選的。但現(xiàn)在,我們的按鈕看起來(lái)有點(diǎn)過(guò)時(shí)了。下面是一個(gè)更現(xiàn)代的起點(diǎn):

/* Roboto是Material的默認(rèn)字體 */
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');

button {
  position: relative;
  overflow: hidden;
  transition: background 400ms;
  color: #fff;
  background-color: #6200ee;
  padding: 1rem 2rem;
  font-family: 'Roboto', sans-serif;
  font-size: 1.5rem;
  outline: 0;
  border: 0;
  border-radius: 0.25rem;
  box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.3);
  cursor: pointer;
}

漣漪樣式

稍后,我們將使用JavaScript將漣漪作為帶有.ripple類(lèi)的<span></span>元素注入到我們的HTML中。但在轉(zhuǎn)向JavaScript之前,讓我們?cè)贑SS中定義這些漣漪的樣式,以便我們隨時(shí)可以使用:

span.ripple {
  position: absolute; /* 我們前面提到的絕對(duì)定位 */
  border-radius: 50%;
  transform: scale(0);
  animation: ripple 600ms linear;
  background-color: rgba(255, 255, 255, 0.7);
}

為了使我們的漣漪呈圓形,我們將border-radius設(shè)置為50%。為了確保每個(gè)漣漪都從無(wú)到有出現(xiàn),我們將默認(rèn)比例設(shè)置為0?,F(xiàn)在,我們還看不到任何內(nèi)容,因?yàn)槲覀冞€沒(méi)有為top、leftwidthheight屬性設(shè)置值;我們很快就會(huì)使用JavaScript注入這些屬性。

至于我們的CSS,我們需要添加的最后一件事是動(dòng)畫(huà)的結(jié)束狀態(tài):

@keyframes ripple {
  to {
    transform: scale(4);
    opacity: 0;
  }
}

請(qǐng)注意,我們?cè)?code>keyframes中沒(méi)有使用from關(guān)鍵字定義起始狀態(tài)?我們可以省略from,CSS將根據(jù)應(yīng)用于動(dòng)畫(huà)元素的值構(gòu)建缺失的值。如果顯式聲明了相關(guān)值(如transform: scale(0)),或者它們是默認(rèn)值(如opacity: 1),則會(huì)發(fā)生這種情況。

JavaScript實(shí)現(xiàn)

最后,我們需要JavaScript動(dòng)態(tài)設(shè)置漣漪的位置和大小。大小應(yīng)基于按鈕的大小,而位置應(yīng)基于按鈕和光標(biāo)的位置。

我們將從一個(gè)空函數(shù)開(kāi)始,該函數(shù)將點(diǎn)擊事件作為參數(shù):

function createRipple(event) {
  //
}

我們將通過(guò)查找事件的currentTarget來(lái)訪問(wèn)我們的按鈕。

const button = event.currentTarget;

接下來(lái),我們將實(shí)例化我們的<span></span>元素,并根據(jù)按鈕的寬度和高度計(jì)算其直徑和半徑。

const circle = document.createElement("span");
const diameter = Math.max(button.clientWidth, button.clientHeight);
const radius = diameter / 2;

我們現(xiàn)在可以定義漣漪所需的其余屬性:left、topwidthheight。

circle.style.width = circle.style.height = `${diameter}px`;
circle.style.left = `${event.clientX - (button.offsetLeft   radius)}px`;
circle.style.top = `${event.clientY - (button.offsetTop   radius)}px`;
circle.classList.add("ripple");

在將<span></span>元素添加到DOM之前,最好檢查是否存在任何可能來(lái)自先前點(diǎn)擊的剩余漣漪,并在執(zhí)行下一個(gè)漣漪之前將其刪除。

const ripple = button.getElementsByClassName("ripple")[0];

if (ripple) {
  ripple.remove();
}

最后一步,我們將<span></span>作為子元素附加到按鈕元素,以便將其注入到按鈕內(nèi)部。

button.appendChild(circle);

我們的函數(shù)完成后,剩下的就是調(diào)用它了。這可以通過(guò)多種方式完成。如果我們想將漣漪添加到頁(yè)面上的每個(gè)按鈕,我們可以使用類(lèi)似這樣的代碼:

const buttons = document.getElementsByTagName("button");
for (const button of buttons) {
  button.addEventListener("click", createRipple);
}

現(xiàn)在我們已經(jīng)有了工作的漣漪效果!

擴(kuò)展功能

如果我們想更進(jìn)一步,將此效果與按鈕位置或大小的其他更改結(jié)合起來(lái)呢?畢竟,自定義能力是我們選擇自己重新創(chuàng)建效果的主要優(yōu)勢(shì)之一。為了測(cè)試擴(kuò)展函數(shù)的難易程度,我決定添加一個(gè)“磁鐵”效果,當(dāng)光標(biāo)位于特定區(qū)域內(nèi)時(shí),該效果會(huì)使我們的按鈕向光標(biāo)移動(dòng)。

我們需要依賴在漣漪函數(shù)中定義的一些相同變量。為了避免不必要地重復(fù)代碼,我們應(yīng)該將它們存儲(chǔ)在某個(gè)地方,以便這兩個(gè)方法都可以訪問(wèn)它們。但是我們也應(yīng)該將共享變量的作用域限定為每個(gè)單獨(dú)的按鈕。實(shí)現(xiàn)此目標(biāo)的一種方法是使用類(lèi),如下例所示:

由于磁鐵效果需要在光標(biāo)每次移動(dòng)時(shí)跟蹤光標(biāo),因此我們不再需要計(jì)算光標(biāo)位置來(lái)創(chuàng)建漣漪。相反,我們可以依賴cursorXcursorY。

兩個(gè)重要的新的變量是magneticPullXmagneticPullY。它們控制我們的磁鐵方法在光標(biāo)之后拉動(dòng)按鈕的強(qiáng)度。因此,當(dāng)我們定義漣漪的中心時(shí),我們需要調(diào)整新按鈕的位置(x和y)和磁力。

const offsetLeft = this.left   this.x * this.magneticPullX;
const offsetTop = this.top   this.y * this.magneticPullY;

要將這些組合效果應(yīng)用于所有按鈕,我們需要為每個(gè)按鈕實(shí)例化一個(gè)新的類(lèi)實(shí)例:

const buttons = document.getElementsByTagName("button");
for (const button of buttons) {
  new Button(button);
}

其他技術(shù)

當(dāng)然,這只是實(shí)現(xiàn)漣漪效果的一種方法。在CodePen上,有很多示例展示了不同的實(shí)現(xiàn)方式。以下是一些我最喜歡的例子。

純CSS實(shí)現(xiàn)

如果用戶禁用了JavaScript,我們的漣漪效果沒(méi)有任何后備方案。但是,僅使用CSS,使用:active偽類(lèi)來(lái)響應(yīng)點(diǎn)擊,就可以接近原始效果。主要限制是漣漪只能從一個(gè)點(diǎn)出現(xiàn)——通常是按鈕的中心——而不是響應(yīng)我們的點(diǎn)擊位置。Ben Szabo的這個(gè)例子特別簡(jiǎn)潔:

ES6之前的JavaScript

Leandro Parice的演示類(lèi)似于我們的實(shí)現(xiàn),但它與早期版本的JavaScript兼容:

jQuery

此示例使用jQuery來(lái)實(shí)現(xiàn)漣漪效果。如果您已經(jīng)將jQuery作為依賴項(xiàng),它可以幫助您節(jié)省幾行代碼。

React

最后,還有一個(gè)我的例子。雖然可以使用React的功能(如狀態(tài)和refs)來(lái)幫助創(chuàng)建漣漪效果,但這并不是絕對(duì)必要的。漣漪的位置和大小都需要為每次點(diǎn)擊計(jì)算,因此將這些信息保存在狀態(tài)中沒(méi)有任何優(yōu)勢(shì)。此外,我們可以從點(diǎn)擊事件中訪問(wèn)按鈕元素,因此我們也不需要refs。

此React示例使用與本文第一個(gè)實(shí)現(xiàn)相同的createRipple函數(shù)。主要區(qū)別在于——作為Button組件的方法——我們的函數(shù)的作用域限定為該組件。此外,onClick事件監(jiān)聽(tīng)器現(xiàn)在是我們JSX的一部分:

This response maintains the original image formatting and avoids altering the core meaning of the text while rewording phrases and sentences for a more natural flow and improved readability. It also uses more descriptive alt text for the images.

以上是如何重新創(chuàng)建材料設(shè)計(jì)按鈕的連鎖效果的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

什么是AutoPrefixer,它如何工作? 什么是AutoPrefixer,它如何工作? Jul 02, 2025 am 01:15 AM

Autoprefixer是一個(gè)根據(jù)目標(biāo)瀏覽器范圍自動(dòng)為CSS屬性添加廠商前綴的工具。1.它解決了手動(dòng)維護(hù)前綴易出錯(cuò)的問(wèn)題;2.通過(guò)PostCSS插件形式工作,解析CSS、分析需加前綴的屬性、依配置生成代碼;3.使用步驟包括安裝插件、設(shè)置browserslist、在構(gòu)建流程中啟用;4.注意事項(xiàng)有不手動(dòng)加前綴、保持配置更新、非所有屬性都加前綴、建議配合預(yù)處理器使用。

CSS教程,用于創(chuàng)建粘性標(biāo)頭或頁(yè)腳 CSS教程,用于創(chuàng)建粘性標(biāo)頭或頁(yè)腳 Jul 02, 2025 am 01:04 AM

TocreatestickyheadersandfooterswithCSS,useposition:stickyforheaderswithtopvalueandz-index,ensuringparentcontainersdon’trestrictit.1.Forstickyheaders:setposition:sticky,top:0,z-index,andbackgroundcolor.2.Forstickyfooters,betteruseposition:fixedwithbot

CSS教程,用于創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫(huà) CSS教程,用于創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫(huà) Jul 07, 2025 am 12:07 AM

創(chuàng)建CSS加載旋轉(zhuǎn)器的方法有三種:1.使用邊框的基本旋轉(zhuǎn)器,通過(guò)HTML和CSS實(shí)現(xiàn)簡(jiǎn)單動(dòng)畫(huà);2.使用多個(gè)點(diǎn)的自定義旋轉(zhuǎn)器,通過(guò)不同延遲時(shí)間實(shí)現(xiàn)跳動(dòng)效果;3.在按鈕中添加旋轉(zhuǎn)器,通過(guò)JavaScript切換類(lèi)來(lái)顯示加載狀態(tài)。每種方法都強(qiáng)調(diào)了設(shè)計(jì)細(xì)節(jié)如顏色、大小、可訪問(wèn)性和性能優(yōu)化的重要性,以提升用戶體驗(yàn)。

CSS教程專(zhuān)注于移動(dòng)優(yōu)先設(shè)計(jì) CSS教程專(zhuān)注于移動(dòng)優(yōu)先設(shè)計(jì) Jul 02, 2025 am 12:52 AM

Mobile-firstCSSdesignrequiressettingtheviewportmetatag,usingrelativeunits,stylingfromsmallscreensup,optimizingtypographyandtouchtargets.First,addtocontrolscaling.Second,use%,em,orreminsteadofpixelsforflexiblelayouts.Third,writebasestylesformobile,the

如何創(chuàng)建本質(zhì)上響應(yīng)的網(wǎng)格布局? 如何創(chuàng)建本質(zhì)上響應(yīng)的網(wǎng)格布局? Jul 02, 2025 am 01:19 AM

要?jiǎng)?chuàng)建內(nèi)在響應(yīng)式網(wǎng)格布局,核心方法是使用CSSGrid的repeat(auto-fit,minmax())模式;1.設(shè)置grid-template-columns:repeat(auto-fit,minmax(200px,1fr))讓瀏覽器自動(dòng)調(diào)整列數(shù)并限制每列最小和最大寬度;2.使用gap控制格子間距;3.容器應(yīng)設(shè)為相對(duì)單位如width:100%、配合box-sizing:border-box避免寬度計(jì)算錯(cuò)誤并用margin:auto居中;4.可選設(shè)置行高與內(nèi)容對(duì)齊方式提升視覺(jué)一致性,如row

如何將整個(gè)網(wǎng)格集中在視口中? 如何將整個(gè)網(wǎng)格集中在視口中? Jul 02, 2025 am 12:53 AM

要讓整個(gè)網(wǎng)格布局在視口中居中顯示,可通過(guò)以下方法實(shí)現(xiàn):1.使用margin:0auto實(shí)現(xiàn)水平居中,需設(shè)定容器固定寬度,適用于固定布局;2.利用Flexbox在外層容器設(shè)置justify-content和align-items屬性,結(jié)合min-height:100vh可實(shí)現(xiàn)垂直和水平居中,適合全屏展示場(chǎng)景;3.直接使用CSSGrid的place-items屬性在父容器上快速居中,簡(jiǎn)潔且現(xiàn)代瀏覽器支持良好,同時(shí)需確保父容器有足夠高度。每種方式均有適用場(chǎng)景和限制,根據(jù)實(shí)際需求選擇合適的方案即可。

CSS中使用@supports的功能檢測(cè)是什么? CSS中使用@supports的功能檢測(cè)是什么? Jul 02, 2025 am 01:14 AM

prainuredetectionIncsssusissuse@supportScheckSifabRowsEsuppecifortSupecifortEfeatureBeforeApplyingReplyingStyles.1.itusesconditionalcsssssbasssbasedonproperty-valueperty-valuepairs,suessas@supports@supports@supports@supports(display:grid)

解決CSS瀏覽器兼容性問(wèn)題和前綴 解決CSS瀏覽器兼容性問(wèn)題和前綴 Jul 07, 2025 am 01:44 AM

處理CSS瀏覽器兼容性和前綴問(wèn)題需理解瀏覽器支持差異并合理使用廠商前綴。1.了解常見(jiàn)問(wèn)題如Flexbox、Grid支持不一,position:sticky失效,動(dòng)畫(huà)表現(xiàn)不同;2.查閱CanIuse確認(rèn)特性支持情況;3.正確使用-webkit-、-moz-、-ms-、-o-等廠商前綴;4.推薦使用Autoprefixer自動(dòng)添加前綴;5.安裝PostCSS并配置browserslist指定目標(biāo)瀏覽器;6.構(gòu)建時(shí)自動(dòng)處理兼容性;7.老項(xiàng)目可用Modernizr檢測(cè)特性;8.不必追求所有瀏覽器一致,確

See all articles