Skip to content
훅으로 돌아가기

useButtonEffect

@hua-labs/hua/motion

버튼 클릭 리플 및 상태 피드백 애니메이션

설치

bash
npm install @hua-labs/hua
Import
tsx
import { useButtonEffect } from "@hua-labs/hua/framework";

@hua-labs/motion-core의 모션 훅을 @hua-labs/hua/framework에서 통합 제공합니다.

UI 컴포넌트, 모션 훅, i18n을 하나의 패키지로 사용할 수 있습니다.

기본 사용법

tsx
const btn = useButtonEffect({
  type: "scale",
  hoverScale: 1.05,
  activeScale: 0.95,
  duration: 150,
});

return (
  <button
    ref={btn.ref}
    style={btn.style}
    onMouseDown={btn.pressButton}
    onMouseUp={btn.releaseButton}
    onMouseEnter={() => btn.setButtonState("hover")}
    onMouseLeave={() => btn.setButtonState("idle")}
  >
    Click me
  </button>
);

docs:hooks.use-button-effect.examples.rippleEffect

tsx
const btn = useButtonEffect({
  type: "ripple",
  rippleColor: "rgba(255, 255, 255, 0.5)",
  rippleDuration: 600,
  duration: 200,
});

return (
  <button
    ref={btn.ref}
    style={btn.style}
    className="relative overflow-hidden bg-primary text-white px-6 py-3 rounded-lg"
    onMouseDown={btn.pressButton}
    onMouseUp={btn.releaseButton}
  >
    Ripple Button
    {btn.isAnimating && (
      <span
        style={{
          position: "absolute",
          left: btn.ripplePosition.x,
          top: btn.ripplePosition.y,
          width: 100,
          height: 100,
          borderRadius: "50%",
          background: btn.rippleColor,
          transform: "translate(-50%, -50%) scale(0)",
          animation: "ripple 600ms ease-out",
        }}
      />
    )}
  </button>
);

API 레퍼런스

옵션

이름타입기본값설명
type"scale" | "ripple" | "glow" | "shake" | "bounce" | "slide" | "custom""scale"docs:hooks.use-button-effect.options.type
durationnumber200docs:hooks.use-button-effect.options.duration
easingstring"ease-out"docs:hooks.use-button-effect.options.easing
scaleAmountnumber0.95docs:hooks.use-button-effect.options.scaleAmount
rippleColorstring"rgba(255, 255, 255, 0.6)"docs:hooks.use-button-effect.options.rippleColor
glowColorstring"#3b82f6"docs:hooks.use-button-effect.options.glowColor
hoverScalenumber1.05docs:hooks.use-button-effect.options.hoverScale
activeScalenumber0.95docs:hooks.use-button-effect.options.activeScale
disabledbooleanfalsedocs:hooks.use-button-effect.options.disabled
autoStartbooleanfalsedocs:hooks.use-button-effect.options.autoStart

반환값

이름타입설명
refRefObject<T | null>docs:hooks.use-button-effect.returns.ref
styleCSSPropertiesdocs:hooks.use-button-effect.returns.style
isPressedbooleandocs:hooks.use-button-effect.returns.isPressed
isHoveredbooleandocs:hooks.use-button-effect.returns.isHovered
isFocusedbooleandocs:hooks.use-button-effect.returns.isFocused
isAnimatingbooleandocs:hooks.use-button-effect.returns.isAnimating
buttonTypestringdocs:hooks.use-button-effect.returns.buttonType
ripplePosition{ x: number; y: number }docs:hooks.use-button-effect.returns.ripplePosition
pressButton() => voiddocs:hooks.use-button-effect.returns.pressButton
releaseButton() => voiddocs:hooks.use-button-effect.returns.releaseButton
setButtonState(state: "idle" | "hover" | "active" | "focus" | "disabled") => voiddocs:hooks.use-button-effect.returns.setButtonState
start() => voiddocs:hooks.use-button-effect.returns.start
stop() => voiddocs:hooks.use-button-effect.returns.stop
reset() => voiddocs:hooks.use-button-effect.returns.reset

사용 사례

버튼

버튼 호버 및 클릭 피드백 효과

인터랙티브 UI

제스처 기반 인터랙티브 컴포넌트

폼 제출

폼 제출 중 버튼 상태 변경

CTA 요소

클릭 유도 버튼 강조 애니메이션