목차
HTML 구조
버튼 스타일
잔물결 스타일
JavaScript 구현
확장 된 기능
다른 기술
순수한 CSS 구현
ES6 이전의 JavaScript
jQuery
반응
웹 프론트엔드 CSS 튜토리얼 재료 설계 버튼의 파급 효과를 재현하는 방법

재료 설계 버튼의 파급 효과를 재현하는 방법

Apr 02, 2025 am 03:34 AM

재료 설계 버튼의 파급 효과를 재현하는 방법

재료 디자인을 처음 만났을 때 버튼 구성 요소의 디자인 개념에 깊은 인상을 받았습니다. 파급 효과를 영리하게 사용하여 간단하고 우아한 방식으로 사용자에게 피드백을 제공합니다.

이 효과는 어떻게 달성됩니까? Material Design의 버튼은 단순한 잔물결 애니메이션 일뿐 만 아니라 애니메이션의 위치는 클릭 된 버튼의 위치에 따라 다릅니다.

코드를 통해 동일한 효과를 얻을 수 있습니다. 먼저 ES6 JavaScript를 사용하여 깨끗한 솔루션을 제공 한 다음 몇 가지 대안을 탐색합니다.

HTML 구조

우리의 목표는 불필요한 HTML 태그를 피하는 것이므로 코드를 최소한으로 사용합니다.

 <button>자세히 알아보십시오</button>

버튼 스타일

JavaScript를 사용하여 Ripples 요소의 스타일을 동적으로 설정해야하지만 CSS에서 다른 모든 스타일을 수행 할 수 있습니다. 버튼의 경우 두 가지 속성 만 포함해야합니다.

 버튼 {
  위치 : 상대;
  오버플로 : 숨겨진;
}

position: relative 우리는 position: absolute 요소는 우리가 그 위치를 제어하는 ​​데 필요합니다. 한편, overflow: hidden 파문이 버튼의 가장자리를 초과하는 것을 방지합니다. 다른 모든 속성은 선택 사항입니다. 그러나 이제 우리 버튼은 약간 날짜가 보입니다. 더 현대적인 출발점은 다음과 같습니다.

 /* 로봇은 재료의 기본 글꼴입니다*/
@import url ( 'https://fonts.googleapis.com/css2?family=roboto&display=swap');

버튼 {
  위치 : 상대;
  오버플로 : 숨겨진;
  전환 : 배경 400ms;
  색상 : #ffff;
  배경색 : #6200ee;
  패딩 : 1REM 2REM;
  Font-Family : 'Roboto', Sans-Serif;
  글꼴 크기 : 1.5REM;
  개요 : 0;
  국경 : 0;
  Border-Radius : 0.25REM;
  Box-Shadow : 0 0 0.5REM RGBA (0, 0, 0, 0.3);
  커서 : 포인터;
}

잔물결 스타일

나중에 JavaScript를 사용하여 Ripples를 .ripple 클래스로 사용합니다.<span></span> 요소는 HTML에 주입됩니다. 그러나 JavaScript로 이동하기 전에 CSS 에서이 잔물결의 스타일을 정의하여 언제든지 사용할 수 있습니다.

 span.ripple {
  위치 : 절대; /* 위에서 언급 한 절대 포지셔닝*/
  국경-라디우스 : 50%;
  변환 : 스케일 (0);
  애니메이션 : 리플 600ms 선형;
  배경색 : RGBA (255, 255, 255, 0.7);
}

잔물결을 둥글게 만들기 위해 border-radius 50%로 설정했습니다. 모든 잔물결이 처음부터 나타나도록 기본 스케일을 0으로 설정합니다. 이제 우리는 아직 아무것도 볼 수 없습니다. top , left , width 또는 height 특성에 대한 값을 설정하지 않았기 때문입니다. JavaScript를 사용하여 곧 이러한 속성을 주입하겠습니다.

CSS의 경우 마지막으로 추가해야 할 것은 애니메이션의 최종 상태입니다.

 @keyframes ripple {
  에게 {
    변환 : 스케일 (4);
    불투명도 : 0;
  }
}

keyframes 에서 시작 상태를 정의하기 위해 from Keyword를 사용하지 않습니까? 우리는 from 할 수 있고 CSS는 애니메이션 요소에 적용되는 값에 따라 결 측값을 구축합니다. 관련 값이 명시 적으로 선언 된 경우 (예 : transform: scale(0) ) 또는 기본값 (예 : opacity: 1 ) 인 경우 발생합니다.

