CSS 버튼 호버 애니메이션 효과 모음과 샤인 모션 제작 가이드

웹 랜딩 페이지나 회원가입 화면에서 버튼에 마우스를 올렸을 때 아무런 시각적 반응이 없으면, 사용자는 그 요소가 클릭 가능한지 곧바로 확신하기 어렵습니다. CSS 버튼 호버 효과는 :hover 상태에서 색상이나 그림자, 의사 요소의 위치를 바꿔 이 버튼이 상호작용 가능한 요소라는 신호를 전달하는 장치입니다. 이 글에서는 대각선 빛 흐름(샤인), 3D 누름, 슬라이드 채우기 세 가지 대표 효과가 어떤 CSS 속성 조합으로 만들어지는지 그 원리를 설명합니다.

요약 ① 버튼 호버 효과는 대부분 ::before / ::after 의사 요소와 transform, box-shadow 속성의 조합으로 구현됩니다. ② 샤인 효과는 기울어진 반투명 그라디언트 바를 left 값으로 이동시키고, 3D 누름 효과는 box-shadow 깊이와 translateY 이동을 함께 줄여 눌리는 느낌을 만듭니다. ③ 의사 요소가 버튼 밖으로 삐져나오지 않도록 overflow: hidden을 선언하고, 터치 기기에서는 @media (hover: hover) 쿼리로 호버 애니메이션을 제한하는 것이 좋습니다.

버튼에 호버 효과가 필요한 이유

웹 페이지에서 사용자의 다음 행동을 유도하는 요소를 흔히 CTA(Call to Action) 버튼이라고 부릅니다. 버튼에 상태 변화가 전혀 없으면 사용자는 마우스를 올린 상태에서도 그 요소가 클릭 가능한지 즉시 알아채기 어렵습니다.

호버 시 색상이나 그림자, 위치가 바뀌는 시각적 피드백은 버튼이 상호작용 가능한 요소라는 사실을 알려주는 역할을 합니다. 단순히 색상만 바꾸는 방식 외에도, 의사 요소와 transform 속성을 조합하면 빛이 흐르는 샤인 효과, 눌리는 3D 효과, 배경이 채워지는 슬라이드 효과 등을 만들 수 있습니다.

버튼 호버 효과를 CSS로 직접 만드는 방법

세 가지 대표 효과의 구현 원리

버튼 호버 효과는 요소의 의사 요소(::before, ::after)와 transform, box-shadow 속성을 통해 구현됩니다.

  • 대각선 빛 흐름 효과 (Shine Effect): ::before 의사 요소로 -25도 기울어진 흰색 반투명 그라디언트 바를 생성하고, :hover 시 left: -100%에서 left: 180%로 통과시키는 방식입니다.
  • 3D 누름 효과 (3D Press Effect): box-shadow: 0 6px 0 #1e40af;로 깊이감을 주고, :active 시 transform: translateY(4px);와 그림자 축소를 조합하여 버튼이 눌리는 느낌을 표현합니다.
  • 슬라이드 채우기 효과 (Slide Fill Effect): ::before 요소를 width: 0 상태로 숨겨두었다가 마우스 호버 시 width: 100%로 넓혀 배경색이 왼쪽에서 오른쪽으로 채워지도록 연출합니다.

샤인(Shine) 빛 반사 버튼 CSS 코드 예시

대각선 빛 흐름 호버 버튼의 CSS 코드는 다음과 같습니다.

.btn-shine {
  position: relative;
  padding: 14px 32px;
  font-size: 16px;
  font-weight: 600;
  color: #ffffff;
  background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
  border: none;
  border-radius: 12px;
  overflow: hidden;
  cursor: pointer;
  box-shadow: 0 4px 14px rgba(37, 99, 235, 0.35);
  transition: all 0.3s ease;
}

.btn-shine::before {
  content: '';
  position: absolute;
  top: 0;
  left: -100%;
  width: 60%;
  height: 100%;
  background: linear-gradient(
    90deg,
    transparent,
    rgba(255, 255, 255, 0.4),
    transparent
  );
  transform: skewX(-25deg);
  transition: left 0.75s ease;
}

.btn-shine:hover::before {
  left: 180%;
}

.btn-shine:hover {
  transform: translateY(-2px);
  box-shadow: 0 6px 20px rgba(37, 99, 235, 0.45);
}

이 코드에서 색상 값이나 transition 지속시간을 하나씩 바꿔보면 원하는 느낌을 직접 조정할 수 있습니다.

