~ / posts / developer
smith@lab:~/posts$ cat developer/css-border-radius-circle-pill-blob.md

CSS border-radius 값 읽는 법, 원·알약·블롭 모양과 반지름이 줄어드는 규칙

버튼 모서리를 둥글게 하려고 border-radius: 8px를 쓰는 건 누구나 하지만, 값이 두세 개 이상 들어가거나 %와 슬래시가 나오면 갑자기 헷갈려요. 결론부터 말하면 border-radius는 왼쪽 위에서 시작해 시계 방향(왼쪽 위 → 오른쪽 위 → 오른쪽 아래 → 왼쪽 아래)으로 읽고, 슬래시 앞은 가로 반지름, 뒤는 세로 반지름이에요. 그리고 한 변에서 양 끝 모서리의 반지름 합이 그 변 길이를 넘으면 브라우저가 모든 반지름을 같은 비율로 줄여 그려요.

이 두 가지만 알면 원, 알약 버튼, 위만 둥근 카드, 물방울(블롭) 모양까지 한 줄로 만들 수 있어요. 아래에서 읽는 법, 모양별 값, 줄어드는 규칙을 숫자로 계산해 보고, 마지막에 실수하기 쉬운 부분을 정리했어요. 값을 바꿔 가며 미리 보려면 CSS border-radius 생성기를 열어 두고 따라 해 보세요.

광고

border-radius는 네 속성의 줄임 표기예요

border-radius는 border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius 네 속성을 한꺼번에 쓰는 줄임 속성이에요. 줄임 표기에서 값을 몇 개 쓰느냐에 따라 의미가 달라져요. 속성 정의와 문법은 MDN의 border-radius 문서에 정리돼 있어요.

값 개수예시의미
1개8px네 모서리 모두 8px
2개10px 20px왼쪽 위·오른쪽 아래 10px, 오른쪽 위·왼쪽 아래 20px
3개10px 20px 30px왼쪽 위 10px, 오른쪽 위·왼쪽 아래 20px, 오른쪽 아래 30px
4개10px 20px 30px 40px왼쪽 위, 오른쪽 위, 오른쪽 아래, 왼쪽 아래 순서

외우기 쉬운 방법은 margin, padding과 같은 방식이라는 거예요. 위에서 시작해 시계 방향으로 돌고, 값이 모자라면 반대편 값을 가져와요. 다만 margin은 위·오른쪽·아래·왼쪽 변이지만 border-radius는 모서리라서 시작점이 왼쪽 위 모서리라는 점만 달라요.

그림으로 보는 네 가지 모양

border-radius 값 하나로 만든 카드, 원, 알약, 블롭 네 가지 모양과 각각의 코드
같은 사각형도 border-radius 값에 따라 모양이 크게 달라져요

모양별 코드를 정리하면 아래와 같아요.

모양조건코드
둥근 카드어떤 크기든border-radius: 12px;
원너비와 높이가 같은 요소border-radius: 50%;
타원너비와 높이가 다른 요소border-radius: 50%;
알약반지름이 높이의 절반 이상높이 60px이면 border-radius: 30px;
위만 둥근 탭·바텀시트아래 두 모서리는 0border-radius: 16px 16px 0 0;
말풍선한 모서리만 작게border-radius: 18px 18px 18px 2px;

px와 %는 무엇이 다른가요

px는 상자 크기와 상관없이 고정된 반지름이에요. 카드나 버튼에서 모서리 느낌을 일정하게 유지하고 싶을 때 쓰죠. %는 상자 크기에 비례하는데, 가로 반지름은 상자 너비 기준, 세로 반지름은 상자 높이 기준이에요.

그래서 200×100px 상자에 border-radius: 50%를 주면 모서리마다 가로 반지름 100px, 세로 반지름 50px의 타원호가 만들어지고, 상자 전체가 타원이 돼요. 가로 방향으로는 양 끝 반지름 합이 200px로 너비와 같고, 세로 방향으로는 50 + 50 = 100px로 높이와 같아서 딱 맞아요. 같은 코드를 정사각형에 쓰면 원이 되는 이유도 같아요.