JavaScript 구현

마지막으로, 우리는 잔물결의 위치와 크기를 동적으로 설정하려면 JavaScript가 필요합니다. 크기는 버튼의 크기를 기준으로해야하며 위치는 버튼 및 커서의 위치를 ​​기준으로해야합니다.

클릭 이벤트를 인수로 취하는 빈 함수로 시작합니다.

 기능 createripple (이벤트) {
  //
}

이벤트의 currentTarget 찾아 버튼에 액세스 할 것입니다.

 const button = event.currentTarget;

다음으로, 우리는 우리를 인스턴스화 할 것입니다<span></span> 버튼의 너비와 높이에 따라 직경과 반경을 요소하고 계산하십시오.

 const circle = document.createelement ( "span");
const 직경 = math.max (button.clientwidth, button.clientHeight);
const 반경 = 직경 / 2;

이제 잔물결에 필요한 나머지 속성을 정의 할 수 있습니다 : left , top , widthheight .

 Circle.style.width = circle.style.height =`$ {직경} 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에 요소를 추가하기 전에 이전 클릭에서 나왔을 수있는 잔물결이 있는지 확인하고 다음 잔물결을 실행하기 전에 삭제하는 것이 가장 좋습니다.

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

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

마지막 단계에서는 우리가 할 것입니다<span></span> 버튼 요소에 버튼 요소로 버튼 요소가 추가되어 버튼 내부에 주입됩니다.

 버튼. AppendChild (원);

우리의 기능이 완료된 후에는 남아있는 모든 것은 그것을 호출하는 것입니다. 이것은 여러 가지 방법으로 수행 할 수 있습니다. 페이지의 각 버튼에 잔물결을 추가하려면 다음과 같은 코드를 사용할 수 있습니다.

 const buttons = document.getElementsByTagName ( "버튼");
(버튼의 const 버튼) {
  button.addeventListener ( "클릭", Createripple);
}

이제 우리는 일하는 파급 효과가 있습니다!

확장 된 기능

이 효과를 버튼 위치 나 크기의 다른 변화와 결합하여 한 걸음 더 나아가고 싶다면 어떻게해야합니까? 결국, 사용자 정의는 우리 자신의 영향을 재현하기로 선택한 주요 장점 중 하나입니다. 확장 기능의 용이성을 테스트하기 위해 버튼이 특정 영역 내에있을 때 커서를 향해 버튼을 움직이는 "자석"효과를 추가하기로 결정했습니다.

Ripple 함수에 정의 된 동일한 변수 중 일부에 의존해야합니다. 불필요한 코드 복제를 피하려면 코드가 모두 액세스 할 수 있도록 어딘가에 저장해야합니다. 그러나 공유 변수의 범위를 각 개별 버튼으로 제한해야합니다. 이를 달성하는 한 가지 방법은 다음 예와 같이 클래스를 사용하는 것입니다.

자석 효과는 커서가 움직일 때마다 커서를 추적해야하므로 더 이상 잔물결을 만들기 위해 커서 위치를 계산할 필요가 없습니다. 대신, 우리는 cursorXcursorY 에 의존 할 수 있습니다.

두 가지 중요한 새로운 변수는 magneticPullXmagneticPullY 입니다. 그들은 커서 뒤에서 버튼을 당기는 우리의 자석 방법의 강도를 제어합니다. 따라서 잔물결의 중심을 정의 할 때는 새 버튼의 위치 (x 및 y)와 자기를 조정해야합니다.

 const offsetleft = this.left this.x * this.magneticpullx;
const offsettop = this.top this.y * this.magneticpully;

이러한 조합 효과를 모든 버튼에 적용하려면 각 버튼에 대한 새로운 클래스 인스턴스를 인스턴스화해야합니다.

 const buttons = document.getElementsByTagName ( "버튼");
(버튼의 const 버튼) {
  새 버튼 (버튼);
}

다른 기술

물론 이것은 파급 효과를 달성하는 한 가지 방법 일뿐입니다. Codepen에는 다른 구현을 보여주는 많은 예가 있습니다. 다음은 제가 가장 좋아하는 예입니다.

순수한 CSS 구현

사용자가 JavaScript를 비활성화하면 파급 효과에는 백업 솔루션이 없습니다. 그러나 CSS 만 사용하여 :active 의사 클래스를 사용하여 클릭에 응답하면 원래 효과에 가까워 질 수 있습니다. 주요 제한 사항은 잔물결이 한 지점 (일반적으로 버튼의 중앙)에서만 클릭 위치에 응답하지 않아야한다는 것입니다. Ben Szabo 의이 예는 특히 간결합니다.

ES6 이전의 JavaScript

Leandro Parice의 데모는 구현과 유사하지만 이전 버전의 JavaScript와 호환됩니다.

jQuery

이 예제는 jQuery를 사용하여 파급 효과를 달성합니다. 이미 jQuery를 종속성으로 가지고 있다면 몇 줄의 코드를 저장하는 데 도움이 될 수 있습니다.

반응

마지막으로, 저의 또 다른 예가 있습니다. State 및 Refs와 같은 React의 기능은 파급 효과를 만드는 데 사용될 수 있지만 절대적으로 필요하지는 않습니다. 잔물결의 위치와 크기는 각 클릭마다 계산해야 하므로이 정보를 주에 유지하는 데 이점이 없습니다. 또한 클릭 이벤트에서 버튼 요소에 액세스 할 수 있으므로 심판도 필요하지 않습니다.

이 반응 예제는이 기사의 첫 번째 구현과 동일한 createRipple 기능을 사용합니다. 주요 차이점은 Button 구성 요소의 방법으로서 우리의 기능이 해당 구성 요소에 스코핑된다는 것입니다. 또한 onClick 이벤트 리스너는 이제 JSX의 일부입니다.

이 응답은 원래 이미지 형식을 유지하고보다 자연스러운 흐름과 개선 된 가독성을 위해 문구와 문장을 보상하면서 텍스트의 핵심 의미를 변경하지 않습니다. 또한 이미지에 대한 설명적인 ALT 텍스트를 사용합니다.

위 내용은 재료 설계 버튼의 파급 효과를 재현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제

스타일링은 CSS와 다르게 링크를 방문했습니다 스타일링은 CSS와 다르게 링크를 방문했습니다 Jul 11, 2025 am 03:26 AM

방문한 링크 스타일을 설정하면 사용자 경험, 특히 콘텐츠 집약적 인 웹 사이트에서 사용자 경험이 향상되어 사용자가 더 잘 탐색 할 수 있습니다. 1. CSS 사용 : 방문 링크의 스타일을 정의하여 색상 변경; 2. 브라우저는 개인 정보 보호 제한으로 인해 일부 속성을 수정할 수 있습니다. 3. 색상 선택은 갑자기 갑자기 피하기 위해 전체 스타일과 조정되어야합니다. 4. 모바일 터미널은이 효과를 표시하지 않을 수 있으며 아이콘 보조 로고와 같은 다른 시각적 프롬프트와 결합하는 것이 좋습니다.

디스플레이의 차이점은 무엇입니까 : 인라인, 디스플레이 : 블록 및 디스플레이 : 인라인 블록? 디스플레이의 차이점은 무엇입니까 : 인라인, 디스플레이 : 블록 및 디스플레이 : 인라인 블록? Jul 11, 2025 am 03:25 AM

themaindifferencesbetweendisplay : 인라인, 블록, andinline-blockinhtml/cssarelayoutbehavior, spaceusage 및 stylingcontrol.1.inlineElementsFlowWithText, do n'tStartonnewlines, ingorewidth/height, andonlyapplyhorizontalpadding/margins —IdealforIneTeTexting

CSS를 사용하여 반응 형 이미지를 만드는 방법? CSS를 사용하여 반응 형 이미지를 만드는 방법? Jul 15, 2025 am 01:10 AM

CSS를 사용하여 반응 형 이미지를 만들려면 다음과 같은 방법을 통해 주로 달성 할 수 있습니다. 1. Max width : 100% 및 높이 : Auto를 사용하여 이미지가 비율을 유지하면서 컨테이너 너비에 적응할 수 있도록합니다. 2. HTML의 SRCSET 및 크기 속성을 사용하여 다른 화면에 적합한 이미지 소스를 지능적으로로드하십시오. 3. 객체 적합 및 객체 위치를 사용하여 이미지 자르기 및 초점 디스플레이를 제어하십시오. 이 방법은 함께 이미지가 다른 장치에서 명확하고 아름답게 제시되도록합니다.

일반적인 CSS 브라우저 불일치는 무엇입니까? 일반적인 CSS 브라우저 불일치는 무엇입니까? Jul 26, 2025 am 07:04 AM

다른 브라우저는 CSS 구문 분석에 차이가있어 주로 기본 스타일 차이, 박스 모델 계산 방법, Flexbox 및 그리드 레이아웃 지원 수준 및 특정 CSS 속성의 일관성없는 동작을 포함하여 일관되지 않은 디스플레이 효과가 발생합니다. 1. 기본 스타일 처리는 일치하지 않습니다. 해결책은 CSSRESET 또는 NALLER.CSS를 사용하여 초기 스타일을 통합하는 것입니다. 2. IE의 이전 버전의 박스 모델 계산 방법은 다릅니다. 상자 크기 : 통일 된 방식으로 테두리 박스를 사용하는 것이 좋습니다. 3. Flexbox 및 Grid는 Edge Case 또는 Old 버전에서 다르게 수행합니다. 더 많은 테스트 및 AutopRefixer 사용; 4. 일부 CSS 속성 동작은 일관성이 없습니다. Caniuse는 상담하고 다운 그레이드해야합니다.

'불투명'속성을 설명하십시오 '불투명'속성을 설명하십시오 Jul 15, 2025 am 01:23 AM

불투명도는 CSS의 속성으로 요소의 전체 투명성을 제어하는 속성이며, 값은 0 (완전히 투명)에서 1 (완전히 불투명)입니다. 1. 이미지 호버 페이드 효과에 사용되며 불투명도 전환을 설정하여 대화식 경험을 향상시킵니다. 2. 텍스트 가독성을 향상시키기위한 배경 마스크 레이어 만들기; 3. 장애인 상태의 제어 버튼 또는 아이콘의 시각적 피드백. 지정된 색상 부분에만 영향을 미치는 RGBA와 달리 모든 자식 요소에 영향을 미칩니다. 전환으로 부드러운 애니메이션을 달성 할 수 있지만 자주 사용하면 성능에 영향을 줄 수 있습니다. 의지 변화 또는 변환과 함께 사용하는 것이 좋습니다. 불투명도를 합리적으로 적용하면 페이지 계층 및 상호 작용을 향상시킬 수 있지만 사용자와의 방해를 피해야합니다.

Accent-Color 속성은 무엇입니까? Accent-Color 속성은 무엇입니까? Jul 26, 2025 am 09:25 AM

Accent-Color는 CSS에서 확인란, 라디오 버튼 및 슬라이더와 같은 양식 요소의 하이라이트 색상을 사용자 정의하는 데 사용되는 속성입니다. 1. 확인란의 파란색 확인 표시를 빨간색으로 변경하는 것과 같이 양식 컨트롤의 선택한 상태의 기본 색상을 직접 변경합니다. 2. 지원되는 요소는 type = "checkbox", type = "radio"및 type = "range"의 입력 상자를 포함합니다. 3. Accent-Color를 사용하면 복잡한 맞춤형 스타일과 추가 DOM 구조를 피하고 기본 접근성을 유지할 수 있습니다. 4. 일반적으로 현대식 브라우저에서 지원되며 오래된 브라우저는 다운 그레이드해야합니다. 5. Accent-col을 설정하십시오

`: has ()`pseudo-class (부모 선택기)를 설명하십시오. `: has ()`pseudo-class (부모 선택기)를 설명하십시오. Jul 15, 2025 am 12:32 AM

: () pseudo-classincssallowstargetingaparentelementbasedonitschildelements.itworksbyusingthesyntaxparent : has (child-selector) toapplystylesconditionally.forexample, div : div : has (img) AppliessTylestoadivcontainingAnimage.MultipleSelectorselectorselcma

CSS 박스 크기 속성 이해 : Content-Box vs Border-Box CSS 박스 크기 속성 이해 : Content-Box vs Border-Box Jul 12, 2025 am 03:21 AM

너비가 100px 인 상자가 더 넓어지는 이유는 무엇입니까? 컨텐츠 박스 모델은 기본적으로 사용되므로 실제 너비에는 컨텐츠, 패딩 및 테두리가 포함됩니다. 1. 기본적으로 박스 크기는 컨텐츠 박스이며 너비 세트는 컨텐츠 영역 만 나타냅니다. 패딩과 테두리는 추가 전체 너비를 추가합니다. 2. 테두리 박스를 사용하여 너비 세트에 내용, 패딩 및 테두리가 포함되며 레이아웃이 더 직관적입니다. 3. 상자 크기를 설정하는 것이 좋습니다 : 레이아웃 오정렬을 피하기 위해 전 세계적으로 Border-Box; 특히 반응 형 디자인에 적합합니다. 4. Conte는 특별한 시나리오에서 사용할 수 있습니다

See all articles