참고 위와 같은 효과 코드를 매번 오픈소스 커뮤니티에서 찾아다니며 값을 수정하는 대신, 아래 도구에서 슬라이드 채우기·네온 글로우·빛 쓸고 지나가기 등 9가지 호버 프리셋을 미리 보며 CSS 코드를 바로 복사할 수 있습니다.

아래 도구에서 직접 확인해 보세요.

CSS 버튼 호버 효과 모음

샤인, 펄스, 글로우, 슬라이드 등 인기 버튼 호버 애니메이션 효과를 실시간 미리보고 최적화된 CSS 스타일시트를 복사해 보세요.


📖 실제 개발자/디자이너들이 겪는 현실적인 사연과 트러블 (사연 3선)

CSS 버튼 호버 효과는 겉보기엔 간단해 보이지만, 실제 서비스에 적용했을 때는 예기치 못한 이슈를 유발하곤 합니다. 실무에서 가장 빈번하게 마주치는 세 가지 대표적인 실패 및 개선 사례를 소개합니다.

사연 1: 결제 전환율 12% 하락의 주범이었던 자바스크립트 캔버스 애니메이션

핀테크 스타트업의 프론트엔드 개발자 A씨는 결제 페이지 CTA 버튼에 화려한 빛 반사(Shine) 효과를 넣기 위해 무거운 무거운 JavaScript 캔버스 기반 애니메이션 라이브러리를 도입했습니다. 데스크톱 환경에서는 시각적으로 훌륭했지만, 모바일 환경에서는 렌더링 부하로 인해 입력 지연(Input Delay)이 발생했습니다. 결과적으로 사용자가 결제 버튼을 눌러도 즉각 반응하지 않아 여러 번 누르거나 이탈하면서 모바일 결제 전환율(Conversion Rate)이 무려 12%나 하락하는 참사가 벌어졌습니다. A씨는 이를 해결하기 위해 무거운 스크립트를 걷어내고, 하드웨어 가속(GPU)이 완벽하게 지원되는 순수 CSS transform: translate3d()skewX()를 활용한 60fps 샤인 효과로 전면 교체했습니다. 그 결과 렌더링 지연이 0에 가깝게 줄어들며 잃어버렸던 전환율을 단숨에 회복할 수 있었습니다.

사연 2: 스마트폰 화면에 영원히 박제된 터치 호버 스티키 버그 (Sticky Hover)

모바일 웹 퍼블리셔 B씨는 데스크톱에서 완벽하게 작동하는 슬라이드 채우기(Slide Fill) 호버 버튼을 모바일 웹에 그대로 배포했습니다. 그런데 iOS와 안드로이드 스마트폰 사용자들이 화면을 스크롤하기 위해 버튼을 한 번 터치하고 지나가자, 버튼이 눌린 호버 상태 그대로 영구적으로 멈춰버리는(Stuck) 현상이 발생했습니다. 이는 모바일 브라우저가 첫 터치를 호버로 인식하고, 다른 곳을 터치하기 전까지 호버 상태를 해제하지 않는 고질적인 터치 호버 스티키 버그였습니다. B씨는 수많은 시행착오 끝에 모든 호버 스타일(Hover Style)을 미디어 쿼리 @media (hover: hover) and (pointer: fine)로 감싸는 방식으로 해결했습니다. 마우스 같은 정밀한 포인터가 있는 환경에서만 호버가 작동하도록 분기 처리함으로써, 모바일 기기에서의 어색한 잔상 버그를 완벽하게 차단할 수 있었습니다.

사연 3: 22%의 클릭률 상승을 이끈 3D 물리 버튼의 시각적 촉각 피드백

이커머스 서비스의 프로덕트 디자이너 C씨는 플랫(Flat)한 2D 버튼과 입체적인 3D 버튼의 장바구니 담기 클릭률을 A/B 테스트했습니다. 플랫 버튼은 색상만 변했지만, 3D 버튼은 평상시에 box-shadow: 0 6px 0 #1e40af 속성으로 깊이감을 주고 클릭(Active) 시 그림자를 없애면서 물리적으로 아래로 내려가는 translateY(4px) 애니메이션을 적용했습니다. 결과는 놀라웠습니다. 모바일 환경에서 3D 눌림 버튼은 플랫 버튼 대비 22% 더 높은 장바구니 담기 클릭률을 기록했습니다. 화면 유리에 불과한 스마트폰 터치스크린에서 사용자가 버튼을 눌렀다는 확실한 시각적·촉각적 피드백(Tactile Visual Feedback)을 제공하여, 시스템이 자신의 명령을 정확히 인지했다는 심리적 안도감과 만족감을 주었기 때문입니다.


