CSS의 박스 모델이란 무엇인지 알아보자.
CSS의 Box Model은 웹 페이지 레이아웃의 근간을 이루는 중요한 개념이라고 할 수 있다.
모든 HTML 요소는 하나의 '상자'와 같이 취급되고, 이런 수많은 상자들이 모여 웹 페이지가 된다.
여기서 말하는 상자는 그저 하나의 네모가 아니며, 여러가지 값으로 구성된다.
가장 안쪽에 자리하는 콘텐츠 영역으로, 텍스트나 사진 등을 말한다.
요소를 감싸는 주변 영역으로, 내부 여백이라고 할 수 있다.
패딩을 감싸는 테두리를 말한다.
테두리 밖의 영역으로, 외부 여백이라고 할 수 있다.
위의 박스 모델 값을 설정하기 위한 스타일 속성을 알아보자.
요소의 너비를 설정한다.
기본적으로는 요소(element)의 너비를 말하지만, box-sizing
속성을 사용하여 너비 기준을 바꿀 수 있다.
기본값으로, 브자우저가 계산을 하여 지정한다.
일반적으로 부모 요소의 크기를 가득 채운다.
p {
width: auto;
}
콘텐츠가 넘치지 않는 선에서 요소가 가질 수 있는 최소 너비이다.
줄바꿈이 가능한 지점을 기준으로 가장 압축된 너비를 찾으며,가장 긴 단어의 너비에 맞춰진다.
p {
width: min-content;
}
콘텐츠가 차지할 수 있는 가장 넓은 너비이다.
줄바꿈 없이 한 줄에 모든 콘텐츠를 배치했을 때의 너비와 같다.
만약 줄바꿈 없이 내용이 무지하게 길다면 부모의 너비보다 넘칠 수 있다. (overflow)
p {
width: max-content;
}
min-content
와 max-content
를 함께 활용하는 값이다.
최대 max-content
, 최소 min-content
까지의 너비를 가진다.
유동적인 너비를 가질 수 있다.
p {
width: fit-content;
}
min ( max-content, max ( min-content, 길이값 ) )
요소의 높이를 설정한다.
기본값은 auto
로, 콘텐츠의 요소의 높이만큼 설정된다.
p {
width: 100px;
height: auto;
backgroung-color: red;
}
요소 주변의 여백으로, 테두리 안쪽의 여백을 설정한다.
패딩은 top, right, bottom, left 네가지의 속성값이 있다.
각각의 속성은 요소를 기준으로 상하좌우의 여백을 담당한다.
p {
padding-top: 10px;
padding-right: 20px;
padding-bottom: 30px;
padding-left: 40px;
}
padding
이라는 속성을 이용하여 위의 4가지 값을 한번에 지정할 수 있다.
이때 작성하는 값의 개수에 따라 적용되는 모습이 다르게 나타난다.
이때 적용되는 순서는 위에서 시계방향이다.
네 면이 동일하게
값을 하나만 작성하는 경우 상하좌우 네 면이 동일한 값으로 적용된다.
p {
padding: 10px; /* top, right, bottom, left 모두 10px */
}
상하, 좌우
값을 두개만 작성하는 경우 첫 값은 상하, 두번째 값은 좌우여백으로 적용된다.
p {
padding: 10px 20px; /* top, bottom :10px, left, right:20px */
}
상, 우좌, 하
값을 세개만 작성하는 경우 첫 값은 상, 두번째 값은 좌우, 세번째 값은 하 여백으로 적용된다.
p {
padding: 10px 20px 30px; /* top:10px, left,right:20px, bottom:30px */
}
상, 우, 하, 좌
값을 네개 작성하는 경우 첫 값은 상, 두번째 값은 좌, 세번째 값은 하, 네번째 값은 우 여백으로 적용된다.
p {
padding: 10px 20px 30px 40px;
}
요소의 테두리를 설정한다.
테두리는 요소가 차지하는 전체 너비, 높이의 일부로 인식되며 box-sizing 속성을 사용하여 테두리를 포함하도록 설정할 수 있습니다.
테두리는 두께(width), 스타일(style), 색상(color) 등 속성의 단축속성이다.
또한 각 속성 역시 단축 속성으로 사용된다.
테두리의 두께를 나타내는 속성으로 상하좌우의 값을 지정할 수 있다.
단축 속성으로 사용이 가능하며, 아래와 같이 각 값을 따로 지정할 수도 있다.
p {
border-top-width: 1px;
border-right-width: 3px;
border-bottom-width: 5px;
border-left-width: 7px;
border-style: solid;
border-color: black;
}
테두리의 형식을 나타내는 속성으로 상하좌우의 값을 지정할 수 있다.
단축 속성으로 사용이 가능하며, 아래와 같이 각 값을 따로 지정할 수도 있다.
p {
border-width: 3px;
border-top-style: solid;
border-right-style: dashed;
border-bottom-style: dotted;
border-left-style: double;
border-color: #3498db;
}
테두리의 색상을 나타내는 속성으로 상하좌우의 값을 지정할 수 있다.
단축 속성으로 사용이 가능하며, 아래와 같이 각 값을 따로 지정할 수도 있다.
p {
border-width: 5px;
border-style: solid;
border-top-color: red;
border-right-color: green;
border-bottom-color: blue;
border-left-color: yellow;
}
border-image
속성을 사용하여 테두리로 이미지를 넣을 수 있다.
mdn 테두리 이미지
border는 top, fight, bottim, left 각 값을 이용하여 단축속성을 사용할 수 있으며,
border 속성을 이용해서 한번에 적용할 수도 있다.
/* 상하좌우 각각 스타일 적용 */
p {
border-top: 2px dashed red;
border-right: 4px dotted green;
border-bottom: 6px double blue;
border-left: 8px groove yellow;
}
/* 상하좌우 동일 스타일 한번에 적용 */
div {
border: 3px solid #e74c3c;
}
요소 주변의 여백으로, 테두리 바깥쪽의 여백을 설정한다.
마진역시 패딩과 같이 top, right, bottom, left 네가지의 속성값이 있다.
각각의 속성은 요소를 기준으로 상하좌우의 여백을 담당한다.
p {
margin-top: 10px;
margin-right: 20px;
margin-bottom: 30px;
margin-left: 40px;
}
네 면이 동일하게
값을 하나만 작성하는 경우 상하좌우 네 면이 동일한 값으로 적용된다.
p {
margin: 10px; /* top, right, bottom, left 모두 10px */
}
상하, 좌우
값을 두개만 작성하는 경우 첫 값은 상하, 두번째 값은 좌우여백으로 적용된다.
p {
margin: 10px 20px; /* top, bottom :10px, left, right:20px */
}
상, 우좌, 하
값을 세개만 작성하는 경우 첫 값은 상, 두번째 값은 좌우, 세번째 값은 하 여백으로 적용된다.
p {
margin: 10px 20px 30px; /* top:10px, left,right:20px, bottom:30px */
}
상, 우, 하, 좌
값을 네개 작성하는 경우 첫 값은 상, 두번째 값은 좌, 세번째 값은 하, 네번째 값은 우 여백으로 적용된다.
p {
margin: 10px 20px 30px 40px;
}
요소의 총 너비와 높이를 계산하는 방식을 지정한다.
기본값으로, width 값을 지정하는 경우 요소의 너비로 지정된다.
p {
width: 200px;
padding: 20px;
border: 1px solid black;
margin: 10px;
}
위와 같은 경우, width 값은 요소의 너비값이 되기 때문에 전체 너비는 요소(200px) + 패딩(좌우 40px) + 테두리(좌우 2px) + 마진(좌우 20px) 해서 총 262px이 나오게 된다.
width 값을 지정하는 경우 요소 + 패딩 + 테두리까지 합의 너비로 지정된다.
p {
width: 200px;
padding: 20px;
border: 1px solid black;
margin: 10px;
box-sizing: border-box;
}
width 값은 요소의 너비값이 되기 때문에 전체 너비는 요소 + 패딩 + 테두리까지가 200px이고 마진(좌우 20px) 해서 총 220px이 나오게 된다.
box-sizing
값은 상속이 되지 않으므로 *을 사용하여 모든 요소에 적용하는 것을 권장한다.* { box-sizing: border-box; }
요소(element)의 내용이 많아서 넘쳐흐르는 경우 어떻게 처리할지 지정한다.
기본값으로, 내용이 넘치더라도 그대로 보여준다.
p {
width: 50px;
height: 50px;
overflow: visible;
}
넘치는 내용을 잘라내어 보이지 않게 숨긴다.
p {
width: 50px;
height: 50px;
overflow: hidden;
}
항상 스크롤바를 표시하여 넘치는 내용을 스크롤할 수 있도록 한다.
p {
width: 50px;
height: 50px;
overflow: scroll;
}
내용이 넘칠 경우에만 스크롤바를 표시한다.
p {
width: 50px;
height: 50px;
overflow: auto;
}
한글 콘텐츠가 많은 사이트는
word-break: keep-all
과overflow-wrap: break-word
를 함께 사용하여 단어 의미를 유지하면서 레이아웃이 깨지지 않도록 할 수 있다.p { word-break: keep-all; overflow-wrap: break-word; }
가로(x)와 세로(y)의 넘침을 따로 제어할 수 있다.
p {
width: 100px;
height: 100px;
overflow-x: scroll;
overflow-y: hidden;
}
div {
width: 100px;
height: 100px;
overflow-x: hidden;
overflow-y: scroll;
}
테두리의 모서리를 둥글게 만들 수 있는 속성으로, 단축속성이다.
p {
width: 100px;
height: 100px;
border-top-left-radius: 50px;
}
p {
width: 100px;
height: 100px;
border-top-right-radius: 50px;
}
p {
width: 100px;
height: 100px;
border-bottom-right-radius: 50px;
}
p {
width: 100px;
height: 100px;
border-bottom-left-radius: 50px;
}
단축으로 사용 시 왼쪽 위(top-left)부터 시계방향으로 값을 적용한다.
p {
width: 100px;
height: 100px;
border-radius: 10px; /* 전체 */
border-radius: 10px 20px; /* top-left/bottom-right: 10px, top-right/bottom-left: 20px */
border-radius: 10px 20px 30px; /* top-left: 10px, top-right/bottom-left: 20px, bottom-right: 30px */
border-radius: 10px 200px 30px 40px;
}
px과 % 단위에 따라서 모양이 다르게 보이기도 한다.
또한 슬래시(/
)를 사용하여 둥글기를 다양하게 만들 수 있다.
border-radius 만들기
배경을 설정하는 단축속성이다.
배경 색상을 지정한다.
p {
background-color: red;
}
배경 이미지를 지정한다.
p {
background-image: url(./img/icon.png);
}
배경 이미지의 반복 방식을 지정한다.
p {
background-repeat: repeat;
}
p {
background-repeat: no-repeat;
}
p {
background-repeat: repeat-x;
}
p {
background-repeat: repeat-y;
}
p {
background-repeat: space;
}
p {
background-repeat: round;
}
배경 이미지의 위치를 지정한다.
p {
background-position: left bottom; /* 가로 왼쪽, 세로 하단 */
background-position: right center; /* 가로 오른쪽, 세로 중앙 */
background-position: center center; /* 가로 중앙, 세로 중앙 */
}
p {
background-position: 25% 75%;
}
p {
background-position: 50px 30px;
}
p {
background-position: 50px 75%;
}
배경 이미지의 크기를 지정한다.
p {
background-size: contain;
}
p {
background-size: cover;
}
p {
background-size: 100%;
background-size: 100px 400px;
}
배경 이미지의 스크롤 여부를 지정한다.
p {
background-attachment: scroll;
}
p {
background-attachment: fixed;
}
배경이 요소의 어느 영역까지 차지할지 지정한다.
p {
background-clip: border-box;
}
p {
background-clip: padding-box;
}
p {
background-clip: content-box;
}
배경 이미지의 원점(시작점)을 지정한다.
p {
background-origin: border-box;
}
p {
background-origin: padding-box;
}
p {
background-origin: content-box;
}
background-attachment: fixed;가 설정된 경우, background-origin은 무시되고 background-clip이 적용된다.
CSS를 사용하여 그라디언트 배경을 만들 수 있다.
직접 설정하는 것은 어렵지만 온라인 도구를 이용하여 쉽게 만들 수 있다.
p {
width: 200px;
height: 200px;
color: white;
background: linear-gradient(45deg, #3498db, #2ecc71);
}
HTML에 이미지를 넣을 때는 이 이미지를 img 태그로 넣을지 background-img로 넣을지를 고민해야 한다.
일반적인 사람들은 크게 다르지 않아보일 수 있지만 스크린리더로 접근하는 사람들에게는 크게 다르기 때문이다.
이를 위해서 이미지를 넣을 때는 주의할 필요가 있다.
문서 내에서 의미를 가진 이미지의 경우 img 태그를 이용하여 넣고, 그저 장식적인 요소인 경우 background-img를 이용하여 넣는다.
background 단축속성은 유독 다양한 값을 한번에 작성할 수 있는 속성으로 주의가 필요하다.
background: skyblue url(img/bg.jpg) no-repeat 50% 50% / cover;
일반적으로 color, image, repeat, position, size 순서로 작성을 하게 되며, size의 경우 position 값 이후에 슬래시(/
)로 구분 후 작성해야 정상적으로 표현된다.
또한 단축속성 작성 시 개별 속성으로 작성한 스타일을 덮어쓰기 때문에, 개별 속성을 지정할 때는 단축 속성 이후에 작성해야 한다.
div {
background: skyblue url(img/bg.jpg) no-repeat 50% 50% / cover;
background-clip: padding-box;
}
요소에 그림자 효과를 추가할 수 있다.
여러 값을 조합하여 다양한 그림자 효과를 만들 수도 있다.
p {
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3);
}
offset-x offset-y blur-radius spread-radius color
순서로 작성한다.
요소의 불투명도를 설정하는 속성으로, 0(완전 투명)부터 1(완전 불투명) 사이의 값을 사용한다.
p {
opacity: 0.7;
}
배경만 투명하게 하고싶다면
background-color: rgba()
를 사용하는 것이 좋다.