나노플레이데이즈사전
전체 사전

화면 문제 해결

다른 사전이 이름으로 찾는 사전이라면 이 사전은 증상으로 찾습니다. "화면이 이상해요"를 일상 말로 찾아 고장 난 모습을 직접 보고, 고치기를 눌러 고친 모습과 비교한 뒤, 원인과 고치는 CSS, AI에게 붙여 넣을 수정 부탁 문장을 가져갑니다.

예시가 화면에 보이면 손가락 표시가 저절로 시연합니다. 직접 눌러 봐도 됩니다.

줄이 안 맞아요

글자와 아이콘, 상자 안 내용의 높이가 가지런하지 않을 때입니다. 가운데로 모으는 방법을 정확히 알려 주면 해결됩니다.

  • 세로 가운데가 안 맞아요

    Vertical centering

    높이가 있는 상자 안에서 글자가 가운데가 아니라 위쪽에 붙어 보입니다. 가로 가운데는 맞는데 세로만 안 맞는 경우가 흔합니다.

    장바구니 버튼고치기 전
    장바구니에 담기

    '고치기'를 눌러 글자가 양쪽 눈금(상자의 세로 가운데 높이)에 오는지 보세요.

    왜 그럴까요

    text-align: center는 글자를 가로로만 옮깁니다. 세로로는 글자가 상자의 맨 위에서 시작하므로, 상자가 글자보다 높으면 남는 공간이 전부 글자 아래로 갑니다.

    이렇게 고쳐요

    .box {
      display: flex;
      align-items: center;
      justify-content: center;
    }

    자주 생기는 때버튼·배지·카드처럼 높이를 정해 둔 상자에 글자를 넣었는데 가로 가운데만 맞고 위에 붙을 때 생깁니다. 상자를 키우거나 글자를 키운 뒤에 갑자기 눈에 띕니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    가운데 정렬 안 됨, 세로 중앙 정렬, 글자가 위로 붙어요, 위아래 가운데, text-align center 안 먹힘, vertical-align 안 먹힘, y축 가운데, 버튼 글자가 위쪽에 있어요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 높이 96px짜리 '장바구니에 담기' 상자 안의 글자가 가로로는 가운데인데 세로로는 맨 위에 붙어 있어. 원인은 text-align: center만 쓰고 세로 정렬은 하지 않은 것일 가능성이 높으니, 이 상자를 display: flex; align-items: center; justify-content: center;로 바꿔서 글자가 가로·세로 모두 가운데에 오게 고쳐 줘. 상자 높이는 그대로 두고, 글자가 두 줄이 되어도 가운데가 유지되는지와 390px 폭에서도 같은지 확인해 줘.

  • 아이콘이랑 글자 높이가 안 맞아요

    Icon and text alignment

    버튼이나 칩에서 아이콘과 글자를 나란히 놨는데 아이콘은 위로 떠 있고 글자는 아래로 처져 보입니다. 둘의 가운데 높이가 서로 다릅니다.

    좋아요·알림 버튼고치기 전
    좋아요 128알림 3

    '고치기'를 눌러 아이콘과 글자의 높이가 맞는지 보세요.

    왜 그럴까요

    한 줄에 놓인 아이콘은 아래쪽 끝이 글자의 기준선(글자가 올라앉는 가상의 줄)에 맞춰집니다. 아이콘이 글자보다 크면 아이콘 가운데가 글자 가운데보다 위로 올라갑니다.

    이렇게 고쳐요

    .pill {
      display: inline-flex;
      align-items: center;
      gap: 8px;
    }
    /* 아이콘에만 주고 싶다면 */
    .pill svg { vertical-align: middle; }

    자주 생기는 때하트·알림·별 아이콘을 글자 옆에 붙인 좋아요 버튼, 태그, 메뉴 항목에서 자주 생깁니다. 아이콘을 글자보다 크게 할수록 더 두드러집니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    아이콘 글자 정렬, 아이콘이 떠 있어요, 아이콘이 위로 올라가요, 글자가 아래로 처져요, 아이콘 옆 글자 안 맞음, 아이콘 세로 정렬, baseline, vertical-align

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 '좋아요 128' 버튼의 하트 아이콘이 글자보다 위로 떠 있고 글자는 아래로 처져 보여. 원인은 인라인 아이콘이 글자 기준선에 맞춰져 있어서일 가능성이 높으니, 버튼을 display: inline-flex; align-items: center; gap: 8px;로 바꿔서 아이콘과 글자의 세로 가운데가 맞게 고쳐 줘. 아이콘 크기를 바꿔도 맞는지, 글자가 길어져 줄이 바뀌어도 어긋나지 않는지 확인해 줘.

  • 상자가 가로 가운데로 안 와요

    Horizontal centering

    상자에 margin: 0 auto를 줬는데 가운데로 오지 않고, 부모 폭을 꽉 채우거나 한쪽에 붙어 있습니다. 글자의 세로 위치가 아니라 상자 자체의 좌우 위치가 문제입니다.

    결제 완료 안내(점선이 부모의 한가운데)고치기 전
    결제가 끝났어요

    '고치기'를 눌러 상자가 점선 양쪽에 같은 여백으로 놓이는지 보세요.

    왜 그럴까요

    블록 상자는 폭을 따로 정하지 않으면 부모 폭을 꽉 채웁니다. 꽉 찬 상자는 좌우에 나눠 가질 남은 공간이 없어서 margin: auto가 할 일이 없습니다. 상자에 폭의 한도를 주면 남은 공간이 생기고, auto가 그 공간을 양쪽에 똑같이 나눠 가운데에 놓습니다.

    이렇게 고쳐요

    .card {
      max-width: 180px;
      margin: 0 auto;
    }
    /* 또는 부모에서 */
    .parent {
      display: flex;
      justify-content: center;
    }

    자주 생기는 때로그인 카드, 결제 완료 안내, 본문 폭 제한처럼 좁은 상자를 페이지 가운데에 놓으려 할 때 생깁니다. 폭을 정하지 않은 채 margin: auto만 쓴 경우가 대부분입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    margin auto 안 먹힘, 카드가 왼쪽에 붙어요, 좌우 가운데, 상자가 한쪽으로 쏠려요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 '결제가 끝났어요' 안내 상자에 margin: 0 auto를 줬는데 가운데로 오지 않고 부모 폭 전체를 차지해 한쪽에 붙어 보여. 원인은 상자에 폭이 없어서 margin: auto가 나눌 남은 공간이 없는 것일 가능성이 높으니, 상자에 max-width: 180px;(알맞은 폭)을 주고 margin: 0 auto를 유지하거나 부모를 display: flex; justify-content: center;로 바꿔서 가로 가운데에 오게 고쳐 줘. 390px 폭에서 상자가 화면보다 좁게 줄어드는지와 글자가 길어졌을 때도 가운데가 유지되는지 확인해 줘.

  • 양쪽 끝으로 안 벌어져요

    Space between

    상단 바에서 로고는 왼쪽 끝, 메뉴는 오른쪽 끝에 두고 싶은데 둘이 나란히 왼쪽에 붙어 있습니다. 남는 빈 공간이 전부 오른쪽 한 덩어리로 몰려 있는 모습입니다.

    상단 바(로고와 메뉴)고치기 전

    '고치기'를 눌러 로고와 메뉴 사이가 벌어지는지 보세요.

    왜 그럴까요

    flex 줄의 항목은 기본으로 왼쪽부터 차례로 붙고, 남는 공간은 전부 맨 오른쪽에 쌓입니다. 남는 공간을 항목 사이에 나눠 주라고 정해 주어야 처음 항목과 끝 항목이 양 끝으로 갑니다. 한 덩어리만 오른쪽으로 보내려면 그 항목에 margin-left: auto를 줍니다.

    이렇게 고쳐요

    .bar {
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
    /* 오른쪽 한 덩어리만 보내려면 */
    .menu { margin-left: auto; }

    자주 생기는 때상단 바, 카드 제목줄(제목과 더보기 버튼), 목록 한 줄(이름과 가격)처럼 두 덩어리를 양 끝에 놓을 때 씁니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    로고와 메뉴가 붙어 있어요, 메뉴를 오른쪽으로 보내고 싶어요, 좌우 끝 정렬, 헤더 요소가 한쪽에 몰려요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상단 바의 로고(모모샵)와 메뉴(상품·이벤트·로그인)가 둘 다 왼쪽에 붙어 있어. 로고는 왼쪽 끝, 메뉴는 오른쪽 끝에 놓고 싶어. 원인은 flex 줄에 남는 공간을 나누는 설정이 없는 것일 가능성이 높으니, 상단 바에 display: flex; justify-content: space-between; align-items: center;를 주어서 양 끝으로 벌어지게 고쳐 줘. 메뉴가 길어져 줄이 좁아져도 서로 겹치지 않는지, 390px 폭에서 메뉴가 줄바꿈이나 햄버거로 정리되는지 확인해 줘.

  • 마지막 줄 카드만 크기가 달라요

    Stretched last row

    카드를 줄바꿈하며 늘어놓았는데 마지막 줄에 카드가 한두 개만 남으면 그 카드들만 줄 전체로 늘어나 윗줄 카드와 크기가 달라집니다.

    상품 카드 7개고치기 전
    머그컵접시컵받침텀블러수저찻잔행주

    '고치기'를 눌러 마지막 줄 카드가 윗줄 카드와 같은 크기가 되는지 보세요.

    왜 그럴까요

    flex로 줄바꿈하는(flex-wrap) 줄에서 카드에 flex: 1을 주면 줄마다 남은 공간을 그 줄의 카드끼리 나눠 가집니다. 마지막 줄은 카드가 적어서 한 장이 받는 몫이 커집니다. 칸을 줄과 상관없이 격자(grid)로 정해 두면 모든 줄의 카드가 같은 크기입니다.

    이렇게 고쳐요

    .cards {
      display: grid;
      grid-template-columns:
        repeat(auto-fill, minmax(84px, 1fr));
      gap: 8px;
    }
    /* 카드의 flex: 1 은 지웁니다 */

    자주 생기는 때상품 목록, 갤러리, 태그 모음처럼 개수가 일정하지 않은 카드를 여러 줄로 놓을 때 생깁니다. 상품이 하나 줄거나 화면 폭이 바뀔 때 갑자기 눈에 띕니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    마지막 카드만 넓어져요, 남는 카드가 늘어나요, 카드 줄이 안 맞아요, flex-wrap 마지막 줄

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상품 카드 7개를 flex-wrap으로 놓았는데 마지막 줄의 카드 한 장만 줄 전체 폭으로 늘어나 위의 카드들과 크기가 달라. 원인은 카드에 flex: 1을 줘서 줄마다 남는 공간을 나눠 갖는 것일 가능성이 높으니, 목록을 display: grid; grid-template-columns: repeat(auto-fill, minmax(84px, 1fr)); gap: 8px;로 바꾸고 카드의 flex 설정은 지워서 모든 줄의 카드가 같은 크기가 되게 고쳐 줘. 카드 수가 1개·2개일 때와 390px·1440px 폭에서 열 수가 어색하지 않은지 확인해 줘.

상자 밖으로 삐져나가요

이미지나 긴 글, 펼친 메뉴가 상자의 경계와 부딪힐 때입니다. 넘치는지, 잘리는지에 따라 고치는 곳이 다릅니다.

  • 이미지가 상자를 뚫고 나가요

    Image overflows its box

    카드 안에 사진을 넣었는데 사진이 카드의 오른쪽 경계를 넘어 밖으로 삐져나가거나, 화면에 가로 스크롤이 생깁니다.

    상품 카드고치기 전
    모모 머그컵

    '고치기'를 눌러 사진이 카드 안으로 들어오는지 보세요.

    왜 그럴까요

    이미지는 자기 원래 크기를 알고 있어서, 상자가 더 좁아도 따라 줄어들지 않고 원래 크기대로 그려집니다. 상자 폭까지만 커지라는 한도를 따로 주어야 합니다.

    이렇게 고쳐요

    img {
      max-width: 100%;
      height: auto;
    }

    자주 생기는 때상자가 좁아지는 모바일 화면에서 큰 사진을 그대로 넣었을 때 생깁니다. 데스크톱에서는 멀쩡하다가 좁은 화면에서만 터지는 경우가 많습니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    사진이 삐져나와요, 이미지가 너무 커요, 이미지 넘침, 그림이 카드 밖으로 나감, 모바일에서 이미지가 잘려요, 이미지 크기 안 맞음, 가로 스크롤 생김, max-width

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상품 카드 안의 사진이 카드 폭보다 커서 오른쪽으로 삐져나가고, 390px 폭에서는 페이지에 가로 스크롤이 생겨. 원인은 이미지 폭에 한도가 없어서일 가능성이 높으니, 카드 안 이미지에 max-width: 100%; height: auto;를 주어서 카드 폭에 맞춰 줄어들면서 비율은 유지되게 고쳐 줘. 이미지가 찌그러지지 않는지와 390px·1440px 폭에서 가로 스크롤이 없는지 확인해 줘.

  • 긴 영어·링크가 상자를 뚫어요

    Long word overflow

    띄어쓰기 없는 긴 영어 단어, 주소, 주문번호가 상자 폭보다 길어서 오른쪽 밖으로 삐져나가거나 화면에 가로 스크롤이 생깁니다.

    주문 카드고치기 전
    추적 주소
    https://momo.example/orders/tracking/20240117-ABCDEFGHIJKLMN

    '고치기'를 눌러 긴 주소가 카드 안에서 줄을 바꾸는지 보세요.

    왜 그럴까요

    브라우저는 띄어쓰기 자리에서만 줄을 바꿉니다. 띄어쓰기 없는 긴 덩어리는 한 줄을 고집하므로 상자를 넘습니다. 가로로 나란히 놓인(flex) 칸은 안의 내용보다 좁아지지 않는 성질이 있어서 더 잘 넘칩니다.

    이렇게 고쳐요

    .text {
      min-width: 0;
      overflow-wrap: anywhere;
    }

    자주 생기는 때주문 추적 주소, 이메일, 해시값, 파일 이름을 좁은 카드나 채팅 말풍선에 그대로 보여 줄 때 생깁니다. 사용자가 직접 쓴 글을 보여 주는 곳에서도 자주 터집니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    링크가 삐져나와요, 주소가 줄바꿈이 안 돼요, 긴 단어 넘침, 줄바꿈 안 됨, 엑스축 스크롤, 가로 스크롤 생김, 영어 단어가 안 접혀요, 주문번호가 상자를 넘어요, overflow-wrap

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 주문 카드의 추적 주소(https://momo.example/orders/tracking/20240117-ABCDEFGHIJKLMN)가 카드 밖으로 삐져나가. 원인은 띄어쓰기가 없는 긴 글자가 줄을 못 바꾸는 데다 flex 칸이 안의 내용보다 좁아지지 못해서일 가능성이 높으니, 글자를 담은 칸에 min-width: 0; overflow-wrap: anywhere;를 주어서 카드 안에서 줄이 바뀌게 고쳐 줘. 한글 문장은 단어 단위로 줄이 바뀌던 그대로 두고, 390px 폭에서 가로 스크롤이 없는지 확인해 줘.

  • 그림자가 잘려 보여요

    Clipped shadow

    카드에 box-shadow를 줬는데 그림자가 카드 사이에서는 보이지만 바깥 가장자리에서는 칼로 자른 듯 끊겨 있습니다.

    카드 목록 상자(점선이 부모의 경계)고치기 전
    머그컵
    접시
    컵받침

    '고치기'를 눌러 카드 바깥쪽 그림자가 끊기지 않고 번지는지 보세요.

    왜 그럴까요

    그림자는 카드 바깥으로 번져 그려집니다. 부모가 overflow: hidden이나 auto(가로 스크롤 상자 포함)이면 부모 경계 밖은 모두 잘리므로 가장자리 카드의 그림자가 부모 경계에서 끊깁니다. 부모 안쪽에 그림자가 번질 만큼 padding을 주거나, 잘라 낼 필요가 없다면 overflow를 풉니다.

    이렇게 고쳐요

    .track {
      /* 그림자가 번질 자리 */
      padding: 24px;
    }
    /* 잘라 낼 필요가 없으면 */
    .track { overflow: visible; }

    자주 생기는 때가로로 밀어 보는 카드 목록, 둥근 모서리를 자르려고 overflow: hidden을 건 상자, 슬라이더 안의 카드에서 생깁니다. 카드가 상자 가장자리에 딱 붙어 있을수록 심합니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    그림자가 반쪽만 보여요, 카드 그림자 끝이 잘려요, 가로 스크롤 목록에서 그림자가 잘려요, box-shadow 잘림

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 가로로 밀어 보는 상품 카드 목록의 카드마다 box-shadow가 있는데, 맨 왼쪽·오른쪽 카드와 아래쪽 그림자가 목록 상자 경계에서 잘려 끊겨 보여. 원인은 목록 상자의 overflow(hidden 또는 가로 스크롤)가 번진 그림자를 자르는 것일 가능성이 높으니, 목록 상자에 그림자가 번질 만큼의 padding(예: 24px)을 주어서 그림자가 온전히 보이게 고쳐 줘. 잘라 낼 필요가 없는 상자라면 overflow: visible로 푸는 것도 알려 주고, 카드 목록을 밀 때 첫·끝 카드가 가장자리에서 어색하게 멈추지 않는지 확인해 줘.

가려지거나 안 눌려요

화면에 보이기는 하는데 다른 것 뒤에 깔리거나, 위에 얹힌 것 때문에 눌리지 않을 때입니다. 요소가 위아래로 겹치는 순서가 열쇠입니다.

  • 버튼이 멀쩡한데 클릭이 안 돼요

    Button not clickable

    버튼은 정상으로 보이고 비활성도 아닌데 눌러도 아무 일이 없습니다. 눈에 안 보이는 무언가가 버튼 위에 얹혀 클릭을 대신 받고 있습니다.

    구매 버튼과 덮개고치기 전
    투명 덮개

    눌린 횟수 0번

    '구매하기'를 눌러 보세요. 횟수가 오르지 않는다면 '고치기'를 눌러 다시 눌러 보세요.

    왜 그럴까요

    마우스와 터치 클릭은 눈에 보이는 가장 위쪽 요소가 받습니다. 투명해서 안 보여도 버튼 위에 놓인 요소가 있으면 클릭이 그 요소에서 끝나고 버튼까지 오지 못합니다.

    이렇게 고쳐요

    .cover {
      /* 클릭이 아래로 통과 */
      pointer-events: none;
    }
    /* 필요 없는 덮개라면
       요소를 지우거나 닫아 주세요 */

    자주 생기는 때닫힌 줄 알았던 팝업 배경, 장식용으로 크게 깔아 둔 투명한 층, 애니메이션 끝난 뒤 남은 덮개가 버튼 위에 얹혀 있을 때 생깁니다. 개발자 도구에서 눌러 보면 버튼이 아니라 다른 것이 잡힙니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    클릭 안 먹힘, 버튼이 안 눌려요, 눌러도 반응이 없어요, 투명한 덮개가 있어요, 클릭 안 됨, 위에 뭐가 덮여 있어요, pointer-events, 누르는데 아무 일도 안 일어나요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 '구매하기' 버튼이 멀쩡해 보이는데 눌러도 아무 반응이 없어. 개발자 도구로 보니 버튼 위에 투명한 덮개 요소가 놓여 있어서 클릭을 대신 받는 것 같아. 원인은 이 덮개가 클릭을 가로채는 것일 가능성이 높으니, 필요 없는 덮개라면 지우고 장식으로 필요한 것이라면 pointer-events: none;을 주어서 클릭이 버튼까지 통과하게 고쳐 줘. 덮개가 정말 닫힌 상태에서만 사라지는지, 키보드로 버튼을 누르는 것도 되는지 확인해 줘.

  • 목차 누르면 제목이 헤더에 가려요

    Anchor hidden under header

    글 안의 목차나 #링크를 눌러 그 제목으로 이동했더니, 위에 붙어 있는 고정 헤더가 제목을 덮어서 제목이 안 보입니다.

    도움말 페이지(헤더 고정)고치기 전
    모모샵 도움말

    배송 안내

    주문 뒤 2~3일 안에 도착합니다. 제주와 도서산간은 하루가 더 걸립니다.

    교환·환불

    받은 날부터 7일 안에 신청하면 됩니다. 쓰지 않은 상품만 가능합니다.

    문의 방법

    채팅으로 문의하면 평일 낮 시간에 답합니다. 급하면 전화를 주세요.

    '목차에서 교환·환불 누르기'를 눌러 제목이 보이는지 보고, '고치기'로 비교해 보세요.

    왜 그럴까요

    이동할 때 브라우저는 목표 제목을 화면 맨 위 끝에 딱 붙입니다. 그 자리에는 이미 고정 헤더가 있어서 제목이 헤더 뒤로 들어갑니다. 제목에 헤더 높이만큼의 여유를 알려 주면 그만큼 아래에 멈춥니다.

    이렇게 고쳐요

    h3 {
      /* 헤더 36px + 여유 */
      scroll-margin-top: 48px;
    }
    /* 전체에 한 번만 주려면 */
    html { scroll-padding-top: 48px; }

    자주 생기는 때맨 위에 헤더를 고정한 긴 글, 약관, 도움말 페이지에서 목차를 눌렀을 때 생깁니다. 헤더가 없던 시절 만든 목차에 나중에 고정 헤더를 붙이면 갑자기 나타납니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    앵커 이동하면 가려져요, 고정 헤더에 제목이 가려요, 목차 링크 위치가 안 맞아요, 스크롤 위치가 너무 위예요, 해시 이동 가려짐, #링크 점프, scroll-margin-top, scroll-padding

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 도움말 페이지의 목차 '교환·환불'을 누르면 해당 제목이 위에 고정된 헤더(높이 36px) 뒤로 들어가 안 보여. 원인은 앵커 이동이 제목을 화면 맨 위에 붙이기 때문일 가능성이 높으니, 본문 제목(h2·h3)에 scroll-margin-top을 헤더 높이에 여유를 더해 주어서 이동 뒤에도 제목이 헤더 아래에 보이게 고쳐 줘. 헤더 높이가 모바일에서 달라지면 같이 달라지게 하고, 주소창에 #제목이 붙은 채로 열어도 같은지 확인해 줘.

  • 겹친 글자가 뒤로 비쳐 보여요

    See-through overlay

    위에 띄운 메뉴나 고정 헤더 뒤로 아래쪽 본문 글자가 그대로 비쳐 보여서, 두 글자가 겹쳐 읽을 수 없습니다.

    내 계정 드롭다운과 본문고치기 전
    • 내 주문
    • 쿠폰함
    • 로그아웃

    주문 뒤 이틀에서 사흘 안에 도착합니다. 제주와 도서산간은 하루가 더 걸립니다. 받으신 뒤 이레 안에 교환을 신청하실 수 있습니다.

    '고치기'를 눌러 메뉴 뒤로 비치던 본문 글자가 가려지는지 보세요.

    왜 그럴까요

    상자는 배경색을 정해 주지 않으면 투명합니다. 겹치는 순서가 맞아 위에 있어도 칠한 면이 없으면 뒤의 글자가 그대로 보입니다. 위에 얹는 상자에는 불투명한 배경색을 직접 정해 줍니다. 흐린 유리 느낌을 쓰려면 반투명 색 위에 backdrop-filter: blur()를 더합니다.

    이렇게 고쳐요

    .dropdown {
      background: #fff; /* 불투명한 배경색 */
    }

    자주 생기는 때드롭다운, 자동완성 목록, 고정 헤더, 툴팁처럼 다른 내용 위에 얹는 상자에서 생깁니다. 배경색을 따로 안 주었거나 색 변수가 비어 있을 때 자주 봅니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    드롭다운 뒤 글자가 비쳐요, 메뉴가 투명해요, 배경이 없어서 뒤가 보여요, 헤더 밑 글자가 비쳐요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 '내 계정' 드롭다운을 열면 메뉴 뒤로 아래 본문 글자가 비쳐서 두 글자가 겹쳐 보여. 원인은 드롭다운 상자에 배경색이 없어 투명한 것일 가능성이 높으니, 드롭다운에 background: #fff; 같은 불투명한 배경색을 직접 정해 주어서 뒤의 글자가 가려지게 고쳐 줘. 색 변수를 쓰고 있다면 이름이 정의돼 있는지, 다크 모드에서도 배경이 비지 않는지, 같은 방식으로 투명한 고정 헤더가 더 있는지 확인해 줘.

  • 배지(작은 표시)가 엉뚱한 곳으로 가거나 안 보여요

    Absolute badge escapes its card

    카드 오른쪽 위에 붙이려던 NEW 배지가 카드가 아니라 화면(또는 큰 바깥 상자)의 오른쪽 위 모서리에 붙어 있거나, 카드 밖으로 나가 보이지 않습니다.

    오늘의 상품(카드 오른쪽 위에 NEW를 붙이려는 중)고치기 전
    오늘의 상품
    NEW모모 머그컵

    '고치기'를 눌러 NEW 배지가 카드 오른쪽 위로 오는지 보세요.

    왜 그럴까요

    position: absolute인 요소의 top·right는 가장 가까운 position이 있는(static이 아닌) 조상을 기준으로 잰 값입니다. 카드에 position이 없으면 더 바깥의 위치 기준 상자까지 올라가 그곳의 모서리에 붙습니다. 기준으로 삼을 카드에 position: relative를 주면 배지가 카드 모서리에 붙습니다.

    이렇게 고쳐요

    .card {
      position: relative; /* 배지의 기준 */
    }
    .badge {
      position: absolute;
      top: 6px;
      right: 6px;
    }

    자주 생기는 때상품 카드의 NEW·할인 표시, 알림 점, 이미지 위 닫기 버튼처럼 한 상자의 모서리에 작은 것을 얹을 때 생깁니다. position: absolute와 top·right만 쓰고 기준이 될 부모를 정하지 않은 경우입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    NEW 표시가 카드 밖에 있어요, absolute가 엉뚱한 곳에 붙어요, 배지가 화면 모서리로 가요, position absolute 위치 이상

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상품 카드의 NEW 배지에 position: absolute; top: 6px; right: 6px;를 줬는데, 카드 오른쪽 위가 아니라 화면 맨 위 오른쪽 모서리에 붙어 있어. 원인은 배지를 담은 카드에 position이 없어서 더 바깥 상자가 기준이 된 것일 가능성이 높으니, 카드에 position: relative;를 주어서 배지가 카드 모서리에 붙게 고쳐 줘. 카드가 여러 개인 목록에서도 각 카드에 붙는지, 배지가 카드의 overflow: hidden에 잘리지 않는지 확인해 줘.

이상한 틈이 생겨요

여백을 준 적이 없는데 틈이 있거나, 반대로 상자의 높이가 사라질 때입니다. 상자가 안의 내용을 어떻게 세는지가 원인입니다.

  • 이미지 밑에 정체불명 틈이 있어요

    Gap under image

    이미지를 상자에 꼭 맞게 넣었는데 이미지 아래에 몇 픽셀의 빈 줄이 생겨 상자의 배경색이 비칩니다. 여백을 준 적이 없는데도 생깁니다.

    사진을 감싼 노란 상자고치기 전

    노란색은 사진을 감싼 상자의 배경입니다.

    '고치기'를 눌러 사진 아래 노란 줄이 사라지는지 보세요.

    왜 그럴까요

    이미지는 기본적으로 글자처럼 줄 안에 놓입니다. 글자는 g나 y의 꼬리가 들어갈 공간이 기준선 아래에 있는데, 이미지 아래에도 그 공간이 그대로 따라옵니다.

    이렇게 고쳐요

    img {
      display: block;
    }
    /* 또는 */
    img { vertical-align: top; }

    자주 생기는 때이미지를 배경색이나 테두리가 있는 상자에 넣거나, 이미지를 위아래로 이어 붙이는 상세 페이지에서 눈에 띕니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    이미지 아래 여백, 사진 밑에 빈 줄이 생겨요, 이미지 하단 공백, 이미지 사이에 틈이 생겨요, 이미지가 딱 안 붙어요, 사진 아래 몇 픽셀, 세로로 이은 이미지 사이 줄, inline 이미지 여백

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 노란 배경 상자에 사진을 꼭 맞게 넣었는데 사진 아래에 몇 픽셀 정도 노란 줄이 남아. 원인은 이미지가 글자처럼 줄 안에 놓여 기준선 아래 공간이 생기는 것일 가능성이 높으니, 이미지에 display: block;을 주어서 아래 틈이 없어지게 고쳐 줘. 이미지를 여러 장 위아래로 이었을 때도 틈 없이 붙는지, 이미지 아래 글이 있는 카드에서 간격이 의도대로 남는지 확인해 줘.

  • 분명 넣었는데 높이가 0이에요

    Collapsed parent

    상자 안에 카드를 넣었는데 상자 자체는 선 하나처럼 납작하고, 안의 카드가 상자 밖으로 흘러나와 아래 글과 뒤섞입니다.

    카드 두 개를 담은 상자고치기 전
    카드 1카드 2

    상자 아래에 이어지는 글입니다. 상자 안 카드 아래에 있어야 합니다.

    '고치기'를 눌러 상자가 카드를 감싸는지, 아래 글이 제자리에 오는지 보세요.

    왜 그럴까요

    상자는 기본적으로 안에 있는 일반 내용의 높이만큼 늘어납니다. 안의 내용이 float이나 absolute로 일반 흐름에서 빠져나가면 상자는 안이 비었다고 보고 높이가 0이 됩니다.

    이렇게 고쳐요

    .box {
      /* 떠 있는 자식까지 감싼다 */
      display: flow-root;
    }
    /* 또는 높이를 직접 */
    .box { min-height: 72px; }

    자주 생기는 때카드를 옆으로 나란히 놓으려고 float을 쓰거나 안의 내용을 absolute로 띄웠을 때 생깁니다. 상자에 배경이나 테두리를 주었는데 보이지 않아서 알게 됩니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    부모 높이가 없어요, 상자가 납작해져요, float 쓰면 높이가 사라져요, 배경이 안 보여요, 테두리가 줄로만 보여요, 자식이 삐져나와요, 아래 글이 위로 올라와요, clearfix

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 회색 테두리 상자 안에 float: left로 카드 두 개를 넣었는데 상자는 테두리 선 하나처럼 납작하고 카드가 상자 밖으로 나와 아래 문단과 겹쳐 보여. 원인은 안의 카드가 float이라 상자가 높이를 계산하지 못하는 것일 가능성이 높으니, 상자에 display: flow-root;를 주어서 상자가 카드 높이만큼 늘어나게 고쳐 줘. 가능하면 float 대신 flex나 grid로 바꾸는 것도 제안하고, 카드가 줄을 바꿔 여러 줄이 되어도 상자가 감싸는지 확인해 줘.

  • 첫 번째랑 마지막만 간격이 달라요

    Uneven edge spacing

    카드나 목록 항목 사이의 간격은 알맞은데, 첫 항목 위와 마지막 항목 아래의 여백만 서로 달라서 한쪽이 휑해 보입니다.

    주문 목록 상자고치기 전
    머그컵 2개
    접시 세트
    컵받침

    '고치기'를 눌러 상자 위쪽과 아래쪽 여백이 같아지는지 보세요.

    왜 그럴까요

    항목마다 자기 아래에 여백을 붙이면 마지막 항목도 아래 여백을 가져가서, 목록의 맨 끝에 여백이 하나 더 남습니다. 여백을 항목마다 붙이지 않고 부모가 항목 사이에만 정해 주면(gap) 끝에는 남지 않습니다.

    이렇게 고쳐요

    .list {
      display: flex;
      flex-direction: column;
      gap: 12px; /* 항목 사이에만 */
    }
    .item {
      margin: 0; /* 항목마다 주던 여백은 지움 */
    }

    자주 생기는 때항목마다 margin-bottom을 줘서 간격을 만든 목록에서 생깁니다. 상자에 배경이나 테두리가 있으면 맨 아래만 두꺼워 보여 눈에 띕니다. 마지막 항목만 빼려고 :last-child 예외를 쓰고 있다면 이 증상입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    맨 아래만 여백이 더 커요, 마지막 항목 아래 틈, 목록 위아래 여백이 달라요, 마지막 카드 아래만 휑해요, margin-bottom 때문에 틈이 생겨요, 카드 사이 간격 맞추기, 간격이 한쪽만 커요, gap

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 배경색이 있는 주문 목록 상자 안에서 항목 사이 간격은 12px로 맞는데, 첫 항목 위 여백보다 마지막 항목 아래 여백이 12px 더 커 보여. 원인은 항목마다 margin-bottom: 12px을 줘서 마지막 항목도 아래 여백을 가져가는 것일 가능성이 높으니, 목록 부모를 display: flex; flex-direction: column; gap: 12px;로 바꾸고 항목의 margin은 지워서 여백이 항목 사이에만 생기게 고쳐 줘. 목록이 한 줄 격자(grid)일 때도 같은지, 항목이 하나뿐일 때 여백이 이상하지 않은지 확인해 줘.

  • 안쪽 제목의 위 여백이 바깥 상자(헤더)까지 밀어내요

    Margin collapsing

    배경색이 있는 상자 안 제목에 margin-top을 줬는데, 제목이 상자 안에서 내려가지 않고 상자 전체가 아래로 밀립니다. 상자의 배경은 제목 둘레에 딱 붙어 있습니다.

    헤더가 든 페이지(점선 틀 안)고치기 전

    가을맞이 특가

    머그컵과 접시를 최대 30% 싸게 만나 보세요.

    '고치기'를 눌러 헤더 상자가 제자리로 올라가고 제목 위에 여백이 생기는지 보세요.

    왜 그럴까요

    부모와 첫 자식 사이에 padding이나 border가 없으면 두 위 여백이 하나로 합쳐지고(마진 겹침), 합쳐진 여백은 부모 바깥에 생깁니다. 그래서 제목의 여백이 부모를 통째로 밀어냅니다. 부모에 padding-top을 주거나 display: flow-root로 부모만의 영역을 만들면 여백이 부모 안에 머뭅니다.

    이렇게 고쳐요

    .header {
      /* 자식의 여백을 안에 가둠 */
      display: flow-root;
    }
    /* 또는 부모에 padding-top이나
       border를 주어도 막힙니다 */

    자주 생기는 때배경색이 있는 헤더·카드 안의 첫 제목(h1~h3)이나 마지막 문단에 위아래 margin을 줬을 때 생깁니다. 상자에 padding이나 border가 없을 때만 나타납니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    margin이 부모로 새요, 제목 마진이 부모까지 밀어요, 위 여백이 바깥으로 빠져나가요, 마진 겹침

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 하늘색 배경의 헤더 상자 안 제목 h3에 margin-top: 22px을 줬는데, 제목이 헤더 안에서 내려오지 않고 헤더 상자 전체가 22px 아래로 밀려. 헤더 배경은 제목 둘레에 딱 붙어 있어. 원인은 헤더에 padding이나 border가 없어서 제목의 위 여백이 헤더 바깥으로 겹쳐 나가는 것(마진 겹침)일 가능성이 높으니, 헤더에 display: flow-root;를 주어서 여백이 헤더 안에 머물게 고쳐 줘. 아래쪽 여백도 같은지, 헤더에 padding을 줘도 되는지 알려 줘.

  • 항목 사이 간격이 들쭉날쭉해요

    Uneven gaps between items

    버튼이나 태그를 나란히 놓았는데 어떤 사이는 좁고 어떤 사이는 넓어 간격이 제각각입니다. 항목을 더하거나 뺄 때마다 간격이 또 어긋납니다.

    메뉴 태그 줄고치기 전
    신상품인기할인기획전

    '고치기'를 눌러 태그 사이 간격이 모두 같아지는지 보세요.

    왜 그럴까요

    간격을 항목마다 따로 주면 어느 항목에 얼마를 줬는지 일일이 맞춰야 하고, 빠뜨리거나 다르게 준 곳만 간격이 어긋납니다. 간격은 항목이 아니라 항목을 담는 부모가 한 값으로 정하게 합니다(gap).

    이렇게 고쳐요

    .tags {
      display: flex;
      flex-wrap: wrap;
      gap: 8px; /* 간격은 부모가 한 번만 */
    }
    .tag {
      margin: 0; /* 항목마다 주던 여백은 지움 */
    }

    자주 생기는 때항목마다 margin-left·margin-right를 필요한 만큼씩 따로 준 태그 모음, 버튼 줄, 메뉴에서 생깁니다. 항목을 추가·삭제할 때마다 간격을 다시 손봐야 하는 것이 신호입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    간격이 제각각이에요, 태그 사이 간격이 달라요, 버튼 사이 틈이 안 맞아요, 항목마다 margin을 줬어요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 '신상품·인기·할인·기획전' 태그 줄의 간격이 사이마다 달라 어떤 곳은 붙어 있고 어떤 곳은 넓게 벌어져. 원인은 태그마다 margin-left·margin-right를 따로 준 것일 가능성이 높으니, 태그의 margin을 모두 지우고 태그를 담은 부모에 display: flex; flex-wrap: wrap; gap: 8px;를 주어서 간격이 한 값으로 같아지게 고쳐 줘. 태그를 추가해 줄이 바뀌어도 줄 사이 간격이 같은지, 390px 폭에서도 확인해 줘.

  • 배경 안쪽을 넓히려는데 바깥 간격만 벌어져요

    Padding versus margin

    버튼이나 배지의 배경이 글자에 딱 붙어 답답해서 여백을 늘렸는데, 색이 칠해진 부분은 그대로고 주변 빈틈만 커집니다.

    무료 배송 배지고치기 전
    무료 배송옆의 글자

    '고치기'를 눌러 파란 배경이 넓어지는지 보세요.

    왜 그럴까요

    margin은 상자 바깥의 빈 공간이라 배경이 칠해지지 않고, padding은 상자 안쪽 공간이라 배경색이 함께 칠해집니다. 색이 칠해진 면을 키우려면 padding을 늘립니다. 다른 요소와 떨어뜨릴 때만 margin을 씁니다.

    이렇게 고쳐요

    .tag {
      padding: 10px 20px; /* 배경 안쪽을 넓힘 */
      margin: 0;
    }

    자주 생기는 때알약 모양 태그, 버튼, 알림 줄처럼 배경색이 있는 작은 상자의 글자 둘레를 넓히고 싶을 때 생깁니다. margin과 padding을 헷갈리면 누구나 겪습니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    margin을 늘렸는데 배경이 그대로예요, 버튼을 크게 하고 싶어요, 배지 안쪽 여백, padding margin 헷갈려요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 파란 '무료 배송' 배지가 글자에 딱 붙어 답답해서 margin: 14px 24px을 줬는데, 파란 배경 크기는 그대로고 주변 빈틈만 커졌어. 원인은 바깥 여백(margin)을 늘린 것일 가능성이 높으니, margin을 지우고 padding: 10px 20px;으로 바꿔서 파란 배경 안쪽이 넓어지게 고쳐 줘. 배지 옆 글자와의 간격은 부모의 gap으로 따로 정하고, 글자가 길어져 줄이 바뀔 때도 배경이 어색하지 않은지 확인해 줘.

글자가 이상해요

줄바꿈 위치, 줄 수 제한, 숫자 폭처럼 글자가 놓이는 방식이 어색할 때입니다.

  • 한글이 단어 중간에서 끊겨요

    Korean mid-word break

    좁은 상자 안의 한글이 단어 한가운데서 줄이 바뀌어 '배송비'가 '배송 / 비'처럼 두 동강 납니다. 읽기 불편하고 어색해 보입니다.

    좁은 안내 카드고치기 전

    배송비는 오만 원 이상 구매하시면 무료입니다. 제주·도서산간 지역은 추가 배송비가 필요합니다.

    '고치기'를 눌러 단어가 통째로 줄을 바꾸는지 보세요.

    왜 그럴까요

    브라우저는 한글을 글자 하나하나 사이에서도 줄을 바꿀 수 있게 둡니다. 띄어쓰기 단위로만 줄을 바꾸라고 알려 주면 낱말이 통째로 다음 줄로 넘어갑니다.

    이렇게 고쳐요

    .text {
      word-break: keep-all;
      /* 아주 긴 낱말만 예외로 끊기 */
      overflow-wrap: anywhere;
    }

    자주 생기는 때카드 제목, 버튼, 안내문처럼 폭이 좁은 곳에 한글 문장을 넣을 때 생깁니다. 영어는 단어째로 줄이 바뀌어서 한글에서만 어색하다고 느끼게 됩니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    글자 잘림 한글, 한글 줄바꿈이 이상해요, 단어가 두 줄로 쪼개져요, 낱말이 끊겨요, 어절 단위로 줄바꿈, 한글 줄바꿈, keep-all, word-break

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 좁은 안내 카드의 한글이 '배송비' 같은 단어 중간에서 줄이 바뀌어 읽기 불편해. 원인은 한글이 글자 사이에서도 줄바꿈이 허용되는 기본값일 가능성이 높으니, 한글 본문에 word-break: keep-all; overflow-wrap: anywhere;를 주어서 단어 단위로 줄이 바뀌고 아주 긴 낱말만 예외로 끊기게 고쳐 줘. 영어 주소 같은 긴 글자가 상자를 넘지 않는지와 390px 폭에서 어색한 줄바꿈이 없는지 확인해 줘.

  • 소개글을 두 줄까지만 보여주고 싶어요

    Two-line clamp

    카드 안 소개글이 길어서 카드마다 높이가 들쭉날쭉합니다. 두 줄까지만 보여 주고 넘치는 글은 끝에 …으로 줄이고 싶습니다.

    상품 카드 소개글고치기 전
    손으로 빚은 머그컵

    흙을 직접 빚고 천천히 구워 낸 머그컵입니다. 손에 쥐면 따뜻하고 가벼우며, 뜨거운 물을 부어도 겉이 덜 뜨겁습니다. 식기세척기와 전자레인지에도 쓸 수 있고 색은 일곱 가지 중에서 고를 수 있습니다.

    '고치기'를 눌러 소개글이 두 줄에서 …으로 끝나는지 보세요.

    왜 그럴까요

    글은 기본적으로 길이만큼 줄을 계속 늘립니다. 보여 줄 줄 수를 정하고 넘치는 부분을 숨기면서 끝에 …을 붙이는 약속을 따로 해 주어야 합니다.

    이렇게 고쳐요

    .intro {
      display: -webkit-box;
      -webkit-box-orient: vertical;
      -webkit-line-clamp: 2;
      line-clamp: 2;
      overflow: hidden;
    }

    자주 생기는 때상품 카드 설명, 블로그 목록의 요약, 프로필 소개글처럼 길이가 제각각인 글을 같은 높이로 맞춰 나열할 때 씁니다. 전체 글은 눌러서 펼치는 식으로 따로 보여 줍니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    말줄임, ...으로 자르기, 두 줄 말줄임, 점 세 개로 줄이기, 줄 수 제한, 긴 글 잘라서 보여주기, 더보기 처리, text-overflow ellipsis, line-clamp

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상품 카드의 소개글이 길어서 카드마다 높이가 달라. 소개글을 두 줄까지만 보여 주고 넘치는 글은 끝에 …이 붙게 바꿔 줘. display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden;으로 처리하고, 글이 두 줄보다 짧을 때는 그대로 보이게 해 줘. 전체 글을 보는 방법(카드를 누르면 펼치기)도 필요한지 알려 주고, 글 전체는 화면 읽기 프로그램에서도 읽히는지 확인해 줘.

  • 숫자가 바뀔 때마다 폭이 들썩여요

    Jumping digits

    타이머나 점수처럼 숫자가 계속 바뀌는 곳에서, 숫자 옆 글자가 숫자가 바뀔 때마다 좌우로 살짝살짝 움직입니다. 1이 들어간 숫자가 특히 좁게 보입니다.

    남은 시간 표시고치기 전
    10:11남음
    11:11남음
    00:00남음

    '고치기'를 눌러 세 줄의 '남음'이 같은 자리에 서는지 보세요.

    왜 그럴까요

    대부분의 글꼴은 숫자 1을 8보다 좁게 그려서(비례 폭) 숫자가 바뀌면 전체 폭도 달라집니다. 모든 숫자를 같은 폭으로 그리는 기능을 켜면 폭이 고정되어 옆 글자가 움직이지 않습니다.

    이렇게 고쳐요

    .timer {
      font-variant-numeric: tabular-nums;
    }

    자주 생기는 때카운트다운, 점수판, 재고 수량, 가격표처럼 숫자가 바뀌거나 여러 줄의 숫자를 세로로 맞춰야 하는 곳에서 눈에 띕니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    숫자 흔들림, 타이머 숫자가 떨려요, 카운트다운 옆 글자가 움직여요, 숫자 폭이 달라요, 숫자 들썩임, 고정폭 숫자, 표 숫자 정렬 안 됨, 가격 자릿수 안 맞음, tabular-nums

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 남은 시간을 보여 주는 타이머 숫자가 바뀔 때마다 옆의 '남음' 글자가 좌우로 흔들려. 원인은 글꼴의 숫자 폭이 숫자마다 달라서일 가능성이 높으니, 숫자가 들어간 요소(타이머·점수·수량·가격)에 font-variant-numeric: tabular-nums;를 주어서 모든 숫자가 같은 폭으로 그려지게 고쳐 줘. 쓰는 글꼴이 이 기능을 지원하는지 확인하고, 지원하지 않으면 대안을 알려 줘.

  • 한 줄 말줄임(…)이 안 되고 글자가 뚝 잘리거나 밀려나요

    One-line ellipsis in a flex row

    긴 제목을 한 줄로 두고 끝을 …으로 줄이고 싶은데 …은 안 나오고, 글자가 상자 경계에서 뚝 잘리며 옆에 있던 시간 표시까지 밖으로 밀려납니다.

    알림 목록 두 줄고치기 전
    [모모샵] 주문하신 머그컵 2개가 오늘 오후에 출고되었습니다3분 전
    배송이 시작됐어요1시간 전

    '고치기'를 눌러 긴 제목이 …으로 줄고 '3분 전'이 상자 안에 들어오는지 보세요.

    왜 그럴까요

    한 줄 말줄임에는 세 가지가 함께 있어야 합니다. 줄을 바꾸지 않고(white-space: nowrap), 넘치는 부분을 숨기고(overflow: hidden), 그 끝에 …을 붙이는(text-overflow: ellipsis) 설정입니다. 거기에 flex 줄 안의 칸은 안의 글자 폭보다 좁아지지 않으려는 성질이 있어 min-width: 0도 필요합니다. 이것이 빠지면 칸이 글자 폭만큼 늘어나 옆 칸을 밀어냅니다.

    이렇게 고쳐요

    .title {
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
      min-width: 0; /* flex 칸 안에서 */
    }

    자주 생기는 때알림·메일·채팅 목록처럼 '아이콘, 제목, 시간'이 한 줄에 놓이는 행에서 제목이 길 때 생깁니다. 한 줄 말줄임에 필요한 속성이 하나라도 빠지면 안 먹히는 것이 특징입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    말줄임표가 안 나와요, 제목이 한 줄로 안 줄어요, 글자가 뚝 잘려요, 옆 시간 표시가 밀려나요, ellipsis 안 먹힘

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 알림 목록 한 줄이 '아바타 + 제목 + 시간(3분 전)'인데, 제목이 길면 …이 안 나오고 글자가 알림 상자 끝에서 뚝 잘리면서 '3분 전'이 상자 밖으로 밀려 안 보여. 원인은 한 줄 말줄임 설정이 빠졌고 flex 칸의 min-width가 자동이어서 제목 칸이 글자 폭만큼 늘어나는 것일 가능성이 높으니, 제목에 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0;을 모두 주어서 제목만 …으로 줄고 시간은 항상 보이게 고쳐 줘. 제목이 짧을 때는 그대로 보이는지, 줄여진 제목의 전체 글을 마우스를 올리면 볼 수 있게(title 속성) 할 필요가 있는지 알려 줘.

  • 글줄이 빽빽해서 읽기 힘들어요

    Tight line height

    여러 줄로 이어지는 글이 위아래로 붙어 있어서, 윗줄과 아랫줄 글자가 닿을 듯이 빽빽하고 읽다가 줄을 잃어버립니다.

    사용 안내 카드고치기 전
    손으로 빚은 가을 머그컵 사용 안내

    뜨거운 물을 부은 뒤에는 손잡이를 잡고 천천히 마셔 주세요. 처음 쓰기 전에는 따뜻한 물로 한 번 헹구면 더 좋습니다. 급하게 식히지 말고 실온에 두세요.

    '고치기'를 눌러 줄 사이가 넉넉해져 읽기 편해지는지 보세요.

    왜 그럴까요

    line-height는 한 줄이 차지하는 높이입니다. 1은 글자 크기와 같아서 줄이 맞닿고, 기본값(normal)도 한글에서는 빠듯한 경우가 많습니다. 본문은 글자 크기의 1.5~1.7배, 제목은 1.2~1.3배가 읽기 편합니다. 단위 없는 숫자로 주면 글자 크기가 바뀌어도 비율이 유지됩니다.

    이렇게 고쳐요

    body {
      line-height: 1.6; /* 본문 */
    }
    h2,
    h3 {
      line-height: 1.25; /* 제목 */
    }

    자주 생기는 때카드 소개글, 공지, 약관처럼 두 줄 이상 이어지는 본문과 두 줄이 되는 제목에서 생깁니다. line-height: 1로 초기화한 스타일이나 시안의 글자 높이를 그대로 옮겼을 때 흔합니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    줄간격이 좁아요, 글이 답답해 보여요, 문단이 뭉쳐 보여요, 줄 간격 늘리기

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 안내 카드의 본문과 제목이 line-height: 1이라 줄이 서로 닿을 듯이 빽빽해서 읽기 힘들어. 원인은 줄 높이가 글자 크기와 같은 것일 가능성이 높으니, 본문에 line-height: 1.6;, 두 줄이 되는 제목에 line-height: 1.25;를 단위 없는 숫자로 주어서 줄 사이가 여유 있게 고쳐 줘. 글자 크기를 키우거나 줄여도 비율이 유지되는지, 카드 높이가 늘어나 레이아웃이 깨지지 않는지 확인해 줘.

  • 기기마다 글꼴이 다르게 나와요

    Font differs across devices

    내 PC에서는 예쁘게 나오던 글꼴이 다른 사람의 폰이나 컴퓨터에서는 명조체 같은 기본 글꼴로 나옵니다. 기기마다 글자 모양과 폭이 달라 줄바꿈까지 달라집니다.

    글꼴이 없는 기기를 흉내(없으면 기본 명조로 떨어짐)고치기 전

    주문이 완료되었습니다
    Order #1024 · 배송 준비 중

    font-family: "MomoBrand";

    '고치기'를 눌러 명조체로 떨어진 글꼴이 고딕으로 바뀌는지 보세요. 글꼴이 없는 기기는 흉내입니다.

    왜 그럴까요

    font-family에 적은 글꼴은 쓰는 기기에 실제로 있어야 쓸 수 있습니다. 없으면 브라우저는 다음 후보로 넘어가는데, 후보가 하나뿐이면 기기의 기본 글꼴(흔히 명조 계열)로 떨어집니다. 웹 글꼴 파일을 함께 싣고, 그 뒤에 여러 기기에 이미 있는 글꼴을 순서대로 적고 맨 끝에 sans-serif 같은 일반 이름을 둡니다.

    이렇게 고쳐요

    body {
      font-family: "Pretendard Variable", Pretendard,
        "Apple SD Gothic Neo", "Malgun Gothic",
        sans-serif;
    }
    /* 웹 글꼴 파일은 @font-face로 함께 싣습니다 */

    자주 생기는 때디자이너가 쓴 글꼴 이름을 font-family에 하나만 적었거나, 내 컴퓨터에만 깔린 글꼴을 쓴 사이트에서 생깁니다. 웹 글꼴 파일을 싣지 않은 채 다른 기기로 열어 볼 때 드러납니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    내 컴퓨터에서만 예뻐요, 글꼴이 명조체로 나와요, 폰에서 글꼴이 달라요, font-family 안 먹힘, 웹폰트 대체 글꼴

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 font-family: "MomoBrand";만 적어 뒀더니 이 글꼴이 없는 폰과 PC에서는 명조체 같은 기본 글꼴로 나와. 원인은 후보가 하나뿐이라 글꼴이 없으면 기기 기본 글꼴로 떨어지는 것일 가능성이 높으니, font-family를 "Pretendard Variable", Pretendard, "Apple SD Gothic Neo", "Malgun Gothic", sans-serif;처럼 웹 글꼴 뒤에 여러 기기의 기본 한글 글꼴을 순서대로 적고 맨 끝에 sans-serif를 두어서 어디서나 고딕으로 나오게 고쳐 줘. 쓰는 글꼴 파일을 @font-face로 싣고 있는지, 라이선스상 웹에 써도 되는지도 확인해 줘.

스크롤이 이상해요

스크롤 막대가 두 개 생기거나, 필요한 곳에 안 생기거나, 뒤 화면이 따라 움직일 때입니다. 어느 상자가 스크롤을 맡는지가 열쇠입니다.

  • 스크롤이 두 개 생겨요

    Double scrollbar

    화면 오른쪽에 스크롤 막대가 두 줄 보입니다. 안쪽 상자를 내리다 끝나면 이번에는 바깥 화면이 따로 움직여서, 어디를 내리고 있는지 헷갈립니다.

    주문 목록(주황 막대=바깥, 회색 막대=안쪽)고치기 전
    관리자 · 주문 목록

    #1001 머그컵 2개

    #1002 접시 세트

    #1003 컵받침

    #1004 텀블러

    #1005 수저 세트

    #1006 찻잔

    #1007 냄비 받침

    #1008 행주

    '고치기'를 눌러 스크롤 막대가 한 줄로 줄어드는지 보세요.

    왜 그럴까요

    안쪽 상자가 화면 높이만큼 크고 그 위에 머리글까지 있으니, 합친 높이가 화면보다 커서 바깥도 스크롤됩니다. 안쪽 상자는 따로 스크롤 설정이 있어서 두 곳에서 동시에 스크롤이 생깁니다. 높이를 머리글과 나눠 갖게 하고, 스크롤은 한 곳에만 둡니다.

    이렇게 고쳐요

    .page {
      height: 100dvh;
      display: flex;
      flex-direction: column;
      overflow: hidden; /* 바깥은 스크롤 없음 */
    }
    .inner {
      flex: 1;
      min-height: 0;
      overflow: auto; /* 스크롤은 여기 한 곳 */
    }

    자주 생기는 때상자를 화면 높이만큼 채우려고 height: 100vh를 줬는데 그 위에 머리글이나 여백이 더 있을 때 생깁니다. 관리자 화면, 채팅창, 모달 안 목록에서 자주 보입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    스크롤바가 두 개예요, 스크롤 막대가 두 줄, 이중 스크롤, 안쪽도 바깥도 스크롤돼요, 스크롤이 겹쳐요, 페이지도 상자도 따로 움직여요, 100vh 때문에 스크롤, overflow 두 번

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 관리자 주문 목록 화면이 오른쪽에 스크롤 막대가 두 개(바깥 화면 하나, 안쪽 목록 하나)로 나와. 원인은 머리글 아래 목록 상자에 height: 100vh를 줘서 머리글 높이만큼 화면을 넘는 것일 가능성이 높으니, 바깥 틀을 height: 100dvh; display: flex; flex-direction: column; overflow: hidden;으로 하고 목록 상자는 flex: 1; min-height: 0; overflow: auto;로 바꿔서 스크롤이 목록 한 곳에만 생기게 고쳐 줘. 머리글 높이가 바뀌어도 맞는지, 폰 가로·세로 모두에서 바깥 스크롤이 생기지 않는지 확인해 줘.

  • 팝업 떴는데 뒤 배경이 같이 스크롤돼요

    Background scrolls behind popup

    팝업 안의 긴 목록을 끝까지 내렸더니, 팝업이 아니라 뒤에 있는 배경 화면이 같이 내려갑니다. 팝업을 닫으면 읽던 위치가 달라져 있습니다.

    쇼핑 화면과 장바구니 팝업(휠 흉내)고치기 전

    오늘의 상품

    머그컵

    접시 세트

    컵받침

    텀블러

    수저 세트

    찻잔

    냄비 받침

    행주

    배경 위치 0px

    '휠 더 내리기'로 팝업 목록 끝에서 더 내려 보고, 뒤 배경 위치가 변하는지 '고치기'로 비교해 보세요. 휠 움직임은 흉내입니다.

    왜 그럴까요

    스크롤 상자가 끝에 닿으면 브라우저는 남은 움직임을 바깥 상자(결국 뒤 배경)에 넘겨줍니다. 이 넘겨주기를 막는 설정을 팝업 목록에 주고, 팝업이 열려 있는 동안에는 배경이 스크롤되지 않게 잠가 둡니다.

    이렇게 고쳐요

    .popup-list {
      overscroll-behavior: contain; /* 끝에서 바깥으로 안 넘김 */
    }
    /* 팝업이 열려 있는 동안 */
    body.is-popup-open {
      overflow: hidden;
    }

    자주 생기는 때목록이 긴 팝업, 아래에서 올라오는 시트, 장바구니 서랍을 열었을 때 생깁니다. 폰에서 손가락으로 끝까지 밀 때 특히 눈에 띕니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    팝업 뒤 화면이 움직여요, 모달 뒤가 스크롤돼요, 팝업 안을 내리면 배경이 따라와요, 모달 열면 뒤 페이지가 내려가요, 스크롤 체이닝, 뒤 화면 스크롤 막기, overscroll-behavior, body 스크롤 잠금

    헷갈리는 이웃

    • 스크롤이 두 개 생겨요 스크롤 막대가 두 곳에 생기는 문제입니다. 여기는 막대는 따로인데 움직임이 한쪽으로 넘어가 같이 움직입니다.
    • 팝업이 다른 것 뒤에 깔려요 팝업이 다른 것 뒤에 깔려 안 보이는 문제와 달리, 팝업은 잘 보이는데 뒤 배경이 움직입니다.
    복사되는 부탁 문장

    내 화면에서 장바구니 팝업 안의 목록을 끝까지 내리고 더 내리면 팝업 뒤의 상품 목록 화면이 같이 스크롤돼. 원인은 팝업 목록이 끝에 닿으면 스크롤 움직임이 바깥 화면으로 넘어가는 것일 가능성이 높으니, 팝업 목록에 overscroll-behavior: contain;을 주고 팝업이 열려 있는 동안 body에 overflow: hidden;을 걸어 뒤 화면이 움직이지 않게 고쳐 줘. 팝업을 닫으면 잠금과 원래 스크롤 위치가 그대로 돌아오는지, 아이폰에서도 뒤 화면이 안 움직이는지 확인해 줘.

  • 내용이 더 있는데 스크롤이 안 돼요

    Cannot scroll long content

    팝업이나 옆 패널 안에 내용이 길게 있는데 스크롤 막대가 생기지 않고 아래가 그냥 잘립니다. 아래에 둔 버튼이 상자 밖으로 밀려 나가기도 합니다.

    장바구니 팝업고치기 전
    장바구니 (8)
    • 머그컵 ×2
    • 접시 세트
    • 컵받침
    • 텀블러
    • 수저 세트
    • 찻잔
    • 냄비 받침
    • 행주
    결제하기

    '고치기'를 눌러 목록에 스크롤 막대가 생기고 '결제하기'가 보이는지 확인하세요.

    왜 그럴까요

    flex로 나뉜 칸은 기본으로 안의 내용보다 작아지지 않으려는 성질이 있습니다. 가운데 칸이 목록 높이만큼 늘어나면 목록 입장에서는 넘치는 것이 없어 스크롤이 생길 이유가 없고, 바깥 상자가 남는 부분을 잘라 버립니다. 칸에 min-height: 0을 주면 남은 높이까지만 차지하고, 넘치는 목록이 스크롤됩니다.

    이렇게 고쳐요

    .modal {
      display: flex;
      flex-direction: column;
      height: 280px;
    }
    .body {
      flex: 1;
      min-height: 0; /* 이 줄이 빠져 있었어요 */
    }
    .list {
      height: 100%;
      overflow: auto;
    }

    자주 생기는 때높이를 정한 상자를 머리·가운데·바닥으로 나누고(flex), 가운데에 긴 목록을 넣었을 때 생깁니다. overflow: auto를 줬는데도 안 먹히는 것이 특징입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    스크롤 막대가 안 생겨요, 아래 내용이 잘려요, 긴 목록이 안 내려가요, 스크롤이 안 먹혀요, overflow auto 안 먹힘, flex 안에서 스크롤 안 돼요, 아래 버튼이 사라졌어요, min-height 0, 팝업 안 내용이 안 내려가요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 장바구니 팝업(높이 280px)을 머리·목록·결제 버튼으로 나눴는데, 목록이 길어도 스크롤이 안 생기고 결제 버튼이 팝업 아래로 밀려 안 보여. 원인은 flex 칸이 내용 높이만큼 늘어나서일 가능성이 높으니, 목록을 감싼 칸에 min-height: 0;을 주고 안의 목록에 height: 100%; overflow: auto;를 주어서 목록 안에서만 스크롤되고 결제 버튼은 늘 보이게 고쳐 줘. 목록이 짧을 때도 팝업이 어색하지 않은지, 폰의 작은 화면에서도 같은지 확인해 줘.

  • 페이지 이동할 때 화면이 좌우로 덜컹해요

    Page shifts with scrollbar

    내용이 짧은 페이지에서 긴 페이지로 넘어갈 때 제목과 메뉴가 옆으로 살짝 밀렸다가 돌아옵니다. 페이지 길이가 서로 다를 때만 생깁니다.

    페이지 이동 흉내(점선이 상자의 한가운데)고치기 전
    모모샵오늘의 추천

    머그컵·접시·컵받침·텀블러·수저 세트·찻잔·냄비 받침·행주·앞치마·장갑·주방 저울·계량컵

    '긴 페이지로 이동'을 눌러 글자가 점선에서 옆으로 밀리는지 보고, '고치기' 뒤에 다시 비교해 보세요.

    왜 그럴까요

    스크롤 막대는 나타나는 순간 화면 가로 공간을 15px쯤 가져갑니다. 그만큼 가운데 정렬한 내용이 왼쪽으로 밀립니다. 막대가 있든 없든 그 자리를 처음부터 비워 두라고 하면 움직임이 사라집니다. 맥처럼 막대가 내용 위에 겹쳐 나타나는 환경에서는 원래 이 현상이 없습니다.

    이렇게 고쳐요

    html {
      scrollbar-gutter: stable;
    }
    /* 상자 안 스크롤에도 같습니다 */
    .panel {
      scrollbar-gutter: stable;
    }

    자주 생기는 때스크롤 막대가 생기는 긴 페이지와 안 생기는 짧은 페이지를 오가는 사이트에서 생깁니다. 탭을 바꾸거나 더보기를 눌러 길이가 변할 때도 같습니다. 윈도처럼 막대가 자리를 차지하는 환경에서 보입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    페이지마다 가운데가 달라져요, 스크롤바 때문에 흔들려요, 화면이 살짝 옆으로 움직여요, 메뉴가 옆으로 밀렸다 돌아와요, 스크롤바가 생기면 레이아웃이 움직여요, 좌우로 덜컹거려요, scrollbar-gutter, 스크롤 막대 자리

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 짧은 '소개' 페이지에서 긴 '상품 목록' 페이지로 이동하면 제목과 상단 메뉴가 왼쪽으로 15px쯤 밀렸다가 돌아와서 덜컹거려. 원인은 긴 페이지에만 스크롤 막대가 생겨 그만큼 가로 공간이 줄어드는 것일 가능성이 높으니, html에 scrollbar-gutter: stable;을 주어서 막대가 없을 때도 자리를 비워 두게 고쳐 줘. 가운데 정렬한 요소가 양쪽 여백이 달라 보이지 않는지, 모달을 열 때 body를 잠가도 움직이지 않는지 확인해 줘.

  • 채팅처럼 아래부터 보여야 하는데 위에서 시작해요

    Chat starts at the top

    채팅창을 열면 가장 오래된 대화가 보이고, 방금 온 메시지는 아래에 숨어 있어 직접 끝까지 내려야 합니다. 새 메시지가 와도 화면이 따라 내려가지 않습니다.

    상담 채팅창고치기 전

    안녕하세요, 주문 문의예요.

    네, 어떤 주문인가요?

    머그컵 2개 시켰어요.

    확인했어요. 오늘 출고돼요.

    언제쯤 도착할까요?

    내일 오후 도착 예정이에요.

    알겠어요, 감사합니다.

    필요하면 또 말씀해 주세요.

    맨 아래의 '필요하면 또 말씀해 주세요.'가 보이는지 확인하고, '고치기' 뒤에 비교해 보세요.

    왜 그럴까요

    스크롤 상자는 기본으로 맨 위에서 시작합니다. 맨 아래를 보여 달라고 따로 말하지 않으면 내용이 길어도 위쪽만 보입니다. 열 때와 새 글이 붙을 때마다 스크롤 위치를 끝으로 옮기거나, 아래부터 쌓이는 방식으로 상자를 만듭니다.

    이렇게 고쳐요

    // 열 때, 그리고 새 글이 붙은 뒤에
    list.scrollTop = list.scrollHeight;
    
    /* CSS만으로 하려면: 새 글을 목록 맨 앞에 넣고 */
    .chat {
      display: flex;
      flex-direction: column-reverse;
    }

    자주 생기는 때채팅, 댓글창, 로그 보기, 알림 목록처럼 최신 글이 아래에 쌓이는 화면에서 생깁니다. 스크롤만 달아 두면 기본으로 맨 위에서 시작합니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    채팅창이 맨 위에서 시작해요, 새 메시지가 안 보여요, 최신 글이 아래에 숨어요, 채팅 스크롤을 맨 아래로, 열면 오래된 글부터 보여요, 자동으로 안 내려가요, scrollTop scrollHeight, column-reverse

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상담 채팅창을 열면 가장 오래된 메시지가 보이고 방금 받은 메시지는 아래에 숨어 있어. 새 메시지가 와도 화면이 안 내려가. 원인은 스크롤 상자가 기본으로 맨 위에서 시작하기 때문일 가능성이 높으니, 채팅창을 열 때와 새 메시지가 붙은 뒤에 list.scrollTop = list.scrollHeight;로 맨 아래로 옮기고, 사용자가 위의 옛 메시지를 읽는 중이면 억지로 내리지 않고 '새 메시지' 버튼만 보이게 고쳐 줘. 이미지가 늦게 불러와져 높이가 늘어날 때도 맨 아래가 유지되는지 확인해 줘.

  • 헤더가 스크롤을 안 따라와요(sticky가 안 먹혀요)

    Sticky not sticking

    제목줄에 position: sticky를 줬는데 스크롤하면 그냥 같이 올라가서 사라집니다. 위에 붙어 있기를 기대했는데 일반 요소처럼 움직입니다.

    주문 목록(머리글을 위에 붙이려는 중)고치기 전
    주문 목록

    #1001 머그컵 2개

    #1002 접시 세트

    #1003 컵받침

    #1004 텀블러

    #1005 수저 세트

    #1006 찻잔

    #1007 냄비 받침

    #1008 행주

    '아래로 내리기'를 눌러 머리글이 따라오는지 보고, '고치기' 뒤에 다시 비교해 보세요.

    왜 그럴까요

    sticky는 '스크롤이 이 위치에 닿으면 붙어라'는 약속이라 붙을 위치(top: 0)를 반드시 적어야 합니다. 또 sticky는 가장 가까운 스크롤 상자를 기준으로 붙는데, 조상에 overflow: hidden이나 auto가 있으면 그 조상이 기준이 되어 실제로 스크롤하는 바깥 상자에서는 붙지 않습니다.

    이렇게 고쳐요

    .header {
      position: sticky;
      top: 0; /* 붙을 위치 */
    }
    /* 조상의 overflow: hidden은 풀어 줍니다 */
    .wrap {
      overflow: visible;
    }

    자주 생기는 때긴 목록·표의 머리글, 카테고리 탭, 안내 줄을 스크롤하는 동안 맨 위에 붙여 두려 할 때 생깁니다. 조상에 overflow를 걸어 둔 레이아웃에서 자주 막힙니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    position sticky 안 먹힘, 스크롤하면 헤더가 사라져요, 표 머리글이 안 붙어요, sticky가 작동 안 해요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 주문 목록의 머리글 줄에 position: sticky를 줬는데 스크롤하면 그냥 같이 올라가서 사라져. 원인은 머리글에 top 값이 없고 머리글을 감싼 조상에 overflow: hidden이 있어서 sticky의 기준이 바뀐 것일 가능성이 높으니, 머리글에 top: 0;을 주고 조상의 overflow: hidden은 visible로 풀어서 목록을 스크롤하는 동안 맨 위에 붙게 고쳐 줘. 조상의 overflow를 풀 수 없다면 스크롤하는 상자를 sticky의 부모로 옮기는 방법도 알려 주고, 고정 헤더 아래에 둘 때 top 값이 맞는지 확인해 줘.

폰에서만 이상해요

PC에서는 멀쩡한데 폰에서만 가려지거나 눌리지 않거나 확대될 때입니다. 폰 화면의 높이·손가락·터치 규칙이 PC와 다릅니다.

  • 폰에서 아래 버튼이 주소창에 가려요

    Bottom button hidden by browser bar

    폰 브라우저에서 화면 맨 아래에 붙여 둔 '결제하기' 버튼의 아랫부분이 주소창이나 아래 막대 뒤로 들어가 잘려 보이고 누르기 어렵습니다. PC에서는 멀쩡합니다.

    폰 화면 흉내(주소창을 접고 펴 보세요)고치기 전
    주문하기

    머그컵 2개 · 24,000원

    결제하기

    '고치기'를 눌러 '결제하기'가 아래 막대 위로 올라오는지 보세요. 실제 폰의 주소창을 흉내 낸 그림입니다.

    왜 그럴까요

    100vh는 주소창이 접혀 화면이 가장 커졌을 때의 높이입니다. 주소창이 보이는 평소에는 실제로 보이는 높이가 더 작아서 바닥이 막대 뒤로 들어갑니다. 지금 보이는 높이를 따라가는 100dvh를 쓰고, 아이폰 아래 홈 막대 자리는 safe-area로 비워 둡니다.

    이렇게 고쳐요

    .app {
      min-height: 100vh;  /* 오래된 브라우저용 */
      min-height: 100dvh; /* 지금 보이는 높이 */
      padding-bottom: env(safe-area-inset-bottom);
    }
    /* env()를 쓰려면 viewport에 viewport-fit=cover */

    자주 생기는 때화면 높이를 꽉 채우려고 height: 100vh를 쓴 로그인·주문 화면에서 생깁니다. 아래에 고정 버튼이 있는 화면에서 아이폰 사파리와 폰 크롬에서 자주 보입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    100vh가 이상해요, 하단 버튼이 잘려요, 주소창 때문에 가려져요, 아이폰 아래 막대에 가려요, 모바일 주소창 높이, 아래 고정 버튼이 반쯤 가려요, dvh, safe area

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 주문 페이지 맨 아래의 '결제하기' 버튼이 아이폰 사파리에서 아랫부분이 주소창과 아래 막대 뒤로 들어가 가려져. 원인은 전체 높이를 height: 100vh로 잡은 것일 가능성이 높으니, min-height: 100vh 다음 줄에 min-height: 100dvh;를 덧붙이고 아래 여백에 padding-bottom: env(safe-area-inset-bottom);을 주어서 버튼이 항상 보이는 높이 안에 놓이게 고쳐 줘. viewport 메타 태그에 viewport-fit=cover를 넣어야 하는지도 확인하고, 주소창이 접히고 펴질 때 버튼 위치가 튀지 않는지 알려 줘.

  • 폰에서 버튼이 잘 안 눌려요

    Tap targets too small

    폰에서 작은 아이콘 버튼을 누르려는데 잘 안 눌리거나, 바로 옆 버튼이 대신 눌립니다. PC에서는 마우스로 정확히 누르게 되니 만든 사람은 알아채기 어렵습니다.

    폰 화면 흉내(엄지가 15px 빗나가요)고치기 전
    머그컵12,000원

    '엄지로 하트 누르기'를 눌러 어느 버튼이 눌리는지 보고, '고치기' 뒤에 다시 눌러 보세요. 손가락은 흉내입니다.

    왜 그럴까요

    손가락 끝은 마우스 화살표보다 훨씬 넓습니다. 누를 수 있는 영역이 작으면 손가락이 옆 버튼에 걸쳐 닿습니다. 보이는 아이콘 크기는 그대로 두고 누르는 영역만 가로·세로 44px 이상(애플은 44pt, 안드로이드는 48dp 권장)으로 넓힙니다.

    이렇게 고쳐요

    .icon-btn {
      min-width: 44px;
      min-height: 44px;
      display: inline-grid;
      place-items: center; /* 아이콘은 가운데 */
    }

    자주 생기는 때하트·삭제·닫기(✕)처럼 아이콘만 있는 작은 버튼이 붙어 있을 때 생깁니다. 줄 끝의 삭제 버튼, 알림 닫기, 수량 조절 버튼이 흔한 곳입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    버튼이 너무 작아요, 옆 버튼이 대신 눌려요, 손가락으로 누르기 힘들어요, 터치 영역이 작아요, 엉뚱한 버튼이 눌려요, 아이콘 버튼이 작아요, 터치 타깃, 44px

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상품 목록의 '좋아요(하트)'와 '삭제(✕)' 아이콘 버튼이 24px로 작고 2px 간격으로 붙어 있어서, 폰에서 하트를 누르려다 삭제가 눌려. 원인은 누르는 영역이 손가락보다 작은 것일 가능성이 높으니, 아이콘 크기는 그대로 두고 두 버튼에 min-width: 44px; min-height: 44px;와 display: inline-grid; place-items: center;를 주어서 누르는 영역을 넓혀 줘. 버튼 사이 간격이 너무 벌어지지 않는지와 390px 폭에서 한 줄에 들어가는지 확인해 줘.

  • 아이폰에서 입력칸 누르면 화면이 확대돼요

    iPhone zooms into inputs

    아이폰 사파리에서 로그인·검색 입력칸을 누르면 화면이 갑자기 커지고 옆으로 밀려, 직접 손가락으로 줄여야 합니다. 안드로이드나 PC에서는 안 보입니다.

    폰 화면 흉내(아이폰의 확대 규칙을 흉내)고치기 전
    로그인다음

    '입력칸 누르기'로 화면이 확대되는지 보고, '고치기' 뒤에 다시 눌러 보세요. 확대는 흉내입니다.

    왜 그럴까요

    아이폰 사파리는 입력칸 글자가 16px보다 작으면 읽기 어렵다고 보고, 누를 때 화면을 확대합니다. 입력칸 글자를 16px 이상으로 하면 확대하지 않습니다. 확대 자체를 막는 viewport 설정은 눈이 나쁜 사람이 못 키우게 되므로 권하지 않습니다.

    이렇게 고쳐요

    input,
    select,
    textarea {
      font-size: 16px; /* 16px 미만이면 아이폰이 확대 */
    }
    /* maximum-scale=1 로 막는 방법은 피하세요 */

    자주 생기는 때입력칸 글자를 작게(14px 같은) 만든 폼에서 생깁니다. 좁은 화면에 맞추려고 작게 한 검색창, 로그인, 결제 입력칸에서 자주 보입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    입력칸 누르면 확대돼요, 아이폰에서 입력하면 줌 돼요, 사파리에서 화면이 커져요, 글자 치려는데 화면이 확대돼요, 키보드 올라오면 확대돼요, input 누르면 줌 인, font-size 16px, 자동 확대

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 로그인 입력칸을 아이폰 사파리에서 누르면 화면이 확대되고 옆으로 밀려. 원인은 입력칸 글자가 14px로 16px보다 작아서일 가능성이 높으니, input·select·textarea의 font-size를 16px 이상으로 올려서 확대가 일어나지 않게 고쳐 줘. 확대를 막으려고 viewport에 maximum-scale=1이나 user-scalable=no를 넣지는 말고, 글자가 커져도 입력칸이 한 줄에 맞는지와 placeholder 크기가 어색하지 않은지 확인해 줘.

  • PC는 멀쩡한데 폰에서 옆으로 밀려요

    Sideways scroll only on phones

    PC 브라우저에서는 괜찮은데 폰으로 보면 페이지가 옆으로 밀리거나 오른쪽에 빈 공간이 생깁니다. 어떤 요소가 화면보다 넓은지 눈으로는 찾기 어렵습니다.

    폰 화면 흉내(옆으로 밀리는 범인 찾기)고치기 전
    모모샵 이벤트
    가을맞이 전 상품 20% 할인 행사

    기간 안에 주문하면 무료로 보내 드려요.

    '범인 찾기'를 눌러 화면보다 넓은 요소를 찾고, '고치기'로 해결되는지 비교해 보세요. 폰 화면은 흉내입니다.

    왜 그럴까요

    폭을 픽셀로 고정한 요소는 화면이 좁아져도 줄어들지 않습니다. 가장 넓은 요소 하나가 페이지 전체를 옆으로 늘려 스크롤이 생깁니다. 먼저 범인을 찾고, 그 요소에 폭의 한도를 화면 폭(max-width: 100%)으로 걸어 줍니다.

    이렇게 고쳐요

    /* 1. 범인 찾기 (개발자 도구 콘솔에 붙여 넣기) */
    [...document.querySelectorAll("*")]
      .filter((el) =>
        el.getBoundingClientRect().right > innerWidth);
    
    /* 2. 한도 걸기 */
    .banner,
    img,
    table {
      max-width: 100%;
    }

    자주 생기는 때배너, 표, 코드 상자, 이미지에 폭을 픽셀로 고정(width: 600px 같은)했을 때 생깁니다. 좁은 폰에서만 터지고, 범인이 하나면 한 줄만 고쳐도 해결됩니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    폰에서 가로 스크롤이 생겨요, 모바일에서 화면이 옆으로 움직여요, 오른쪽에 빈 공간이 생겨요, 모바일에서만 삐져나가요, 가로 스크롤 범인 찾기, 모바일 레이아웃이 깨져요, 페이지가 좌우로 흔들려요, max-width 100%, overflow-x

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 PC에서는 괜찮은데 390px 폰 폭에서는 페이지에 가로 스크롤이 생기고 오른쪽에 빈 공간이 보여. 원인은 폭을 픽셀로 고정한 요소가 화면보다 넓은 것일 가능성이 높으니, 먼저 개발자 도구 콘솔에서 화면 오른쪽 끝(innerWidth)을 넘는 요소를 찾아 알려 주고, 찾은 요소(배너·이미지·표)에 max-width: 100%;를 주어서 화면 폭 안에 들어오게 고쳐 줘. body에 overflow-x: hidden을 덮어씌워 가리기만 하는 방식은 쓰지 말고, 320px부터 1440px까지 가로 스크롤이 없는지 확인해 줘.

  • 폰에서 한 번 눌러선 안 되고 두 번 눌러야 해요

    Needs two taps on phones

    폰에서 메뉴 이름을 한 번 누르면 아래 메뉴만 펼쳐질 뿐 이동하지 않고, 한 번 더 눌러야 이동합니다. PC에서는 마우스를 올리기만 해도 열려서 문제를 알아채기 어렵습니다.

    폰 화면 흉내(터치 규칙을 흉내)고치기 전
    상품
    • 신상품
    • 인기 상품

    지금 화면 홈

    터치 0번

    '상품 누르기'를 한 번 눌러 이동하는지 보고, '고치기' 뒤에 다시 눌러 보세요. 폰의 터치 규칙은 흉내입니다.

    왜 그럴까요

    손가락에는 '올려 두기'가 없어서, 폰 브라우저는 첫 번째 터치를 마우스를 올린 것으로 흉내 냅니다. 올리자 화면이 바뀌면(메뉴가 나타나면) 그 터치를 올리기로 쓰고 끝내므로, 이동은 한 번 더 눌러야 일어납니다. 올리면 여는 규칙은 마우스가 있는 기기에서만 쓰고, 메뉴는 누르면 여는 버튼으로 따로 만듭니다.

    이렇게 고쳐요

    /* 마우스가 있을 때만 올리면 열기 */
    @media (hover: hover) {
      .nav-item:hover .submenu {
        display: block;
      }
    }
    /* 누르면 열기는 모두에게 */
    .nav-item.is-open .submenu {
      display: block;
    }

    자주 생기는 때마우스를 올리면(hover) 하위 메뉴나 버튼이 나타나도록 만든 내비게이션과 상품 카드에서 생깁니다. 아이폰 사파리에서 특히 흔합니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    두 번 눌러야 돼요, 두 번 눌러야 이동해요, 첫 번째 터치에 안 눌려요, 한 번 누르면 메뉴만 열려요, 호버 메뉴가 모바일에서 이상해요, 아이폰에서 두 번 탭, 호버가 계속 남아 있어요, 터치에서 hover, 처음 누르면 반응이 없어요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상단 메뉴의 '상품'을 마우스로 올리면 하위 메뉴가 열리는데, 아이폰에서는 '상품'을 한 번 누르면 메뉴만 열리고 이동은 안 되어 두 번 눌러야 해. 원인은 폰이 첫 터치를 마우스 올리기(hover)로 쓰는 것일 가능성이 높으니, 올리면 열리는 규칙을 @media (hover: hover) 안으로 옮기고, 하위 메뉴는 '▾' 버튼을 눌러 열리게(aria-expanded 포함) 따로 만들어서 '상품' 글자는 한 번에 이동하게 고쳐 줘. 키보드로도 메뉴가 열리고 닫히는지, 메뉴 밖을 누르면 닫히는지 확인해 줘.

안 보이거나 깨져요

글자나 버튼이 배경에 묻히거나, 불러오는 동안 모양이 깨졌다가 돌아올 때입니다. 색의 짝과 불러오는 순서를 살펴봅니다.

  • 다크 모드에서 글자가 안 보여요

    Invisible text in dark mode

    폰이나 PC를 다크 모드로 바꾸면 카드 안 글자가 어두운 바탕에 묻혀 거의 안 보입니다. 라이트 모드에서는 멀쩡해서 만든 사람은 모릅니다.

    배송 안내 카드(다크 모드 흉내)고치기 전
    배송 안내

    주문 뒤 2~3일 안에 도착합니다.

    제주는 하루 더 걸려요

    '다크 모드로 바꾸기'를 눌러 글자가 사라지는지 보고, '고치기' 뒤에 비교해 보세요. 모드 전환은 흉내입니다.

    왜 그럴까요

    다크 모드가 되면 브라우저는 배경 같은 시스템 색을 어둡게 바꾸지만, 사람이 정해 둔 글자색은 그대로 둡니다. 한쪽만 정하면 짝이 깨져 어두운 바탕에 어두운 글자가 됩니다. 글자색과 배경색을 항상 짝으로 정하거나 둘 다 시스템 색에 맡기고, color-scheme으로 이 페이지가 어두운 모드를 지원한다고 알려 줍니다.

    이렇게 고쳐요

    :root {
      color-scheme: light dark;
    }
    .card {
      /* 둘 다 시스템 색: 같이 바뀝니다 */
      background: Canvas;
      color: CanvasText;
    }
    /* 또는 직접 짝으로 정하기 */
    @media (prefers-color-scheme: dark) {
      .card {
        background: #1e293b;
        color: #f1f5f9;
      }
    }

    자주 생기는 때글자색은 #1e293b 같은 값으로 고정했는데 배경은 지정하지 않았거나 시스템 색에 맡긴 곳에서 생깁니다. 입력칸, 표, 안내 상자, 가져다 쓴 위젯에서 자주 보입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    다크 모드에서 글씨가 사라져요, 야간 모드에서 글자가 안 보여요, 검은 바탕에 검은 글씨, 다크 모드에서 깨져요, 어두운 테마 글자색, prefers-color-scheme, color-scheme, 다크 모드에서 카드가 안 보여요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 폰을 다크 모드로 바꾸면 '배송 안내' 카드의 글자가 어두운 바탕에 묻혀 안 보여. 원인은 카드 글자색은 #1e293b로 고정했는데 배경은 시스템 색(Canvas)에 맡겨 다크 모드에서 어두워졌기 때문일 가능성이 높으니, 카드의 글자색과 배경색을 둘 다 시스템 색(background: Canvas; color: CanvasText;)으로 짝지어 주고 :root에 color-scheme: light dark;를 넣어서 두 모드에서 모두 읽히게 고쳐 줘. 링크·테두리·그림자 색도 다크 모드에서 어울리는지, 글자와 배경의 대비가 4.5:1 이상인지 확인해 줘.

  • 회색 글씨가 너무 안 보인대요

    Low contrast text

    연한 회색 보조 글씨나 안내 문구가 흰 바탕에서 흐릿해, 밝은 곳이나 시력이 약한 사람은 읽기 어렵다고 합니다. 내 눈에는 괜찮아 보여서 알아채기 어렵습니다.

    배송 안내 카드고치기 전
    모모 머그컵

    2024.01.17 배송 시작

    교환은 7일 안에 가능해요

    제주·도서산간은 하루 더

    대비 2.5 : 1

    '고치기'를 눌러 회색 글씨가 또렷해지고 대비 숫자가 4.5 : 1을 넘는지 보세요.

    왜 그럴까요

    글자와 바탕의 밝기 차이가 작으면 읽기 힘듭니다. 이 차이를 숫자(대비)로 재는 기준이 있고, 일반 글자는 4.5:1 이상(큰 글자는 3:1)이 권장입니다. 연한 회색 #9ca3af는 흰 바탕에서 2.5:1쯤이라 기준에 못 미칩니다. 글자색을 더 짙게 바꿔야 합니다.

    이렇게 고쳐요

    .hint {
      color: #4b5563; /* 흰 바탕에서 7.6:1 */
    }
    /* 확인: 개발자 도구에서 글자색을 누르면
       대비 숫자가 바로 나옵니다 */

    자주 생기는 때날짜·설명·입력칸 안내처럼 덜 중요한 글을 연하게 만들었을 때 생깁니다. 햇빛 아래 폰이나 낮은 밝기 화면에서 특히 안 보입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    연한 글씨가 안 보여요, 글자가 흐려요, 회색 글자가 안 보여요, 어르신이 글이 안 보인대요, 대비가 낮아요, 색 대비, 접근성 대비 검사, 4.5:1, 밝은 곳에서 안 보여요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상품 카드의 배송 날짜와 안내 문구가 연한 회색(#9ca3af)이라 흰 바탕에서 거의 안 보인다는 말을 들었어. 원인은 글자색과 바탕의 대비가 2.5:1쯤으로 기준(4.5:1)에 못 미치는 것일 가능성이 높으니, 보조 글씨 색을 #4b5563처럼 4.5:1 이상이 되는 색으로 바꿔 줘. 다른 곳의 연한 글씨와 입력칸 안내(placeholder)도 같은 기준으로 찾아 알려 주고, 비활성 버튼처럼 일부러 연하게 둔 곳은 예외로 남겨도 되는지 설명해 줘.

  • 버튼이 하얗게만 나와요

    Button shows up white

    파란 버튼을 만들었는데 흰 글자만 있고 버튼 몸통이 하얗게 비어 있거나 기본 회색 버튼처럼 나옵니다. 글자색이 흰색이면 흰 바탕에서는 아예 안 보입니다.

    구매 버튼 두 개고치기 전

    '고치기'를 눌러 흰 글자뿐이던 버튼 몸통에 색이 채워지는지 보세요.

    왜 그럴까요

    버튼 바탕색은 브라우저가 칠해 주던 것인데, 모양 초기화를 하면 그 기본 색도 함께 사라집니다. 이때 배경을 직접 지정하지 않았거나 변수가 없어서 값이 무효가 되면 배경은 투명이 되어, 흰 글자가 흰 바탕에 녹아듭니다. 배경색을 직접 적고, 변수는 대체 값을 함께 줍니다.

    이렇게 고쳐요

    .btn {
      appearance: none;
      border: 0;
      color: #fff;
      /* 변수는 대체 값과 함께 (오타 var(--brand-colr)였어요) */
      background: var(--brand-color, #0369a1);
    }

    자주 생기는 때글자색만 흰색으로 정하고 배경색을 빠뜨렸을 때, 또는 배경에 쓴 색 변수 이름(var(--brand-color))을 오타 내거나 정의하지 않았을 때 생깁니다. 기본 버튼 모양을 지우는 초기화(appearance: none) 뒤에도 자주 보입니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    버튼이 안 보여요, 버튼 색이 안 나와요, 흰 버튼만 보여요, 글자만 하얗게 나와요, 버튼 배경이 투명해요, 색 변수가 안 먹어요, background 안 먹힘, 버튼 스타일 초기화, appearance none

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 '구매하기' 파란 버튼이 흰 글자만 있고 버튼 몸통이 하얗게 비어 흰 바탕에서는 글자도 안 보여. 원인은 background에 쓴 색 변수 이름이 오타이거나 배경색을 따로 지정하지 않은 것일 가능성이 높으니, 버튼에 background: var(--brand-color, #0369a1);처럼 대체 값이 있는 배경색을 직접 적고 변수 이름이 정의된 것과 같은지 확인해서 고쳐 줘. appearance: none을 쓴 버튼이 더 있는지 찾아서 모두 배경·테두리·글자색이 빠짐없이 지정됐는지 알려 줘.

  • 새로고침하면 잠깐 깨졌다가 돌아와요

    Flash of unstyled content

    페이지를 열거나 새로고침하면 처음 한순간 글꼴과 모양이 다른 투박한 화면이 보이다가, 곧 제대로 된 모습으로 바뀌며 글이 아래로 밀립니다. 느린 연결에서 더 잘 보입니다.

    페이지 불러오기 흉내고치기 전
    모모샵 가을맞이 특가

    머그컵·접시를 최대 30% 싸게 만나 보세요.

    '다시 불러오기'를 눌러 글이 아래로 밀리는지 보고, '고치기' 뒤에 비교해 보세요. 느린 연결은 흉내입니다.

    왜 그럴까요

    글꼴과 이미지는 글보다 늦게 도착합니다. 그 사이 브라우저는 기본 글꼴과 빈 자리로 먼저 그리고, 도착하면 다시 그려서 글자 크기와 자리가 달라집니다. 대신 쓸 글꼴(fallback)을 원래 글꼴과 크기가 비슷하게 맞추고, 이미지 자리는 크기를 미리 잡아 두면 밀림이 줄어듭니다.

    이렇게 고쳐요

    @font-face {
      font-family: "Brand";
      src: url("brand.woff2") format("woff2");
      font-display: swap; /* 글자는 먼저 보여 주고 나중에 바꿈 */
    }
    @font-face {
      font-family: "Brand-fallback";
      src: local("Arial");
      size-adjust: 104%; /* 대신 쓸 글꼴을 비슷한 크기로 */
    }
    body { font-family: "Brand", "Brand-fallback", sans-serif; }
    .hero-img {
      aspect-ratio: 16 / 9; /* 자리를 미리 잡아 둠 */
      width: 100%;
    }

    자주 생기는 때웹 글꼴을 내려받는 사이트, 늦게 불러오는 CSS, 크기를 정하지 않은 이미지가 있는 페이지에서 생깁니다. 모바일 데이터로 열 때 더 눈에 띕니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    화면이 깜빡거려요, 처음엔 모양이 없다가 나타나요, 글꼴이 늦게 바뀌어요, 새로고침하면 글이 아래로 밀려요, 글자 모양이 바뀌었다가 돌아와요, 웹폰트 깜빡임, font-display, FOUC, 이미지 늦게 떠서 밀려요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 페이지를 새로고침하면 처음에 기본 글꼴과 이미지 없는 모습이 보였다가 웹 글꼴과 이미지가 도착하면 제목이 커지고 글이 아래로 밀려. 원인은 웹 글꼴이 늦게 도착하고 이미지 자리를 미리 잡지 않은 것일 가능성이 높으니, @font-face에 font-display: swap;을 주고 대신 쓸 글꼴에 size-adjust를 맞춰 글자 크기 차이를 줄이고, 대표 이미지에는 aspect-ratio나 width·height를 정해 자리를 미리 잡아 줘. 가장 중요한 글꼴은 preload로 먼저 부르는 것이 알맞은지, 느린 3G 환경으로 느리게 열어도 글이 밀리지 않는지 확인해 줘.

  • 이미지 자리에 엑박(깨진 그림)이 떠요

    Broken image

    사진이 있어야 할 자리에 작은 깨진 그림 아이콘(엑박)이나 alt 글자만 한 줄로 나옵니다. 사진 높이가 사라져 아래 글이 위로 끌려 올라오기도 합니다.

    상품 카드(그림 주소가 틀림)고치기 전
    모모 머그컵 사진모모 머그컵

    12,000원 · 내일 도착

    '고치기'를 눌러 자리가 잡히는지 보고, '올바른 그림 주소 넣기'로 진짜 해결과 비교해 보세요.

    왜 그럴까요

    브라우저가 이미지 주소에서 그림을 받지 못하면 그림 대신 깨진 그림 표시와 alt 글자를 보여 줍니다. 크기를 정하지 않았으면 이미지 높이도 알 수 없어 자리가 거의 0으로 줄어듭니다. 1순위는 주소(경로, 파일 이름의 대소문자, 확장자)를 바로잡는 것이고, 2순위는 그림이 늦거나 실패해도 자리가 무너지지 않게 크기와 배경색 자리표시, 뜻이 있는 alt를 정해 두는 것입니다.

    이렇게 고쳐요

    /* 1. 주소부터 확인: 개발자 도구 네트워크 탭에서
       이미지 요청이 404인지, 경로와 확장자가 맞는지 */
    img {
      display: block;
      width: 100%;
      aspect-ratio: 16 / 9; /* 자리를 미리 잡음 */
      object-fit: cover;
      background: #e2e8f0; /* 자리표시 색 */
    }
    /* alt="모모 머그컵 사진"처럼 무엇인지 적습니다 */

    자주 생기는 때이미지 주소를 잘못 적었거나, 파일을 지우거나 옮겼거나, 파일 이름의 대소문자·확장자가 다를 때 생깁니다. 크기를 정하지 않은 이미지는 그림이 안 올 때 자리까지 함께 무너집니다.

    다른 이름 · 헷갈리는 이웃
    다르게 부르는 말
    엑박, 이미지가 안 나와요, 사진이 깨져요, 그림 자리가 비어 있어요

    헷갈리는 이웃

    복사되는 부탁 문장

    내 화면에서 상품 카드의 사진 자리에 깨진 그림 아이콘(엑박)과 alt 글자만 나오고, 사진 높이가 사라져 아래 글이 위로 끌려 올라와. 원인은 이미지 주소가 틀리거나 파일이 없는 것일 가능성이 높으니, 먼저 개발자 도구 네트워크 탭에서 이미지 요청이 404인지 보고 올바른 경로와 확장자로 고쳐 줘. 그와 함께 그림이 안 와도 자리가 무너지지 않도록 이미지에 width: 100%; aspect-ratio: 16 / 9; object-fit: cover; background: #e2e8f0;를 주고, alt에 '모모 머그컵 사진'처럼 무엇인지 적어 줘. 이미지 불러오기에 실패했을 때 대신 보여 줄 그림이 필요한지도 알려 줘.

이럴 때 씁니다
  • 화면이 이상한데 CSS 용어를 몰라 무엇이라고 검색해야 할지 모를 때, 보이는 증상 그대로 찾고 싶을 때
  • AI 코딩 도구에 "내 화면이 이상해"가 아니라 증상·원인·고칠 방향이 담긴 수정 부탁을 하고 싶을 때
  • 고쳤는데 정말 고쳐졌는지, 고치기 전과 어떻게 다른지 눈으로 비교하고 싶을 때
  • 디자이너·기획자가 개발자에게 증상을 정확한 말로 전하고 싶을 때
사용법
  1. 분류(줄이 안 맞아요·상자 밖으로 삐져나가요·가려지거나 안 눌려요·이상한 틈이 생겨요·글자가 이상해요·스크롤이 이상해요·폰에서만 이상해요·안 보이거나 깨져요)에서 증상을 고르거나, 사전 첫 화면 검색에 "클릭이 안"처럼 일상 말을 적습니다.
  2. 예시 상자는 고장 난 모습으로 시작합니다. 고치기를 눌러 고친 CSS가 적용된 모습과 비교하고, 상태 줄에서 무엇이 달라졌는지 읽습니다. 화면에 들어오면 손가락 표시가 대신 눌러 보여 줍니다.
  3. 왜 그럴까요로 원인을, 이렇게 고쳐요로 고치는 CSS를 확인하고, AI 부탁 문장 복사를 눌러 AI나 개발자에게 붙여넣습니다. 이름·색·숫자는 내 화면에 맞게 고칩니다.
꼭 알아둘 점
  • 증상을 찾는 사전이므로 같은 모양의 문제도 원인이 여럿일 수 있습니다. 여기 적은 원인은 가장 흔한 것이고, 내 화면에서는 개발자 도구로 눌러서 어떤 요소가 있는지 확인한 뒤 고칩니다.
  • 예시는 모두 작은 상자 안에 가둔 지어낸 화면입니다. 고친 뒤의 CSS는 카드에 적힌 코드와 같은 내용이며, 선택자 이름(.box, .card 등)은 내 화면의 이름으로 바꿔 씁니다.
  • -webkit-line-clamp처럼 앞에 접두어가 붙은 속성도 오늘날 모든 주요 브라우저가 지원하는 방식이라 그대로 쓰는 것이 흔합니다.
  • 폰 화면 틀, 휠 스크롤, 다크 모드, 느린 연결을 쓰는 예시는 실제 기기의 동작을 흉내 낸 것이며 예시와 상태 줄에 "흉내"라고 적었습니다. 실제 아이폰·안드로이드에서는 내 기기로 한 번 더 확인하세요.
자주 묻는 질문
가운데 정렬은 왜 가로만 되고 세로는 안 되나요?
text-align: center는 글자를 가로로 옮기는 속성입니다. 세로 가운데는 상자를 flex나 grid로 만들어 align-items: center를 주는 것이 가장 단순합니다.
z-index를 높여도 안 먹히는 이유가 뭔가요?
z-index는 같은 층 안에서만 순서를 겨룹니다. 부모가 position·transform 등으로 자기만의 층을 만들었다면 숫자를 키우지 말고 부모의 순서를 올리거나 팝업을 층 밖으로 옮겨야 합니다.
버튼이 눌리지 않을 때 가장 먼저 무엇을 보나요?
개발자 도구에서 버튼 위에 마우스를 올려 어떤 요소가 잡히는지 봅니다. 버튼이 아닌 다른 요소가 잡히면 그 요소가 클릭을 가로채는 것입니다.
overflow: hidden을 쓰면 안 되나요?
쓸 수 있습니다. 다만 그 안의 팝업·메뉴·그림자도 함께 잘립니다. 모서리를 둥글게 자르는 용도라면 안쪽 이미지에만 border-radius를 주는 것이 안전합니다.
말줄임(…)은 한 줄과 여러 줄이 방법이 다른가요?
한 줄은 white-space: nowrap; overflow: hidden; text-overflow: ellipsis;를 씁니다. 여러 줄은 이 사전의 line-clamp 방식을 씁니다.
스크롤이 두 개 생기거나 아예 안 생길 때는 어디를 보나요?
스크롤은 높이가 정해진 상자 한 곳이 맡게 합니다. 바깥 틀은 overflow: hidden으로 두고, 안쪽 칸에 flex: 1; min-height: 0; overflow: auto;를 줍니다.
폰에서만 이상할 때 가장 먼저 무엇을 보나요?
PC 브라우저의 기기 모드로 폭을 390px로 줄여 보고, 가로 스크롤이 생기면 화면 폭보다 넓은 요소를 찾습니다. 주소창·확대·두 번 눌러야 하는 증상은 실제 폰에서만 나타나기도 하므로 내 폰으로 한 번 확인합니다.

광고