国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
HTML結(jié)構(gòu)
按鈕樣式
漣漪樣式
JavaScript實(shí)現(xiàn)
擴(kuò)展功能
其他技術(shù)
純CSS實(shí)現(xiàn)
ES6之前的JavaScript
jQuery
React
首頁 web前端 css教學(xué) 如何重新創(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)畫,動(dòng)畫的位置還會(huì)根據(jù)點(diǎn)擊按鈕的位置而變化。

我們可以通過代碼實(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)在,我們的按鈕看起來有點(diǎn)過時(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類的<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è)漣漪都從無到有出現(xiàn),我們將默認(rèn)比例設(shè)置為0?,F(xiàn)在,我們還看不到任何內(nèi)容,因?yàn)槲覀冞€沒有為topleft 、 widthheight屬性設(shè)置值;我們很快就會(huì)使用JavaScript注入這些屬性。

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

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

請(qǐng)注意,我們?cè)?code>keyframes中沒有使用from關(guān)鍵字定義起始狀態(tài)?我們可以省略from ,CSS將根據(jù)應(yīng)用於動(dòng)畫元素的值構(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ù)開始,該函數(shù)將點(diǎn)擊事件作為參數(shù):

 function createRipple(event) {
  //
}

我們將通過查找事件的currentTarget來訪問我們的按鈕。

 const button = event.currentTarget;

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

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

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

 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之前,最好檢查是否存在任何可能來自先前點(diǎn)擊的剩餘漣漪,並在執(zhí)行下一個(gè)漣漪之前將其刪除。

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

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

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

 button.appendChild(circle);

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

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

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

擴(kuò)展功能

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

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

由於磁鐵效果需要在光標(biāo)每次移動(dòng)時(shí)跟蹤光標(biāo),因此我們不再需要計(jì)算光標(biāo)位置來創(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è)新的類實(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,我們的漣漪效果沒有任何後備方案。但是,僅使用CSS,使用:active偽類來響應(yīng)點(diǎn)擊,就可以接近原始效果。主要限制是漣漪只能從一個(gè)點(diǎn)出現(xiàn)——通常是按鈕的中心——而不是響應(yīng)我們的點(diǎn)擊位置。 Ben Szabo的這個(gè)例子特別簡(jiǎn)潔:

ES6之前的JavaScript

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

jQuery

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

React

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

此React示例使用與本文第一個(gè)實(shí)現(xiàn)相同的createRipple函數(shù)。主要區(qū)別在於——作為Button組件的方法——我們的函數(shù)的作用域限定為該組件。此外, onClick事件監(jiān)聽器現(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)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)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脫衣器

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整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
CSS教程,用於創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫 CSS教程,用於創(chuàng)建加載旋轉(zhuǎn)器和動(dòng)畫 Jul 07, 2025 am 12:07 AM

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

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

