07Solid CTA band
The band is a single flat brand-blue fill with no gradient; only the white button inside lifts and deepens its shadow on hover. Restraint here means one color, not a blend.
Best forSign-up bands, request-a-demo CTAs
단색 배경버튼 lift 호버radius pill

<main class="stage">
<section class="ctaband">
<h2 class="ctaband__title">Start free right now</h2>
<p class="ctaband__desc">14-day trial, no credit card</p>
<button class="ctaband__btn" type="button">Request a demo</button>
</section>
</main>@use "../../../../site/static/demo-tokens" as *;
$duration: $dur-loop;
$easing: $ease-out;
$color: $subject-blue;
$trust-bluetint: #eaf1ff;
$trust-blue-deep: #7386ba;
@include stage($trust-bluetint);
.ctaband {
box-sizing: border-box;
width: clamp(240px, 82vw, 340px);
display: flex;
flex-direction: column;
align-items: center;
gap: $sp-2;
padding: $sp-6 $sp-4;
border-radius: $r-card;
background: $trust-blue-deep;
text-align: center;
box-shadow: 0 16px 30px rgba($trust-blue-deep, .32);
}
.ctaband__title {
margin: 0;
color: $stage-paper;
font-weight: 700; font-size: clamp(16px, 4.4vw, 21px); line-height: 1.3;
font-family: inherit;
}
.ctaband__desc {
margin: 0;
color: rgba($stage-paper, .82);
font-weight: 500; font-size: clamp(11px, 2.8vw, 13px); line-height: 1.4;
font-family: inherit;
}
.ctaband__btn {
margin-top: $sp-1;
border: 0;
border-radius: $r-pill;
background: $stage-paper;
color: $trust-blue-deep;
padding: $sp-2 $sp-6;
font-weight: 700; font-size: clamp(12px, 2.8vw, 14px); line-height: 1;
font-family: inherit;
box-shadow: 0 6px 14px rgba(23, 20, 26, .18);
animation: btnLift $duration $easing infinite;
}
.ctaband__btn:focus-visible {
outline: 3px solid $stage-paper;
outline-offset: 2px;
}
// 데모: 흰 버튼만 눌렸다 떠오르기를 반복한다 — 배경은 그라디언트 없이 진한 파란 단색 그대로 고정
@keyframes btnLift {
0%, 100% { transform: translateY(0); box-shadow: 0 6px 14px rgba(23, 20, 26, .18); }
50% { transform: translateY(-4px); box-shadow: 0 12px 22px rgba(23, 20, 26, .24); }
}
@media (max-width: 340px), (max-height: 220px) {
.ctaband { padding: $sp-4 $sp-3; gap: $sp-1; }
.ctaband__desc { display: none; }
.ctaband__btn { padding: $sp-1 $sp-4; margin-top: 0; }
}
@media (prefers-reduced-motion: reduce) {
.ctaband__btn { animation: none !important; transform: none; }
}html, body {
margin: 0;
overflow: hidden;
}
.stage {
box-sizing: border-box;
min-height: 100vh;
display: grid;
place-items: center;
margin: 0;
background: #eaf1ff;
font-family: -apple-system, "Segoe UI", "Noto Sans KR", sans-serif;
padding: clamp(8px, 4vw, 24px);
}
.ctaband {
box-sizing: border-box;
width: clamp(240px, 82vw, 340px);
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
padding: 24px 16px;
border-radius: 16px;
background: #7386ba;
text-align: center;
box-shadow: 0 16px 30px rgba(115, 134, 186, 0.32);
}
.ctaband__title {
margin: 0;
color: #ffffff;
font-weight: 700;
font-size: clamp(16px, 4.4vw, 21px);
line-height: 1.3;
font-family: inherit;
}
.ctaband__desc {
margin: 0;
color: rgba(255, 255, 255, 0.82);
font-weight: 500;
font-size: clamp(11px, 2.8vw, 13px);
line-height: 1.4;
font-family: inherit;
}
.ctaband__btn {
margin-top: 4px;
border: 0;
border-radius: 999px;
background: #ffffff;
color: #7386ba;
padding: 8px 24px;
font-weight: 700;
font-size: clamp(12px, 2.8vw, 14px);
line-height: 1;
font-family: inherit;
box-shadow: 0 6px 14px rgba(23, 20, 26, 0.18);
animation: btnLift 2s ease-out infinite;
}
.ctaband__btn:focus-visible {
outline: 3px solid #ffffff;
outline-offset: 2px;
}
@keyframes btnLift {
0%, 100% {
transform: translateY(0);
box-shadow: 0 6px 14px rgba(23, 20, 26, 0.18);
}
50% {
transform: translateY(-4px);
box-shadow: 0 12px 22px rgba(23, 20, 26, 0.24);
}
}
@media (max-width: 340px), (max-height: 220px) {
.ctaband {
padding: 16px 12px;
gap: 4px;
}
.ctaband__desc {
display: none;
}
.ctaband__btn {
padding: 4px 16px;
margin-top: 0;
}
}
@media (prefers-reduced-motion: reduce) {
.ctaband__btn {
animation: none !important;
transform: none;
}
}import type { CSSProperties } from "react";
import styles from "./CtaBandTrust.module.scss";
export type CtaBandTrustProps = {
title?: string;
desc?: string;
cta?: string;
duration?: number;
easing?: string;
color?: string;
};
type Vars = CSSProperties & { "--duration"?: string; "--easing"?: string; "--color"?: string };
export default function CtaBandTrust({
title = "지금 무료로 시작하세요",
desc = "신용카드 없이 14일 체험",
cta = "데모 신청",
duration = 2000,
easing = "ease-out",
color = "#1d4ed8",
}: CtaBandTrustProps) {
const vars: Vars = { "--duration": `${duration}ms`, "--easing": easing, "--color": color };
return (
<section className={styles.band} style={vars}>
<h2 className={styles.title}>{title}</h2>
<p className={styles.desc}>{desc}</p>
<button type="button" className={styles.btn}>{cta}</button>
</section>
);
}07 Solid CTA band — Measured area 1.019% · moving frames 22/23Original by GODRICH · SCSS and React ship in the zip · SaaS Landing Page Design: 9 Clean Trust Sections
The post this demo lives in
SaaS Landing Page Design: 9 Clean Trust SectionsGood SaaS landing page design leans on two neutral backgrounds — white and a barely-there off-white — plus exactly one b See all demos in this post


