nnuer
강희태@gmlxo9917

헤드라인 속 광택 타일이 회전하며 튀어나오는 등장 효과

텍스트 효과 인터랙션

세 줄 헤드라인의 각 줄 가운데 박힌 3D 타일이 0에서 커지며 회전하고, 살짝 넘쳤다가 제자리로 돌아옵니다. 줄마다 110ms씩 늦게 시작하고 다시 보기로 반복할 수 있습니다.

#pop#spring#headline#3d2026. 10. 17. 업데이트

블록 신고

운영자가 확인한 뒤 필요하면 블록을 숨깁니다.

사유
Claude Code · Claude Opus 5.5 · React (TSX)
결과 코드펼치기
import { useEffect, useRef, useState } from "react";

const ART = "https://nnuer.site/brand/landing";
const ROWS = [
  { before: "AI로 만든", tile: "tile-violet.webp", after: "화면을" },
  { before: "프롬프트", tile: "tile-pink.webp", after: "그대로" },
  { before: "다시 만드는", tile: "tile-cyan.webp", after: "곳" },
];

/** Glossy tiles inside a headline spin and spring up from nothing, one line after another */
export default function TilePopHeadline() {
  const tiles = useRef<(HTMLImageElement | null)[]>([]);
  const [run, setRun] = useState(0);

  useEffect(() => {
    if (matchMedia("(prefers-reduced-motion: reduce)").matches) return;
    const animations = tiles.current.map((tile, i) =>
      tile?.animate([{ transform: "scale(0) rotate(-30deg)" }, { transform: "scale(1) rotate(0deg)" }], {
        duration: 700,
        delay: 250 + i * 110,
        easing: "cubic-bezier(0.2, 1.4, 0.4, 1)",
        fill: "both",
      }),
    );
    return () => animations.forEach((a) => a?.cancel());
  }, [run]);

  return (
    <section className="flex w-full flex-col items-center bg-[#fbfbfc] px-4 py-20 sm:py-28">
      <h2 className="text-center text-[clamp(26px,9vw,38px)] font-bold leading-[1.1] tracking-[-0.045em] text-[#111114] sm:text-[80px]">
        {ROWS.map((row, i) => (
          <span key={row.tile} className="block whitespace-nowrap">
            {row.before}{" "}
            <img
              ref={(el) => {
                tiles.current[i] = el;
              }}
              src={`${ART}/${row.tile}`}
              alt=""
              className="relative -top-[3px] mx-0.5 inline-block w-[1.05em] align-middle sm:-top-1.5 sm:mx-1.5 sm:w-[84px]"
            />{" "}
            {row.after}
          </span>
        ))}
      </h2>
      <button
        type="button"
        onClick={() => setRun((n) => n + 1)}
        className="mt-10 rounded-full border border-black/10 bg-white px-4 py-2 text-[13px] font-semibold text-[#5c5c68] hover:text-[#111114] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#7c3aed]"
      >
        다시 보기
      </button>
    </section>
  );
}

적용 사이트 0

이 블록이 실제로 쓰인 사이트입니다.

로그인하고 내 사이트 추가

아직 등록된 사이트가 없습니다. 이 블록을 쓴 사이트가 있다면 알려 주세요.

로그인하고 재현 결과 올리기

재현 후기

v1 · 0개

아직 이 버전의 프롬프트로 직접 만들어 본 사람이 없습니다. 첫 번째로 재현해 보세요.