Technote

테마 · 플러그인 실무

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

그리드 칸이 내용 때문에 부푸는 문제 — minmax(0, 1fr)

repeat(3, 1fr) 은 세 칸이 같은 폭이 된다고 약속하지 않습니다. 안에 든 코드 블록이나 긴 문자열 하나가 칸을 밀어내고, 그러면 판 전체가 화면 밖으로 나갑니다.

grid-template-columns: repeat(3, 1fr) 라고 쓰면 세 칸이 정확히 3분의 1씩 나눠 갖는다고 읽히지만, 실제 규격은 그렇게 약속하지 않습니다. 1fr 은 minmax(auto, 1fr) 의 줄임말이고, 이때 최솟값 auto 는 그 칸이 가진 내용의 최소 폭으로 해석됩니다.

1fr 이 약속하지 않는 것

내용의 최소 폭은 “더 이상 줄바꿈할 수 없는 가장 넓은 덩어리” 입니다. 문단이라면 가장 긴 단어 하나지만, 줄바꿈이 되지 않는 것이 들어 있으면 이야기가 달라집니다. 칸은 그 덩어리보다 좁아지지 않으므로, 자기 몫인 3분의 1을 넘어 이웃 칸의 자리를 빼앗고, 그래도 모자라면 판 전체를 화면 밖으로 밀어냅니다.

이것이 모바일 전용 문제라고 오해하기 쉽지만 그렇지 않습니다. 데스크톱의 다중 칸 그리드에서도 똑같이 일어나고, 오히려 칸이 좁게 나뉘는 넓은 화면에서 더 잘 드러납니다.

칸을 부풀리는 전형적인 다섯 — 전부 줄바꿈되지 않는 덩어리다

고치는 세 줄

첫째, 트랙의 최솟값을 직접 0 으로 내립니다. grid-template-columns: repeat(3, minmax(0, 1fr)); 이라고 쓰면 칸은 내용과 무관하게 자기 몫만 가져갑니다. 넘치는 내용은 칸 안에서 처리할 문제가 되고, 배치는 더 이상 흔들리지 않습니다.

둘째, 플렉스에도 같은 함정이 있습니다. 플렉스 자식의 min-width 기본값이 auto 라서 똑같이 줄어들지 않습니다. 자식에 min-width: 0(세로 방향이면 min-height: 0)을 주는 것이 대응하는 처방입니다.

셋째, 넘치는 내용 자체를 다룹니다. 코드 블록에는 pre { overflow-x: auto; } 를 주어 자기 상자 안에서 가로 스크롤되게 하고, 긴 문자열에는 overflow-wrap: anywhere 를 씁니다.

두 값의 차이는 계산 단계 — 트랙이 부푸는 것을 막는 쪽은 anywhere 다

자동 배치에도 같은 함정이 있습니다

칸 수를 자동으로 정하는 repeat(auto-fit, minmax(18rem, 1fr)) 은 편리하지만, 화면 폭이 18rem 보다 좁아지면 최솟값 자체가 화면보다 커져 가로 스크롤이 생깁니다. repeat(auto-fit, minmax(min(18rem, 100%), 1fr)) 로 쓰면 좁은 화면에서 최솟값이 100% 로 낮아져 이 문제가 사라집니다.

정리하면 규칙은 하나입니다 — 트랙의 최솟값을 우연에 맡기지 않습니다. 이 습관 하나가 “왜 여기만 판이 밀렸지” 라는 종류의 디버깅을 대부분 없앱니다.

테마의 그리드 구조를 손보는 이야기는 테마 · 플러그인 아카이브에 이어지고, 사이트 전반의 화면 · 성능 정비는 최적화 지원 사업에서 함께 다룹니다.

다음 회차

그런데 판이 밀렸는데도 브라우저가 알려주는 숫자는 멀쩡한 경우가 있습니다. 다음 회차는 가로 스크롤 범인을 실제로 찾아내는 방법입니다.

이 주제의 다른 글

노하우 목록으로

테마 · 플러그인 실무

템플릿 안의 보조 쿼리 — reset 을 빠뜨리면

관련 글 목록을 넣었더니 그 아래의 모든 것이 엉뚱한 글을 가리킵니다. 템플릿 문제처럼 보이지만 원인은 빠뜨린 한 줄입니다.

개발자 5분 읽기

테마 · 플러그인 실무

옛 콘텐츠가 새 디자인에서 깨지는 세 가지 이유

본문에 박힌 인라인 스타일, 사라진 플러그인의 숏코드 잔여물, 하드코딩된 폭. 새 디자인 시스템이 존중받지 못하는 지점은 대개 이 셋입니다.

디자이너 3분 읽기

테마 · 플러그인 실무

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

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

디자이너 3분 읽기

₩270,000 · 신청하기