반지름이 너무 크면 줄어들어요 — 직접 계산해 보기

값을 크게 줬는데 모양이 더 둥글어지지 않는 경우가 있어요. 한 변에서 양 끝 모서리의 반지름 합이 변 길이보다 크면, 브라우저가 모든 모서리의 반지름을 같은 비율 f로 줄여서 맞춰요. CSS 명세(W3C CSS Backgrounds and Borders Module Level 3)는 각 변에서 변 길이 ÷ 반지름 합을 구한 값 중 가장 작은 값을 f로 쓰도록 정하고 있어요. f가 1보다 작을 때만 줄어들고, 줄어든 뒤에는 네 모서리가 모두 같은 비율로 작아져요.

가장 쉬운 예는 100×100px 상자예요. 모서리를 80px로 주면 위쪽 변의 반지름 합이 160px로 변 길이 100px보다 커요. f = 100 ÷ 160 = 0.625이므로 실제 반지름은 80 × 0.625 = 50px이고, 결국 원이 돼요. 반지름을 20, 40, 50, 60, 80px로 바꿔 가며 실제 적용 값을 계산하면 이렇게 돼요.

100×100px 상자에서 입력한 반지름과 실제 적용되는 반지름
입력한 값실제 적용
02040608020px · 입력한 값 20px20px · 실제 적용 20px20px40px · 입력한 값 40px40px · 실제 적용 40px40px50px · 입력한 값 50px50px · 실제 적용 50px50px60px · 입력한 값 60px60px · 실제 적용 50px60px80px · 입력한 값 80px80px · 실제 적용 50px80px

50px 이상으로 키워도 더 둥글어지지 않아요. 한계는 변 길이의 절반이에요.

단위: px · 자료: 직접 계산 (f = min(1, 100 ÷ (2 × 입력값)))
표로 보기
구분입력한 값실제 적용
20px2020
40px4040
50px5050
60px6050
80px8050

알약 버튼도 같은 원리예요. 200×60px 상자에서 반지름을 바꿔 보면 아래처럼 30px 이후에는 달라지지 않아요.

200×60px 알약 상자의 입력 반지름과 실제 반지름
051015202530102030406010010 · 실제 적용 10px20 · 실제 적용 20px30 · 실제 적용 30px40 · 실제 적용 30px60 · 실제 적용 30px100 · 실제 적용 30px30

높이 60px의 절반인 30px에서 완전한 반원이 돼요.

단위: px · 자료: 직접 계산 (세로 방향 합 2r이 60을 넘으면 f = 60 ÷ 2r)
표로 보기
구분실제 적용
1010
2020
3030
4030
6030
10030

그래서 높이를 모르거나 높이가 바뀌는 버튼에 border-radius: 9999px를 쓰면 언제나 양 끝이 반원인 알약이 돼요. 9999px를 쓴 높이 60px 버튼은 f = 60 ÷ 19998이 되어 실제로는 약 30px로 계산돼요.

한 변만 넘쳐도 네 모서리가 전부 줄어요

함정은 f가 한 변에서만 정해져도 네 모서리 전체에 적용된다는 점이에요. 100×100px 상자에서 왼쪽 위 70px, 오른쪽 위 50px, 나머지는 0이면 위쪽 변의 합이 120px예요. f = 100 ÷ 120 ≈ 0.8333이라서 70px는 약 58.3px, 50px는 약 41.7px로 줄어요. 의도한 70px 곡선이 나오지 않아 당황스러울 수 있는데, 이때는 위쪽 변의 합이 변 길이를 넘는지부터 확인하세요.

가로·세로를 따로 주는 슬래시 문법과 블롭