🔬 핵심 기술 메커니즘: 고성능 CSS 버튼의 3대 아키텍처 원칙

버튼 호버 효과가 성능 저하 없이 60fps로 매끄럽게 동작하기 위해서는 브라우저의 렌더링 파이프라인(Layout $ o$ Paint $ o$ Composite)을 정확히 이해하고 제어해야 합니다.

1. 의사 요소(Pseudo-element)의 기하학적 변형 (::before, ::after)

버튼 본체 자체의 레이아웃을 변형하지 않고, 독립적인 시각 레이어를 추가하기 위해 의사 요소를 활용합니다. 샤인 효과를 예로 들면, 빛의 궤적을 표현하기 위해 아래와 같은 반투명 그라디언트를 생성합니다. background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent) 이후 이 빛기둥을 left 혹은 GPU 가속을 받는 transform: translateX() 속성을 이용해 버튼 좌측 바깥에서 우측 바깥으로 통과시켜 동적인 질감을 부여합니다.

2. 레이어 스태킹(Layer Stacking) 및 페인트 격리 (Paint Containment)

동적으로 움직이는 의사 요소가 버튼 주변의 다른 DOM 요소를 침범하지 않도록 격리하는 것이 핵심입니다.

  • position: relative; overflow: hidden;: 이 두 속성은 부모 요소인 버튼에 렌더링 경계(Clipping Mask)를 생성합니다. 의사 요소의 빛줄기가 아무리 길어져도 버튼 테두리 밖으로는 렌더링되지 않습니다.
  • z-index: 1 (텍스트 레이블): 배경을 덮는 슬라이드 효과나 네온 효과가 텍스트를 가리지 않도록, 버튼 내부의 텍스트 요소를 위로 끌어올려 접근성과 가독성을 보호합니다.

3. 3D 엘리베이션 및 물리적 누름(Depress) 알고리즘

화면 속 요소에 실제 버튼 같은 무게감을 부여하기 위해서는 Y축 이동 거리와 그림자의 수축량이 정확하게 일치해야 합니다.

  • Resting (기본 상태): box-shadow: 0 6px 0 var(--shadow-color); transform: translateY(0);
  • Hover (마우스 오버): box-shadow: 0 8px 0 var(--shadow-color); transform: translateY(-2px); (공중에 살짝 뜨는 효과)
  • Active (클릭 상태): box-shadow: 0 2px 0 var(--shadow-color); transform: translateY(4px); (그림자가 4px 줄어든 만큼 버튼 본체도 4px 하강) 이러한 물리적 순수 이동(Net Displacement) 공식이 맞아떨어질 때 인간의 뇌는 이를 현실 세계의 3D 객체로 자연스럽게 인지하게 됩니다.

모바일 터치 디바이스 호버 격리 전략 (Touch Hover Isolation)

미디어 쿼리의 진화로 더 이상 JavaScript로 기기 환경을 감지할 필요가 없습니다. 모바일 스티키 호버 버그를 막기 위한 표준화된 CSS 블록은 다음과 같습니다.


@media (hover: hover) and (pointer: fine) {
  /* 데스크톱 등 마우스(정밀 포인터)가 있는 환경에서만 호버 발동 */
  .btn:hover { 
    transform: translateY(-2px);
    box-shadow: 0 6px 15px rgba(0,0,0,0.2);
  }
}

📊 9대 모던 CSS 버튼 호버 스타일 비교 분석 매트릭스

프로젝트의 성격과 대상 기기에 따라 어울리는 호버 효과는 천차만별입니다. 각 스타일별 특징과 성능(GPU Overhead), 구현 난이도, 모바일 친화도, 그리고 추천 사용처를 한눈에 비교해 보세요.

