Technote

테마 · 플러그인 실무

연재 모바일에서 무너지지 않는 레이아웃 8부 중 3부

clamp() 하나로 단계마다 값을 다시 쓰지 않기

제목 크기를 브레이크포인트마다 다시 선언하고 있다면 유지보수가 계속 늘어납니다. clamp() 는 최소 · 유동 · 최대를 한 줄에 담아 그 재선언을 없앱니다.

브레이크포인트가 늘어나는 가장 흔한 이유는 글자 크기와 여백을 단계마다 다시 선언하기 때문입니다. 제목을 모바일에서 28px, 태블릿에서 36px, 데스크톱에서 48px 로 정해 두면 그 사이 폭에서는 언제나 조금 어긋나 있습니다. 어긋난 지점을 메우려 기준선을 하나 더 넣고, 그러면 다시 선언할 곳이 하나 더 늘어납니다.

단계 대신 구간을 선언합니다

clamp() 는 값 세 개를 받습니다 — 최솟값 · 선호값 · 최댓값입니다. 선호값이 최솟값보다 작아지면 최솟값을, 최댓값보다 커지면 최댓값을 쓰고, 그 사이에서는 선호값을 그대로 씁니다. 선호값에 화면 폭에 연동되는 단위를 넣으면 두 극단 사이가 자연스럽게 이어집니다.

h1 { font-size: clamp(1.75rem, 1.25rem + 2.5vw, 3rem); } 한 줄이면 아주 좁은 화면에서 1.75rem 아래로 내려가지 않고, 넓어질수록 커지다가 3rem 에서 멈춥니다. 이 한 줄이 대체하는 것은 미디어 질의 두세 개와 그 안의 재선언 전부입니다.

같은 결과를 만드는 두 방식 — 유지보수 비용이 다르다

중간값에는 반드시 rem 을 섞습니다

선호값을 4vw 처럼 화면 폭 단위만으로 쓰면 안 됩니다. 순수한 뷰포트 단위는 사용자가 브라우저에서 글자를 키워도 전혀 반응하지 않습니다. 글자를 키워 읽는 사람에게 본문이 그대로 남는다는 뜻이고, 접근성 규격이 요구하는 텍스트 확대가 성립하지 않습니다.

그래서 선호값은 1.25rem + 2.5vw 처럼 rem 항과 vw 항을 더한 형태로 씁니다. rem 항이 사용자 설정을 따라가고, vw 항이 화면 폭을 따라갑니다. 두 축이 동시에 살아 있어야 유동 크기가 편의가 아니라 품질이 됩니다.

여백에도 같은 규칙을 씁니다

구역의 상하 여백은 좁은 화면에서 답답하지 않을 최솟값과 넓은 화면에서 과하지 않을 최댓값 사이에서 움직이면 충분합니다. section { padding-block: clamp(3rem, 8vw, 7rem); } 한 줄이 그 일을 합니다. 그리드 간격도 마찬가지입니다.

값을 토큰으로 모아 두면 한 벌로 관리됩니다.

유동 값은 서너 개면 충분하다 — 늘리면 다시 단계가 된다

어디에는 쓰지 않습니다

모든 값을 유동으로 만들 필요는 없습니다. 테두리 두께 · 모서리 반경 · 아이콘 크기처럼 작은 값은 유동으로 만들어도 차이가 보이지 않고 계산만 늘어납니다. 줄 간격은 단위 없는 숫자(line-height: 1.7)로 두어 글자 크기를 따라가게 하는 편이 낫습니다.

마지막으로 두 극단을 실제로 확인합니다. 최솟값이 320px 폭에서 정말 읽히는지, 최댓값이 아주 넓은 화면에서 과하지 않은지 — 이 두 지점만 보면 나머지 폭은 정의상 그 사이입니다.

화면 성능과 자산 무게를 함께 보는 관점은 성능 최적화 아카이브에 있고, 실제 사이트에 이 구조를 적용하는 절차는 작업 과정에 공개돼 있습니다.

다음 회차

크기가 유동적이 되어도 그리드 칸이 내용 때문에 부풀면 배치는 여전히 무너집니다. 다음 회차는 1fr 이 약속하지 않는 것에 관한 이야기입니다.

이 주제의 다른 글

노하우 목록으로

테마 · 플러그인 실무

편집 가능한 영역을 디자인 전에 정합니다

CMS 가 표현할 수 없는 디자인은 배포된 뒤에도 계속 협상 대상으로 남습니다. 어디까지 편집자가 바꿀 수 있는지를 먼저 정하면 그 협상 자체가 사라집니다.

디자이너 3분 읽기

테마 · 플러그인 입문

업데이트가 멈춘 플러그인을 판별하는 기준

마지막 업데이트 날짜 하나로는 방치를 판정할 수 없습니다. 판별 신호 다섯 개를 함께 보고, 대체 불가라면 격리 조건이라도 걸어야 합니다.

기획자 · 운영 · 관리자 2분 읽기

테마 · 플러그인 심화

JS 없이 만드는 상호작용과 그것을 안전하게 하는 규칙

details · :target · :focus-within · :has() · 스크롤 타임라인으로 상당수의 상호작용이 스타일시트 안에서 끝납니다. 안전하게 만드는 규칙은 하나입니다 — 기본값이 완성된 상태여야 합니다.

디자이너 6분 읽기

₩270,000 · 신청하기