모서리를 원이 아닌 타원호로 만들 때 슬래시를 써요. border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%는 슬래시 앞 네 값이 가로 반지름, 뒤 네 값이 세로 반지름이에요. 200×200px 상자라면 왼쪽 위 모서리는 가로 120px, 세로 120px이고, 오른쪽 위는 가로 80px, 세로 60px이에요.

각 변의 합을 보면 위쪽 가로 60 + 40 = 100%, 아래쪽 가로 30 + 70 = 100%, 왼쪽 세로 60 + 40 = 100%, 오른쪽 세로 30 + 70 = 100%예요. 마주 보는 두 모서리의 합이 100%가 되게 맞추면 줄어드는 일 없이 곡선이 변 전체를 부드럽게 채워서 자연스러운 물방울 모양이 돼요. 합이 100%를 넘기면 f가 줄어들어서 오히려 밋밋해져요. 이 방식으로 만든 블롭에 CSS 그라데이션을 입히면 배경 장식으로 쓰기 좋아요.

실무에서 자주 하는 실수

자주 묻는 질문

border-radius 순서가 왜 왼쪽 위부터인가요?

margin, padding처럼 시계 방향으로 읽는 CSS 줄임 표기의 관례를 따르고, 시작점이 위쪽 변의 왼쪽 끝이라 왼쪽 위 모서리부터 시작해요. 값이 모자라면 반대편 모서리의 값을 가져와요.

원을 만들었는데 타원이 나와요.

50%는 너비와 높이에 각각 비례해서 계산되기 때문이에요. 너비와 높이가 같을 때만 원이 돼요. 너비와 높이가 다를 수 있는 요소에 항상 원을 만들고 싶다면 aspect-ratio: 1로 비율을 고정하세요.

알약 버튼에 9999px를 써도 되나요?

괜찮아요. 위에서 계산했듯이 반지름이 너무 크면 브라우저가 변 길이에 맞게 줄여 주기 때문에 양 끝이 반원인 알약이 돼요. 높이가 바뀌는 버튼에서 특히 편해요.

슬래시가 들어간 값은 언제 쓰나요?

모서리를 원호가 아닌 타원호로 만들 때 써요. 블롭 모양, 비대칭 말풍선, 알약과 비슷하지만 끝이 살짝 납작한 모양을 만들 때 유용해요.

border-radius를 0으로 되돌리려면요?

border-radius: 0을 쓰면 직각이 돼요. 0은 단위를 생략할 수 있어요. 아래만 직각이고 위만 둥글게 하려면 16px 16px 0 0처럼 필요한 모서리만 값을 줘요.

정리

border-radius는 왼쪽 위에서 시계 방향으로 읽고, 슬래시 앞뒤로 가로·세로 반지름을 나눠 쓴다는 두 가지가 핵심이에요. 모양별로는 정사각형 50%가 원, 높이 절반 이상이 알약, 마주 보는 모서리의 합이 100%인 가로·세로 값이 블롭이에요. 값을 크게 줘도 변 길이를 넘으면 f만큼 줄어드니 의도한 모양이 안 나오면 합부터 확인하세요. 값을 바꿔 가며 눈으로 확인하려면 CSS border-radius 생성기를 쓰고, 반응형 값은 CSS clamp() 계산기와 함께 쓰면 좋아요.

참고한 자료

#css border-radius#border-radius 순서#css 원 만들기#css 알약 버튼#border-radius 슬래시#css 블롭#border-radius 퍼센트#둥근 모서리 css
← 이전 글px rem em 차이, 언제 무엇을 쓰나와 px→rem 변환표 총정리다음 글 →CSS clamp() 반응형 글자 크기 공식, 최소·최대 폭으로 값 계산하는 법

더 둘러보기

💻 개발자 다른 도구

🔥 많이 찾는 도구

🔮 재미로 한 번 더

📝 읽어 볼 만한 글

글 전체 보기 →