CSS Box Model
1. CSS Box Model: 웹 레이아웃의 기초
CSS Box Model은 웹 페이지 레이아웃의 근간을 이루는 중요한 개념입니다. 모든 HTML 요소는 하나의 '박스'로 취급되며, 이 박스는 콘텐츠, 패딩, 테두리, 마진으로 구성됩니다. Box Model을 이해하면 웹 페이지의 구조를 더 정확하게 제어할 수 있습니다.
처음 레이아웃을 잡을 때 이 박스 모델을 그려보는 것이 중요합니다. 이 박스 모델을 그리면서 데이터를 어떻게 구조화 하고, 그에 알맞은 태그는 무엇인지 생각해보아야 합니다.
앞서 말씀드린 것처럼 이러한 박스모델은 요소, 패딩, 테두리, 마진으로 구성되어 있습니다.
- 요소: 텍스트, 사진 등 보여줄 대상입니다.
- 패딩: 요소 주변 영역을 감쌉니다.
- 테두리: 요소와 패딩을 감싸는 테두리입니다
- 마진: 테두리 밖의 영역을 감쌉니다.
주의: Box Model은 기본적으로 블록 레벨 요소에 완전히 적용됩니다. 인라인 요소는 width, height, 상하 마진 값이 적용되지 않습니다.
1.1 width
요소의 너비를 설정합니다. 기본값은 콘텐츠 영역의 너비이지만 box-sizing
속성을 사용하여 테두리 영역까지 포함할 수 있습니다. 너비를 입력하지 않으면 auto
로 브라우저가 계산하여 지정을 합니다. 이때, 부모 요소의 너비를 기준으로 계산하여 가득 채웁니다.
auto
: 기본값. 브라우저가 계산하여 지정(요소의 부모 크기 기준으로 가득 채우기)min-content
: 최소 너비max-content
: 컨텐츠 내용의 선호 너비fit-content
: min(max-content, max(min-content, 길이값))
fit-content 이해하기
- 기본적으로 내용물의 본질적인 크기(intrinsic size)를 사용하려고 합니다. 이는 max-content와 유사합니다.
- 그러나 사용 가능한 공간이 max-content 크기보다 작다면, 요소는 사용 가능한 공간만큼 줄어듭니다. 이 때 내용물은 필요에 따라 줄 바꿈됩니다.
- 요소의 크기는 절대 min-content보다 작아지지 않습니다. 즉, 가장 긴 단어나 대체 불가능한 인라인 요소의 크기를 유지합니다.
이미지와 아래 코드를 비교해서 살펴보세요.
1.2 height
요소의 높이를 설정합니다. 입력하지 않으면 auto
로 브라우저가 계산하여 지정을 합니다. 이때, width와는 다르게 content의 높이만큼만 설정됩니다.
아래 예제에서 넓이와 높이를 각각 auto로 변경해보세요.
1.3 padding
패딩은 콘텐츠 주변의 여백을 만듭니다. 이 여백은 border 안쪽 여백입니다. padding
속성은 단축 속성으로, 네 방향의 패딩을 한 번에 지정할 수 있습니다. 작성 순서는 시계방향으로 top
, right
, bottom
, left
입니다. 순서대로 padding-top
, padding-right
, padding-bottom
, padding-left
이며 개별 속성을 사용할 수도 있습니다.
p {
padding: 10px; /* top, right, bottom, left 모두 10px */
padding: 10px 20px; /* top, bottom :10px, left, right:20px */
padding: 10px 20px 30px; /* top:10px, left,right:20px, bottom:30px */
padding: 10px 20px 30px 40px;
}
p {
padding: 10px; /* top, right, bottom, left 모두 10px */
padding: 10px 20px; /* top, bottom :10px, left, right:20px */
padding: 10px 20px 30px; /* top:10px, left,right:20px, bottom:30px */
padding: 10px 20px 30px 40px;
}
1.4 margin
마진은 요소 주변의 여백을 만듭니다. 마진은 border 바깥 여백입니다. margin
속성은 단축 속성으로, 네 방향의 마진을 한 번에 지정할 수 있습니다. 작성 순서는 시계방향으로 top
, right
, bottom
, left
입니다. 순서대로 margin-top
, margin-right
, margin-bottom
, margin-left
이며 개별 속성을 사용할 수도 있습니다.
이 마진을 사용해서 요소를 배치할 수도 있습니다.
- 가운데 배치
- 오른쪽 배치
1.4.1 마진병합 현상(Margin Collapsing)
마진 병합은 CSS에서 인접한 요소들 사이에서 마진이 중첩될 때 일어나는 현상입니다.
-
인접 요소 간 마진 병합 인접한 요소들의 상하 마진이 만날 때, 더 큰 값의 마진만 적용되는 현상입니다.
두 박스 사이의 실제 간격은 50px입니다. 더 큰 값인 50px이 적용되었습니다.
- 부모-자식 요소 간 마진 병합 자식 요소의 상하 마진이 부모 요소의 상하 마진과 병합되는 현상입니다.
자식 요소의 상단 마진이 부모 요소의 상단과 병합됩니다. 결과적으로 부모 요소가 마진을 가진 것처럼 보입니다.
부모 요소의 상하 마진값은 어떻게 되나요? 부모 요소에 border가 적용된 경우에 부모 요소에 마진값이 적용된 것처럼 보이지만, 실제로는 자식 요소의 마진이 부모 요소를 "밀어내는" 것입니다. 그림과 아래 코드를 비교해보세요.
마진 병합 현상 해결 방법 5가지
- 부모 요소에 overflow: auto; 속성 적용
- 부모 요소에 display: inline-block; 적용
- 부모 요소에 border 추가
- 부모 요소에 padding 추가
- 부모 요소에 display: flow-root; 적용 (IE 미지원)
🍯 팁: 마진 병합 현상을 해결할 필요 없이, 마진 병합 현상을 이해하고 현상이 일어나지 않도록 작업을 진행하면 됩니다!
1.5 border
요소의 테두리를 지정합니다. 테두리는 요소가 차지하는 전체 너비, 높이의 일부입니다. 단축속성입니다. 다만 이렇게 되었을 때 일부 CSS에서 계산하기 어려운 경우가 있는데 이 경우에는 box-sizing
속성을 사용하여 테두리를 포함하도록 설정할 수 있습니다.
이 속성은 선의 두께, 스타일, 색상을 지정할 수 있는 단축속성입니다. 세부적인 속성은 아래와 같습니다.
border-width
border-style
border-color
- border-width
- border-top-width
- border-right-width
- border-bottom-width
- border-left-width
- border-style
- border-top-style
- border-right-style
- border-bottom-style
- border-left-style
- border-color
- border-top-color
- border-right-color
- border-bottom-color
- border-left-color
- border-width
- border-image border-image - CSS: Cascading Style Sheets | MDN
1.6 box-sizing
box-sizing
속성은 요소의 총 너비와 높이를 계산하는 방식을 지정합니다. 기본값은 content-box
입니다. border-box
로 설정하면 테두리와 패딩을 포함하여 요소의 총 너비와 높이를 계산합니다. 정리를 하면 아래와 같습니다.
content-box
: 기본값. width, height에 border, padding 포함하지 않음.border-box
: width, height에 border, padding 포함.
이 박스의 넓이는 몇일까요? width 100px + padding 20px _ 2 + border 30px _ 2를 해서 200px이 됩니다.
이 코드에서 주석을 풀어 box-sizing
속성을 border-box
로 설정하면 우리가 지정해준 width 값인 100px이 박스의 너비가 됩니다.
1.7 overflow
요소의 콘텐츠가 그 요소의 크기를 초과할 때 어떻게 처리할지를 지정합니다. 이 속성은 블록 레벨 요소에 주로 적용되며, 내용이 넘칠 때 스크롤바를 표시하거나 내용을 잘라내는 등의 동작을 제어합니다.
visible
: 기본값으로, 내용이 요소의 박스 밖으로 넘쳐도 그대로 표시됩니다.hidden
: 넘치는 내용을 잘라내어 보이지 않게 합니다.scroll
: 항상 스크롤바를 표시하여 넘치는 내용을 스크롤할 수 있게 합니다.auto
: 내용이 넘칠 경우에만 스크롤바를 표시합니다.
1.7.1 overflow-x와 overflow-y
overflow-x와 overflow-y 속성을 사용하면 가로와 세로 방향의 오버플로우를 독립적으로 제어할 수 있습니다.
1.8 border-radius
border-radius
속성을 사용하면 요소의 모서리를 둥글게 만들 수 있습니다. 이 또한 단축 속성이며 자세한 속성은 아래와 같습니다.
border-top-left-radius
border-top-right-radius
border-bottom-right-radius
border-bottom-left-radius
1.8.1 [실습] 아래의 모양의 박스를 그려보세요!
1.9 background
요소의 배경을 설정하는 강력한 단축 속성입니다. 이 속성을 통해 배경 색상, 이미지, 반복, 위치 등 다양한 배경 관련 스타일을 한 번에 지정할 수 있습니다. 주요 개별 속성들은 아래와 같습니다.
background-color
: 배경 색상을 설정background-image
: 배경 이미지를 설정background-repeat
: 배경 이미지의 반복 방식을 설정background-position
: 배경 이미지의 위치를 설정background-size
: 배경 이미지의 크기를 설정background-attachment
: 배경 이미지의 스크롤 여부를 설정background-clip
: 배경이 요소의 어느 영역까지 차지할지 지정background-origin
: 배경 이미지의 원점(시작점)을 설정
1.9.1 background-repeat
repeat
: 가로와 세로로 반복 (기본값)no-repeat
: 반복하지 않음repeat-x
: x축(가로)으로만 반복repeat-y
: y축(세로)으로만 반복space
: 이미지를 반복하되, 이미지 사이에 균등한 간격을 두고 반복.round
: 이미지를 반복하되, 요소의 크기에 맞게 이미지를 늘리거나 줄여 빈 공간이 생기지 않도록 반복
1.9.2 background-size
contain
: 이미지가 잘리거나 찌그러지지 않는 한도 내에서 최대한 크게 설정합니다. 여백이 발생할 수 있습니다.cover
: 이미지가 찌그러지지 않는 한도 내에서 요소를 완전히 덮도록 설정합니다. 이미지의 일부가 잘릴 수 있습니다.- 별도 크기 지정: background-size: 100%; 또는 background-size: 100px 400px;와 같이 직접 크기를 지정할 수 있습니다.
1.9.3 background-attachment
scroll
: 기본값. 요소와 함께 스크롤됩니다.fixed
: 뷰포트에 고정되어 스크롤되지 않습니다. 모바일 기기에서는fixed
배경이 예상대로 작동하지 않을 수 있으므로 반응형 디자인 시 주의가 필요합니다.
1.9.4 background-clip
border-box
: 테두리까지 배경이 차지합니다. (기본값)padding-box
: 안쪽 여백까지만 배경이 차지합니다.content-box
: 콘텐츠 영역만 배경이 차지합니다.
1.9.5 background-origin
border-box
: 테두리의 왼쪽 위 모서리를 기준으로 합니다.padding-box
: 안쪽 여백의 왼쪽 위 모서리를 기준으로 합니다. (기본값)content-box
: 콘텐츠 영역의 왼쪽 위 모서리를 기준으로 합니다.
주의: background-attachment: fixed;가 설정된 경우, background-origin은 무시되고 background-clip이 적용됩니다.
1.9.6 그라디언트 배경
CSS를 사용하여 그라디언트 배경을 만들 수 있습니다. 온라인 도구를 사용하면 쉽게 그라디언트를 생성할 수 있습니다.
CSS Gradient Generator웹페이지에 이미지를 넣을 때 태그와 CSS background 속성 중 선택해야 합니다:
이미지가 콘텐츠의 일부이거나 의미가 있다면 태그를 사용하세요. 순수하게 장식 목적이라면 CSS background를 사용하세요.
background는 단축 속성입니다. 개별 속성을 지정할 때는 단축 속성 이후에 작성해야 합니다:
/* 올바른 사용 */
div {
background: skyblue url(img/bg.jpg) no-repeat 50% 50% / cover;
background-clip: padding-box;
}
/* 잘못된 사용 예 */
div {
background-clip: padding-box;
background: skyblue url(img/bg.jpg) no-repeat 50% 50% / cover; /* 이전 속성을 덮어씁니다 */
}
/* 올바른 사용 */
div {
background: skyblue url(img/bg.jpg) no-repeat 50% 50% / cover;
background-clip: padding-box;
}
/* 잘못된 사용 예 */
div {
background-clip: padding-box;
background: skyblue url(img/bg.jpg) no-repeat 50% 50% / cover; /* 이전 속성을 덮어씁니다 */
}
1.10 box-shadow
요소에 그림자 효과를 추가합니다. 이 속성은 여러 값을 조합하여 다양한 그림자 효과를 만들 수 있습니다.
- 구문:
box-shadow: offset-x offset-y blur-radius spread-radius color;
offset-x
: 그림자의 수평 오프셋. 양수는 오른쪽, 음수는 왼쪽으로 이동.offset-y
: 그림자의 수직 오프셋. 양수는 아래쪽, 음수는 위쪽으로 이동.blur-radius
: 그림자의 흐림 정도. 값이 클수록 더 흐릿해집니다.spread-radius
: 그림자의 크기. 양수는 그림자를 확장, 음수는 축소.color
: 그림자의 색상.
1.11 opacity
요소의 불투명도를 설정합니다. 0(완전 투명)부터 1(완전 불투명) 사이의 값을 사용합니다.
주의 사항
- opacity를 사용할 때 텍스트의 가독성을 고려해야 합니다.
- opacity는 요소와 그 자식 요소 모두에 적용됩니다. 배경만 투명하게 하려면 rgba() 색상 값을 사용하는 것이 좋습니다.
box-shadow
와 opacity
속성들을 활용하면 요소에 깊이감을 주거나 시각적 계층을 만들 수 있습니다. box-shadow
는 요소를 돋보이게 하거나 입체감을 줄 때 유용하고, opacity는 오버레이 효과나 요소의 강조/비강조를 표현할 때 사용할 수 있습니다.