✔️ CSS Layout
저번에 이어서 flexbox 세 번째 시간을 가져볼려고 한다.
우선 저번 예제를 보자!
<body>
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
</body>
body {
display : flex;
justify-content:space-around;
height: 200vh;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
}
저번에 말헸듯이, flex-direction 의 기본값은 row (가로)이다.
justify-content 로 main axis 를 조절할 수 있고, align-items 로 cross axis 를 조절할 수 있다.
align-items 가 없으면, 기본값인 flex-start 로 지정된다.
그리고 알아야할 게 있는데 그것은 align-self 이다!
이것은 두 경우 중 하나로써, flexbox container 의 자식을 수정하는 경우이다
align-self 는 align-items 과 비슷한 일을 하는데, 그 말은 cross axis 이고 한 box 에만 해당한다!
정확히 자식 요소한테 줄 수 있다.
그럼 두 번째 박스에게만 align-self : center 를 줘보면...
body {
display : flex;
justify-content:space-around;
height: 100vh;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
}
.box:nth-child(2) {
align-self: center;
}
결과물을 보면, 2 번째 box 만 혼자 cross axis 방향으로 가운데 정렬되어 있다.
현재 flex-direction 은 row 이므로, cross axis 는 세로축이다.
그럼 이번에는 3 번째 박스한테 align-self 를 해주면?
body {
display : flex;
justify-content:space-around;
height: 100vh;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
}
.box:nth-child(2) {
align-self: center;
}
.box:nth-child(3) {
align-self: flex-end;
}
3 번째 box 한테 align-self 를 flex-end 하니까, align-items 처럼 세로축으로 맨 끝으로 정렬된다.
명실할 것은 위의 코드는 flex-direction 이 가로여서, align-self 는 세로축으로 box 를 정렬시킨다.
그리고 자식에게 줄 수 있는 또 다른 property 는 order 이다.
box 에게 순서를 변경하라고 할 수 있다.
이 property 는 이상하지만 어떤 면에서는 유용하게 쓰인다. (HTML 를 변경할 수 없을 때)
예 ) 2 번째 박스한테 order 를 줄 때
body {
display : flex;
justify-content:space-around;
height: 100vh;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px
}
.box:nth-child(2) {
order: 1;
}
그 전에는 1, 2, 3 이렇게 순서대로 정렬이 되었는데, 이제는 박스 1, 3, 2 순서로 정렬이 되어버렸다.
기본적으로 box 의 order 는 0 이다. (index 와 흡사하다)
그럼 두 번째 box 를 0 으로 바꾸면?
처음처럼 순서대로 정렬된다.
왜 그러면 두 번째 박스 order 를 1을 주면 맨 끝으로 갈까?
그 이유는 박스1은 order : 0 이고 박스3도 order:0 이지만, 박스2는 order:1 이여서다.
그럼 다시 2 번째 박스한테 order 1 를 주고, html 를 확인해보면?
body {
display : flex;
justify-content:space-around;
height: 100vh;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px
}
.box:nth-child(2) {
order: 1;
}
html 은 바뀌지 않아서 만약에 html 을 바꿀 수 없는 상황에 놓여있을 때는 유용하게 쓰일 기능이다.
그럼 이번에는 각 박스한테 다른 order 를 주면...
body {
display : flex;
justify-content:space-around;
height: 100vh;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px
}
.box:nth-child(1) {
order: 2
}
.box:nth-child(2) {
order: 3;
}
.box:nth-child(3) {
order: 0
}
박스 1은 order: 2 이고 박스 2는 order: 3 마지막으로 박스 3은 order: 0 이다.
그냥 이해하기 쉽게 설명하면 order 의 숫자를 확인하고 가장 작은 숫자를 가진 박스는 첫 번째로 이동하고 가장 큰 숫자를 가진 박스는 마지막으로 정렬된다.
이제 새로운 property 를 한번 보자!
flex-wrap
이번에 3개의 박스만 있는게 아니라 6개의 박스가 있다면 어떻게 될까?
예 )
<body>
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
</body>
body {
display : flex;
justify-content:space-around;
height: 100vh;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px;
}
분명히 우리는 가로 길이 200px 를 지정했는데, 확인해보니 118.938px 로 바뀌었다.
flexbox 는 item 들이 모두 같은 줄에 있도록 유지시킨다.
(너비가 바뀌더라도 말이다...)
최대한 모든 요소들을 한 줄에 꾸겨넣는다.
아 그리고 자식 요소한테 display : flex 를 줘서 글씨를 중앙으로 정렬시킬 수 있다!
body {
display : flex;
justify-content:space-around;
height: 100vh;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px;
display: flex;
justify-content: center;
align-items: center;
}
부모 요소도 flex 를 할 수 있고, 자식 요소도 flex 를 할 수 있다.
아까 말했듯이, flexbox 는 width 를 신경쓰지 않고 오직 같은 줄에 있도록 만드는 데만 신경 쓴다.
그럼 flex-wrap 에 대해 알아볼텐데, 우선 기본값인 nowrap 을 보면...
body {
display : flex;
justify-content:space-around;
height: 100vh;
flex-wrap: nowrap;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px;
display: flex;
justify-content: center;
align-items: center;
}
아무런 변화가 없다.
flex-wrap: nowrap 은 무슨 짓을 하더라도 해당 요소들이 같은 줄에 있어야 한다고 flexbox 에게 전달하는 것이다.
다음은 flex-wrap: wrap 을 해주면...
body {
display : flex;
justify-content:space-around;
height: 100vh;
flex-wrap: wrap;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px;
display: flex;
justify-content: center;
align-items: center;
}
화면 = width : 900px
화면 = width : 700px
wrap 은 flexbox 에게 자식의 크기를 유지하라고 이야기 하는 것이다.
그리고 화면 크기에 따라 박스 요소들이 한 줄에 있거나 밑으로 내려가기도 한다.
다음 property 를 알아보자!
우선 flex-wrap 부분을 지워준다.
body {
display : flex;
flex-direction: row-reverse;
justify-content:space-around;
height: 100vh;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px;
display: flex;
justify-content: center;
align-items: center;
}
flex-direction 을 row 가 아닌 row-reverse 로 설정하니, 박스 순서가 거꾸로 정렬된다.
(6, 5, 4, 3, 2, 1)
flex-direction 을 column-reverse 로 설정하면...
당연히 박스 순서가 반대로 지정되어서 나타난다.
그리고 flex-wrap 한테 reverse 를 할 수 있다!
body {
display : flex;
justify-content:space-around;
height: 100vh;
flex-wrap: wrap-reverse;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px;
display: flex;
justify-content: center;
align-items: center;
}
박스들이 밑에서부터 정렬되어서 화면 크기에 따라 박스들이 위로 올라간다.
reverse 는 이제 끝이다!
align-content 는 박스 사이의 공간을 수정한다.
정확히는 line 을 수정한다.
justify-content 와 비슷하지만 align-content 는 line 을 위한것이다.
예 )
body {
display : flex;
justify-content:space-around;
align-content: flex-start;
height: 100vh;
flex-wrap: wrap;
}
.box {
width: 200px;
height: 200px;
background : peru;
color : white;
font-size: 50px;
display: flex;
justify-content: center;
align-items: center;
}
align-content : flex-start 로 하면 줄 나눔이 없어진다.
그럼 center 로 지정해두면...
위에 있던 박스들이 가운데로 정렬되어서 나타난다.
정리하자면 align-content 는 line 을 변경하고 line 은 cross axis 에 있다.
끝으로 :