호버 스타일 (Hover Style)GPU 부하구현 난이도모바일 터치 친화도추천 사용처 (Best Use Case)
샤인 빛 반사 (Shine Beam)낮음중간매우 우수SaaS 영웅 영역 CTA, 핀테크 가입 버튼
3D 물리 누름 (3D Push/Depth)매우 낮음낮음우수 (활성 상태)이커머스 장바구니, 게임 웹사이트
슬라이드 배경 채우기 (Slide Fill)낮음중간보통 (잔상 주의)포트폴리오 사이트, 미니멀 기업 웹사이트
파문 물결 (Ripple Wave)높음높음보통머티리얼 디자인 UI, 안드로이드 웹뷰
네온 글로우 펄스 (Neon Glow)중간중간낮음 (배터리 소모)사이버펑크 디자인, 야간 모드(Dark Mode) 앱
그라디언트 테두리 순환 (Border Sweep)높음매우 높음낮음Web3, 블록체인, 하이엔드 테크 플랫폼
마그네틱 떨림 (Magnetic Jiggle)중간높음불량장난스러운 에이전시, 창의적인 크리에이티브 스튜디오
내부 음각 (Inset Bevel)매우 낮음낮음우수관리자 대시보드(Admin), 산업용 소프트웨어
미니멀 밑줄 (Minimal Underline)매우 낮음매우 낮음우수본문 내 텍스트 링크, 블로그 내비게이션

⚠️ 절대 피해야 할 5가지 버튼 호버 스타일링 실수

잘못 구현된 호버 애니메이션은 차라리 없는 것만 못합니다. 아래의 대표적인 실수 5가지를 반드시 점검하세요.

  1. @media (hover: hover) 누락 (모바일 터치 스티키 현상) 가장 흔하면서도 치명적인 실수입니다. 모바일 기기 사용자가 버튼을 탭하면 애니메이션이 발동한 채 굳어버리며, 이는 사용자에게 시스템이 멈춘 듯한 불안감을 줍니다.
  2. 레이아웃 속성(padding, width, margin) 애니메이팅으로 인한 리플로우(Reflow) 버벅임 크기나 여백을 직접 변경하면 브라우저는 화면 전체의 레이아웃을 다시 계산(Layout Thrashing)해야 합니다. 애니메이션은 반드시 레이아웃 계산을 건너뛰는 transform(scale)과 opacity 속성만 사용해야 60fps를 방어할 수 있습니다.
  3. 둥근 버튼(Rounded Button)에서의 overflow: hidden 누락 border-radius가 적용된 버튼에서 내부 의사 요소가 움직일 때, 모서리 바깥쪽으로 네모난 배경이 삐져나와(Bleeding) 퀄리티가 급격히 하락합니다. 반드시 overflow: hidden을 함께 선언해야 합니다.
  4. 의사 요소가 버튼 텍스트를 덮어버리는 가독성 훼손 (Z-index 꼬임) 화려한 슬라이드 채우기를 구현하다 배경 요소가 글자 위로 올라가 텍스트 대비가 무너지거나 클릭조차 막히는 경우가 있습니다. 의사 요소에는 z-index: -1을, 텍스트 요소에는 명시적인 쌓임 맥락을 부여해야 합니다.
  5. 키보드 접근성(:focus-visible) 고려 누락 마우스 호버에만 신경 쓰다 키보드의 Tab 키로 이동하는 사용자를 위한 시각적 표시를 잊곤 합니다. 호버 상태와 동일하거나 더 뚜렷한 포커스 링(:focus-visible)을 반드시 구현하여 웹 접근성 지침을 준수해야 합니다.

💡 5단계 프로덕션 레벨 마이크로 인터랙션 버튼 워크플로우

현업에서 수백만 트래픽을 감당하는 안정적인 버튼을 제작하기 위한 표준화된 워크플로우 5단계입니다.

  1. 시맨틱 마크업 및 기본 타이포그래피 설정 (Base Setup) 접근성이 확보된 의미론적 <button> 또는 <a> 태그를 선언하고, 넉넉한 터치 영역(Padding)과 명확한 폰트 시스템을 적용합니다.
  2. GPU 가속 트랜지션 및 섀도우 베이스 구성 (GPU Pipeline) 애니메이션될 속성만 골라 transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.2s; 형태로 렌더링 파이프라인 최적화 트랜지션을 선언합니다.
  3. 의사 요소(Pseudo-element) 인젝션 및 클릭 방지 (Pointer-events) ::before 또는 ::after를 생성해 애니메이션 객체를 만듭니다. 이때 의사 요소가 마우스 이벤트를 가로채지 않도록 반드시 pointer-events: nonez-index: -1을 할당합니다.
  4. 터치 호버 방지 미디어 쿼리 래핑 (Hover Isolation) 마우스 오버 이벤트에 대한 정의(예: :hover::before { left: 100%; })를 @media (hover: hover) 블록 내부에 안전하게 격리시킵니다.
  5. 키보드 포커스 및 액티브 눌림 물리 엔진 검증 (Active & Focus) Tab 키로 버튼 이동 시 :focus-visible 외곽선이 뚜렷한지 확인하고, 스페이스바나 엔터 키(또는 마우스 좌클릭)로 누를 때 :active 상태의 Y축 물리 하강(translateY)이 자연스러운지 최종 테스트합니다.

