<div class="container">
<div class="item">flex</div>
<div class="item">A-yo</div>
<div class="item">Hello</div>
</div>
부모 요소인 div.container를 Flex Container라고 부르고,
자식 요소인 div.item들을 Flex Item 이라고 부른다.
Flex 의 영향을 받는 전체 공간은 Container 이다. Flex의 설정해주는 속성에 따라 각각의 아이템들이 배치된다.
개인적으로 Flex 에서 헷갈리는 요소들에 대해서 정리해 보았다.
Flex 아이템의 기본 크기 설정
(flex-direction이 row일 때는 너비, column일 때는 높이)
.item {
flex-basis: auto; /* 기본값 */
/* flex-basis: 0; */
/* flex-basis: 50%; */
/* flex-basis: 300px; */
/* flex-basis: 10rem; */
/* flex-basis: content; */
}
flex-basis는
flex-basis:auto
는 해당 아이템의 width 값을 사용한다. width
, height
값은 무시된다. .container {
display: flex;
height: 100vh;
}
li {
flex-basis: 100px;
flex-grow: 0;
/*width: 100px;*/
height: 50px;
box-sizing: border-box;
background-color: pink;
border: 1px solid black;
}
width:100px
이 없다면 width:100px
을 강제하지 않고 flex-basis
를 따른다.
원래의 크기가 100px 이 안되는 아이템은 100px로 늘어났고 , 원래 100px 이 넘는 아이템은 본인 크기를 그대로 유지한다. -> 강제하지 않는다.
반면에 flex-basis 를 설정해줬지만 width 값이 있을 경우 크기가 강제가 되어 원래 100px 이 넘는 아이템은 100px 로 맞춰진다.
둘 다 사용하면 100px 로 완전히 맞춰지겠죠 ?
🤚 여기서 잠깐
원래 100px(위 코드기준)을 넘는 아이템에게 flex-basis를 100px, width:100px 로 해줬을때 영역만 줄어들고 콘텐츠 내용은 옆으로 삐져나간다. 그럴 때 요소의 콘텐츠가 다음줄로 넘어가게 해주고 싶다면?
word-wrap: break-word;
을 써주면 된다 !
flex-grow
값의 기본값은 0 이다. 0보다 큰 값이 들어가면 해당 아이템이 유연한 박스로 변하고 원래의 크기보다 커지며 빈 공간을 메우게 된다.
.item {
flex-grow: 1;
/* flex-grow: 0; */ /* 기본값 */
}
0 이상의 수가 들어가면 width 값을 무시하고 부모의 영역을 모두 차지한다.
width 값대로 그려지지만 줄어들었을 때 브라우저의 크기가 전체 넓이보다 줄어든다면 자식의 크기도 줄어든다
flex-grow
에 들어가는 숫자의 의미는, 아이템들의 flex-basis
를 제외한 여백 부분을 flex-grow에 지정된 숫자의 비율로 나누어 가진다고 생각하시면 됩
아래 그림을 보면 둘 다 같은 조건일 때 flex-grow 만 다르게 줬을 뿐인데 나눠갖는 값이 다르다
flex-grow:1
flex-grow:0
아이템이 flex-basis
값보다 작아질 수 있는지 결정한다
0 보다 큰 값이 들어가면 아이템이 유연한 박스로 변하고 flex-basis
보다 줄어든다
지금까지는 기본값이 1이기 때문에 따로 세탕하지 않았어도 아이템이 flex-basis
보다 작아질 수 있었던 것이다 !
flex-grow, flex-shrink, flex-basis 의 축약형 속성
.item {
flex: 1;
/* flex-grow: 1; flex-shrink: 1; flex-basis: 0%; */
flex: 1 1 auto;
/* flex-grow: 1; flex-shrink: 1; flex-basis: auto; */
flex: 1 500px;
/* flex-grow: 1; flex-shrink: 1; flex-basis: 500px; */
}
주의할 점은, flex: 1;
이런 식으로 flex-basis를 생략해서 쓰면 flex-basis의 값은 0이 된다
= 기본 넓이가 없다 !
원래 내가 가진 본연의 크기를 0으로 초기화 시킨다. 그래서 전체가 1의 비율 균등한 비율로 나눠가질 수 있다 !
tab눌렀을 때 순서를 바꿔줄 수 있음 !
button:nth-child(1){
order: 1;
}
button:nth-child(2){
order: 2;
}
button:nth-child(3){
order: 3;
}
button:nth-child(4){
order: 6;
}
button:nth-child(5){
order: 5;
}
button:nth-child(6){
order: 4;
}
이렇게 order을 설정했을 때
원래라면 3 다음에 옆칸인 6이 나와야 했겠지만 order로 순서를 바꿔줬기 때문에 3 다음에 4라고 적혀있는 아이로 껑충 이동한다
휴우
헷갈렸던 속성들 이해 완 .