09波打つCTA帯
コーラルの帯の上端が波のひれのように横へ流れ、中のボタンが8px浮いてから着地し、影も一緒に縮みます。
使いどころページ下部のコンバージョン誘導帯
radial-gradienttranslateXtranslateY

<main class="stage">
<section class="ctam">
<div class="ctam__crest" aria-hidden="true"><span class="ctam__wave"></span></div>
<div class="ctam__body">
<div class="ctam__text">
<h2 class="ctam__head">パターンが必要な瞬間です</h2>
<p class="ctam__sub">今すぐ貼って次のセクションへ</p>
</div>
<button class="ctam__btn" type="button">
始める
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256" aria-hidden="true" focusable="false"><g fill="currentColor"><path d="m216 128l-72 72V56Z" opacity=".2"/><path d="m221.66 122.34l-72-72A8 8 0 0 0 136 56v64H40a8 8 0 0 0 0 16h96v64a8 8 0 0 0 13.66 5.66l72-72a8 8 0 0 0 0-11.32M152 180.69V75.31L204.69 128Z"/></g></svg>
</button>
</div>
</section>
</main>@use "../../../../site/static/demo-tokens" as *;
// 멤피스 팔레트 — 01 과 같은 값
$mem-base: #fdf4ec;
$mem-sheet: #ffffff;
$mem-ink: #241f26;
$mem-stone: #5d5560;
$mem-coral: #d5aea9;
$mem-lemon: #cec29c;
$mem-sky: #82adc2;
$mem-mint: #71b9ab;
$mem-pink: #ebd6db;
$duration: $dur-loop; // 물결이 한 칸(타일 폭) 흐르는 주기
$easing: $ease-out; // 버튼의 들렀다 앉음은 부드럽게
$color: $mem-coral; // 밴드 색 — 그 위 글자는 잉크(5.29:1)
@include stage($mem-base);
.ctam {
box-sizing: border-box;
width: clamp(288px, 92vw, 440px);
padding-top: $sp-5; // 물결 마루가 차지하는 높이(간격이 아니라 무늬 영역)
}
// 물결 마루 — 반경 그라디언트 반원이 도는 볏. 트랙은 타일 정수배 폭으로 넓혀 놓는다
.ctam__crest {
position: relative;
height: 20px;
overflow: hidden;
}
.ctam__wave {
position: absolute;
top: 0;
left: 0;
width: 480px; // 타일 24px 의 20배 — 24px 만 흐르면 처음과 같은 무늬
height: 20px;
background: radial-gradient(circle 12px at 12px 0, $color 0 11.5px, transparent 12px);
background-size: 24px 24px;
background-repeat: repeat-x;
animation: waveDrift $duration linear infinite;
}
// 밴드 본체 — 코랄에 잉크 글자(밝은 면 위 검은 글자가 멤피스의 원칙)
.ctam__body {
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
gap: $sp-3;
padding: $sp-4 $sp-5;
border-radius: 0 0 $r-card $r-card;
background: $color;
border: 3px solid $mem-ink;
border-top: 0;
box-shadow: 0 6px 0 $mem-ink;
}
.ctam__head {
margin: 0;
color: $mem-ink;
font-weight: 800; font-size: clamp(14px, 3.4vw, 18px); line-height: 1.25;
font-family: inherit;
}
.ctam__sub {
margin: $sp-1 0 0;
color: $mem-ink;
font-weight: 600; font-size: clamp(11px, 2.6vw, 13px); line-height: 1.3;
font-family: inherit;
}
// 버튼 — 레몬 면에 잉크 글자. 들렀다 바닥에 앉으면서 딱 붙은 그림자가 줄어든다
.ctam__btn {
display: inline-flex;
align-items: center;
gap: $sp-1;
flex: 0 0 auto;
padding: $sp-2 $sp-4;
border-radius: $r-control;
background: $mem-lemon;
border: 3px solid $mem-ink;
color: $mem-ink;
font-weight: 800; font-size: clamp(12px, 2.8vw, 14px); line-height: 1;
font-family: inherit;
box-shadow: 0 5px 0 $mem-ink;
animation: btnFloat $duration $easing infinite;
}
.ctam__btn svg { font-size: 1.2em; }
.ctam__btn:focus-visible { outline: 3px solid $mem-sheet; outline-offset: 2px; }
// 물결은 한 타일(24px)만 옆으로 — 무늬가 주기적이므로 이음매가 없다
@keyframes waveDrift {
from { transform: translateX(0); }
to { transform: translateX(-24px); }
}
// 버튼은 8px 들었다가 앉는다 — 그림자 두께가 사라지는 쪽으로 같이 줄어든다
@keyframes btnFloat {
0%, 100% { transform: translateY(-8px); box-shadow: 0 13px 0 $mem-ink; }
50% { transform: translateY(0); box-shadow: 0 5px 0 $mem-ink; }
}
@media (max-width: 340px), (max-height: 220px) {
.ctam { width: 248px; padding-top: $sp-4; }
.ctam__crest { height: 16px; }
.ctam__wave {
width: 480px;
height: 16px;
background: radial-gradient(circle 10px at 10px 0, $color 0 9.5px, transparent 10px);
background-size: 20px 20px;
background-repeat: repeat-x;
}
.ctam__body { flex-direction: column; align-items: flex-start; gap: $sp-2; padding: $sp-3 $sp-4; }
.ctam__head { font-size: 13px; }
}
@media (prefers-reduced-motion: reduce) {
.ctam__wave, .ctam__btn { animation: none !important; transform: none; }
.ctam__btn { box-shadow: 0 5px 0 $mem-ink; }
}html, body {
margin: 0;
overflow: hidden;
}
.stage {
box-sizing: border-box;
min-height: 100vh;
display: grid;
place-items: center;
margin: 0;
background: #fdf4ec;
font-family: -apple-system, "Segoe UI", "Noto Sans KR", sans-serif;
padding: clamp(8px, 4vw, 24px);
}
.ctam {
box-sizing: border-box;
width: clamp(288px, 92vw, 440px);
padding-top: 20px;
}
.ctam__crest {
position: relative;
height: 20px;
overflow: hidden;
}
.ctam__wave {
position: absolute;
top: 0;
left: 0;
width: 480px;
height: 20px;
background: radial-gradient(circle 12px at 12px 0, #d5aea9 0 11.5px, transparent 12px);
background-size: 24px 24px;
background-repeat: repeat-x;
animation: waveDrift 2s linear infinite;
}
.ctam__body {
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 16px 20px;
border-radius: 0 0 16px 16px;
background: #d5aea9;
border: 3px solid #241f26;
border-top: 0;
box-shadow: 0 6px 0 #241f26;
}
.ctam__head {
margin: 0;
color: #241f26;
font-weight: 800;
font-size: clamp(14px, 3.4vw, 18px);
line-height: 1.25;
font-family: inherit;
}
.ctam__sub {
margin: 4px 0 0;
color: #241f26;
font-weight: 600;
font-size: clamp(11px, 2.6vw, 13px);
line-height: 1.3;
font-family: inherit;
}
.ctam__btn {
display: inline-flex;
align-items: center;
gap: 4px;
flex: 0 0 auto;
padding: 8px 16px;
border-radius: 12px;
background: #cec29c;
border: 3px solid #241f26;
color: #241f26;
font-weight: 800;
font-size: clamp(12px, 2.8vw, 14px);
line-height: 1;
font-family: inherit;
box-shadow: 0 5px 0 #241f26;
animation: btnFloat 2s ease-out infinite;
}
.ctam__btn svg {
font-size: 1.2em;
}
.ctam__btn:focus-visible {
outline: 3px solid #ffffff;
outline-offset: 2px;
}
@keyframes waveDrift {
from {
transform: translateX(0);
}
to {
transform: translateX(-24px);
}
}
@keyframes btnFloat {
0%, 100% {
transform: translateY(-8px);
box-shadow: 0 13px 0 #241f26;
}
50% {
transform: translateY(0);
box-shadow: 0 5px 0 #241f26;
}
}
@media (max-width: 340px), (max-height: 220px) {
.ctam {
width: 248px;
padding-top: 16px;
}
.ctam__crest {
height: 16px;
}
.ctam__wave {
width: 480px;
height: 16px;
background: radial-gradient(circle 10px at 10px 0, #d5aea9 0 9.5px, transparent 10px);
background-size: 20px 20px;
background-repeat: repeat-x;
}
.ctam__body {
flex-direction: column;
align-items: flex-start;
gap: 8px;
padding: 12px 16px;
}
.ctam__head {
font-size: 13px;
}
}
@media (prefers-reduced-motion: reduce) {
.ctam__wave, .ctam__btn {
animation: none !important;
transform: none;
}
.ctam__btn {
box-shadow: 0 5px 0 #241f26;
}
}import type { CSSProperties } from "react";
import styles from "./CtaWaveMemphis.module.scss";
export type CtaWaveMemphisProps = {
head?: string;
sub?: string;
cta?: string;
/** 한 주기(기본 2000ms) */
duration?: number;
easing?: string;
/** 밴드 색 — 그 위 글자는 잉크 */
color?: string;
};
type Vars = CSSProperties & { "--duration"?: string; "--easing"?: string; "--color"?: string };
export default function CtaWaveMemphis({
head = "패턴이 필요한 순간이다",
sub = "지금 붙여 넣고 다음 섹션으로",
cta = "시작하기",
duration = 2000,
easing = "ease-out",
color = "#ff5c47",
}: CtaWaveMemphisProps) {
const vars: Vars = { "--duration": `${duration}ms`, "--easing": easing, "--color": color };
return (
<section className={styles.ctam} style={vars}>
<div className={styles.crest} aria-hidden="true"><span className={styles.wave} /></div>
<div className={styles.body}>
<div className={styles.text}>
<h2 className={styles.head}>{head}</h2>
<p className={styles.sub}>{sub}</p>
</div>
<button className={styles.btn} type="button">
{cta}
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 256 256" aria-hidden="true" focusable="false"><g fill="currentColor"><path d="m216 128l-72 72V56Z" opacity=".2"/><path d="m221.66 122.34l-72-72A8 8 0 0 0 136 56v64H40a8 8 0 0 0 0 16h96v64a8 8 0 0 0 13.66 5.66l72-72a8 8 0 0 0 0-11.32M152 180.69V75.31L204.69 128Z"/></g></svg>
</button>
</div>
</section>
);
}09 波打つCTA帯 — 計測 累積面積 5.55% · 動いたフレーム 23/23GODRICH オリジナル · SCSS と React は zip に同梱 · メンフィス デザインのLPパーツ9選、コピペOK
このデモが属する記事
メンフィス デザインのLPパーツ9選、コピペOKメンフィス デザインとは、1980年代のミラノ生まれの、水玉・波線・ジグザグなどの幾何学形を明るい色の上に繰り返すスタイルです。画像を一枚も使わず、CSSグラデーションのタイルと図形だけでこのパターンを再現し、ランディングのセクション9つに この記事のデモをすべて見る