🔍 전문가가 공개하는 마이크로 인터랙션 디테일 팁 7선

버튼의 퀄리티는 1픽셀, 0.1초의 미세한 디테일에서 결정됩니다. 상위 1% 프론트엔드 엔지니어들이 적용하는 팁을 소개합니다.

  1. pointer-events: none의 마법: 의사 요소에 이 속성을 주면, 겹쳐진 레이어로 인해 브라우저가 클릭 위치를 혼동하여 클릭 이벤트가 부모로 전파(Bubbling)되지 않는 현상을 완벽히 차단할 수 있습니다.
  2. 스냅감이 생명! 트랜지션 시간은 $150 sim 250 ext{ms}$로 제한: 호버 애니메이션이 300ms를 초과하면 시스템이 느리다는 인상을 줍니다. 인간의 눈에 가장 기민하게 느껴지는 골디락스 존은 150ms에서 250ms 사이입니다.
  3. 그림자 수축량 = 하강 거리 공식 성립: :active 상태에서 box-shadow의 Y축 오프셋이 6px에서 2px로 줄었다면, 반드시 transform: translateY(4px)로 본체를 4px 내려 물리 법칙을 완벽히 매칭시켜야 합니다.
  4. 미세한 확대(Scale)로 마그네틱 인게이지먼트 유도: 호버 시 단순히 색상만 바꾸지 말고 transform: scale(1.02)를 살짝 섞어주면, 요소가 마우스 포인터로 자석처럼 끌려오는 듯한 몰입감을 줍니다.
  5. 복잡한 3D 연산 전 will-change: transform 선언: 빛 쓸기 효과나 다중 3D 회전이 겹치는 버튼이라면 호버 직전 브라우저에 렌더링 최적화 힌트를 주는 will-change 속성을 사용하여 초기 버벅임(Jank)을 방지하세요.
  6. WCAG 4.5:1 대비율 더블 체크: 일반 상태뿐만 아니라 '호버 된 상태'의 배경색상과 텍스트 컬러 역시 대비율(Contrast Ratio) 최소 4.5:1 (웹 접근성 AA등급)을 만족해야 합니다.
  7. 자동화된 웹 툴 적극 활용: 직접 CSS 코드를 수십 줄 작성하며 오타와 씨름하는 대신, 본 페이지 상단의 웹 도구를 사용하여 완벽하게 검증된 크로스 브라우징 CSS 코드를 단 1초 만에 복사하여 생산성을 극대화하세요.

🎯 최종 결정 트리 (Decision Tree): 내 브랜드에 맞는 호버 효과 고르기

다양한 호버 효과 중에서 지금 진행 중인 프로젝트에 가장 알맞은 스타일을 빠르게 결정해 보세요.

  • Q: 다루고 있는 서비스의 브랜드 톤앤매너(Tone & Manner)는 무엇입니까?
    • 전문적이고 신뢰감을 주어야 하는 B2B, 금융, 코퍼레이트 사이트인가요?[샤인 빛 반사(Shine Beam)] 또는 [미세한 내부 음각(Inset Bevel)]. (과도한 움직임을 배제하고 은은하고 고급스러운 신뢰감을 전달합니다.)
    • 트렌디하고 역동적인 스타트업, SaaS, 혹은 모던 웹앱인가요?[슬라이드 배경 채우기(Slide Fill)] 또는 [부드러운 확대(Scale Up)]. (젊고 활기차며 디지털 네이티브 사용자에게 익숙한 세련된 모션을 제공합니다.)
    • 재미와 상호작용이 핵심인 게임, 엔터테인먼트, 키즈 서비스인가요?[3D 물리 누름(3D Depress)] 또는 [마그네틱 흔들림(Magnetic Jiggle)]. (사용자의 조작에 가장 극적이고 장난스러운 피드백을 주어 체류 시간을 늘립니다.)

📑 핵심 용어 사전 (Terminology Cheatsheet)