處理CSS瀏覽器兼容性和前綴問題需理解瀏覽器支持差異並合理使用廠商前綴。 1.了解常見問題如Flexbox、Grid支持不一,position:sticky失效,動(dòng)畫表現(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.不必追求所有瀏覽器一致,確

顯示:內(nèi)聯(lián),顯示:塊和顯示:內(nèi)聯(lián)塊之間有什麼區(qū)別? 顯示:內(nèi)聯(lián),顯示:塊和顯示:內(nèi)聯(lián)塊之間有什麼區(qū)別? Jul 11, 2025 am 03:25 AM

Themaindifferencesbetweendisplay:inline,block,andinline-blockinHTML/CSSarelayoutbehavior,spaceusage,andstylingcontrol.1.Inlineelementsflowwithtext,don’tstartonnewlines,ignorewidth/height,andonlyapplyhorizo????ntalpadding/margins—idealforinlinetextstyling

造型與CSS不同訪問的鏈接 造型與CSS不同訪問的鏈接 Jul 11, 2025 am 03:26 AM

設(shè)置訪問過鏈接的樣式能提升用戶體驗(yàn),尤其在內(nèi)容密集型網(wǎng)站中幫助用戶更好導(dǎo)航。 1.使用CSS的:visited偽類可定義已訪問鏈接樣式,如顏色變化;2.注意瀏覽器出於隱私限制僅允許修改部分屬性;3.顏色選擇應(yīng)與整體風(fēng)格協(xié)調(diào),避免突兀;4.移動(dòng)端可能不顯示該效果,建議結(jié)合其他視覺提示如icon輔助標(biāo)識(shí)。

使用CSS剪輯路徑創(chuàng)建自定義形狀 使用CSS剪輯路徑創(chuàng)建自定義形狀 Jul 09, 2025 am 01:29 AM

使用CSS的clip-path屬性可以裁剪元素為自定義形狀,如三角形、圓形缺口、多邊形等,無需依賴圖片或SVG。其優(yōu)勢(shì)包括:1.支持circle、ellipse、polygon等多種基本形狀;2.可響應(yīng)式調(diào)整,適配移動(dòng)端;3.易於動(dòng)畫化,可結(jié)合hover或JavaScript實(shí)現(xiàn)動(dòng)態(tài)效果;4.不影響佈局流,僅裁剪顯示區(qū)域。常見用法如圓形裁剪clip-path:circle(50pxatcenter)和三角形裁剪clip-path:polygon(50%0%,1000%,00%)。注意

如何使用CSS創(chuàng)建響應(yīng)式圖像? 如何使用CSS創(chuàng)建響應(yīng)式圖像? Jul 15, 2025 am 01:10 AM

要使用CSS創(chuàng)建響應(yīng)式圖片,主要可通過以下方法實(shí)現(xiàn):1.使用max-width:100%和height:auto讓圖片在保持比例的同時(shí)自適應(yīng)容器寬度;2.結(jié)合HTML的srcset和sizes屬性智能加載適配不同屏幕的圖片源;3.利用object-fit和object-position控製圖片裁剪與焦點(diǎn)展示。這些方法共同確保圖片在不同設(shè)備上清晰、美觀地呈現(xiàn)。

揭開CSS單元的神秘面紗:PX,EM,REM,VW,VH比較 揭開CSS單元的神秘面紗:PX,EM,REM,VW,VH比較 Jul 08, 2025 am 02:16 AM

CSS單位的選擇取決於設(shè)計(jì)需求和響應(yīng)式要求。 1.px用於固定尺寸,適合精確控制但缺乏彈性;2.em是相對(duì)單位,受父元素影響易導(dǎo)致級(jí)聯(lián)問題,rem則基於根元素更穩(wěn)定,適合全局縮放;3.vw/vh基於視口大小,適合響應(yīng)式設(shè)計(jì),但需注意極端屏幕下的表現(xiàn);4.選擇時(shí)應(yīng)根據(jù)是否需要響應(yīng)式調(diào)整、元素層級(jí)關(guān)係及視口依賴程度來決定,合理搭配使用可提升佈局靈活性與維護(hù)性。

什麼是常見的CSS瀏覽器不一致? 什麼是常見的CSS瀏覽器不一致? Jul 26, 2025 am 07:04 AM

不同瀏覽器對(duì)CSS解析存在差異,導(dǎo)致顯示效果不一致,主要包括默認(rèn)樣式差異、盒模型計(jì)算方式、Flexbox和Grid佈局支持程度及某些CSS屬性行為不一致。 1.默認(rèn)樣式處理不一致,解決方法是使用CSSReset或Normalize.css統(tǒng)一初始樣式;2.舊版IE的盒模型計(jì)算方式不同,建議統(tǒng)一使用box-sizing:border-box;3.Flexbox和Grid在邊緣情況或舊版本中表現(xiàn)有差異,應(yīng)多測(cè)試並使用Autoprefixer;4.某些CSS屬性行為不一致,需查閱CanIuse並提供降級(jí)

See all articles