웹 애니메이션과 마이크로 인터랙션을 다룰 때 꼭 알아야 할 필수 개념 요약집입니다.

  • 의사 요소 (Pseudo-elements, ::before, ::after): HTML 마크업에 존재하지 않지만 CSS를 통해 가상으로 생성해낼 수 있는 시각적 장식 요소. 레이아웃을 해치지 않고 애니메이션 층을 추가할 때 핵심적으로 쓰입니다.
  • 샤인 효과 (Shine Beam): 비스듬히 기울어진 빛기둥 텍스처를 버튼 위로 빠르게 스쳐 지나가게 하여 금속이나 유리가 반짝이는 듯한 착시를 주는 인터랙션 기법.
  • 3D 누름 (3D Depress): CSS box-shadow로 두꺼운 입체감을 묘사하고, 클릭 시 섀도우를 줄이면서 버튼을 아래로 이동(Y축)시켜 물리적인 버튼을 누르는 느낌을 주는 물리 엔진 효과.
  • 터치 호버 스티키 버그 (Sticky Hover): 모바일 환경에서 사용자가 터치한 후 호버 효과가 해제되지 않고 화면에 잔상처럼 영구적으로 멈춰있는 오류.
  • hover: hover 미디어 쿼리: 기기가 마우스처럼 정밀하게 화면 위에 포인터를 띄워둘 수 있는(Hover) 장치인지 판별하여 CSS 블록을 분기하는 최신 웹 표준 쿼리.
  • 오버플로우 히든 (overflow: hidden): 부모 요소의 경계(Border)를 넘어가는 자식 요소나 의사 요소의 시각적 영역을 잘라내어(Clip) 보이지 않게 감추는 레이어 격리 속성.
  • 포커스 비저블 (:focus-visible): 마우스 클릭이 아닌, 키보드 탭(Tab) 키 이동 등을 통해 요소가 포커스 되었을 때만 시각적 외곽선을 그려주는 접근성 가이드라인 핵심 속성.
  • 하드웨어 가속 (Hardware Acceleration): 렌더링 계산을 브라우저 메인 스레드(CPU)가 아닌 그래픽 카드(GPU)에 위임하여 복잡한 애니메이션을 버벅임 없이 60fps로 매끄럽게 처리하는 기술 (transform, opacity 등이 이에 해당).

자주 묻는 질문

Q1. 스마트폰에서 버튼을 누르면 호버 애니메이션이 안 없어지고 굳어버리는데 왜 그런가요?

A1. 모바일 터치스크린은 본질적으로 마우스 포인터의 '허공에 떠 있는 상태(Hover)' 개념이 존재하지 않습니다. 모바일 브라우저는 호환성을 위해 첫 번째 터치를 마우스 호버로 간주하고 렌더링을 멈춰버립니다(Sticky Hover). 이를 해결하려면 반드시 CSS 호버 코드를 @media (hover: hover) and (pointer: fine) { ... } 쿼리 안으로 감싸주어, 스마트폰 환경에서는 호버 애니메이션이 아예 작동하지 않게 분기 처리해야 합니다.

Q2. 3D 버튼의 눌림 물리 효과를 완벽하게 구현하는 계산 공식이 따로 있나요?

A2. 네, '총 이동 거리 보존의 법칙'을 따라야 뇌가 자연스럽게 인식합니다. 평상시 그림자가 box-shadow: 0 6px 0이고, 버튼을 누를 때(:active) box-shadow: 0 2px 0으로 줄어든다면, 그림자가 4px만큼 수축한 것입니다. 이 수축한 4px 만큼 버튼 본체를 물리적으로 아래로 내려야 하므로, 반드시 transform: translateY(4px)를 선언해 주어야 완벽한 3D 역학이 완성됩니다.

Q3. 의사 요소(::before)로 만든 슬라이드 배경이 버튼 글씨(Text)를 덮어버려서 가독성이 훼손됩니다. 어떻게 고치나요?

A3. 레이어 스태킹 맥락(Stacking Context)이 엉켰기 때문입니다. 이를 해결하려면 첫째, 덮여버린 버튼 안의 텍스트를 <span> 요소로 감싸고 position: relative; z-index: 1;을 주어 위로 끌어올립니다. 둘째, 배경 채우기를 담당하는 의사 요소 ::before에는 반드시 z-index: -1을 선언하여 무조건 텍스트 레이어 아래로 깔리도록 계층 구조를 강제해야 합니다.

가격 보기카톡 무료 상담