leeda-cloud
[CSS] flex 정리 본문
css작성 시 자주 사용하고 있는 flex!
flex를 처음 접했을 때는 어리버리 했는데 지금은 여기저기 유용하게 잘 사용 중이다.
그런 의미에서 복습 겸 정리를 해보자!
일단 flex는 mdn에서 정의하기를 하나의 플렉스 아이템이 자신의 컨테이너가 차지하는 공간에 맞추기 위해 크기를 키우거나 줄이는 방법을 설정하는 속성이라고 한다.
하지만 글로는 잘 이해가지 않는 법! 실제로 예제를 통해 적용해보자.
일단 flex를 사용할 html 구조를 만들어준다.
flex 관련 html 구조 예제
<div class="flex-container">
<div class="flex-item">1</div>
<div class="flex-item">2</div>
<div class="flex-item">3</div>
<div class="flex-item">4</div>
<span class="flex-item">5</span>
</div>
- flex-container : 컨테이너
- flex-item : 아이템
html을 살펴보면 아이템 5개를 컨테이너가 감싸고 있는 형식이며, 아직 스타일도 적용하지 않아 아래 이미지처럼 나열되어 보인다.
여기서 display: flex를 컨테이너에 우선 적용해봤다.
.flex-container {
display: flex;
background: purple;
}
.flex-item {
padding: 10px;
background: skyblue;
border: 2px solid orange;
}
위의 css를 적용하면 아래로 나열되어있던 아이템들이 한줄로 나란히 진열되었다.
block 요소와 inline 요소 상관 없이 한 줄로 잘 나오고 있지만 여기서 문제가 있으니!
작은 화면에서는 아이템들이 한줄로 나열되어 하늘색만 보일지라도 화면을 넓히면 보라색 즉 컨테이너의 영역이 나온다는 것이다.
이런 세세한 부분들을 잡기 위해서 필요한게 바로 flex css 속성들이다.
flex css 속성은 아이템(.flex-item)을 위한 속성과 컨테이너(.flex-container)을 위한 속성으로 나누어진다.
먼저 아이템을 위한 속성을 살펴보자.
아이템(.flex-item)에 적용되는 flex css 속성
- flex-grow : 컨테이너가 아이템들보다 크기가 클 때 아이템들이 가지게 되는 크기 값 (0일시 늘어나지 않음)
- flex-shrink : 아이템들의 크기가 컨테이너보다 클 때 아이템들이 가지게 되는 크기 값 (0일시 줄어들지 않음)
- flex-basis : 아이템의 기본 초기값 (width와 의미는 같지만 flex-basis가 우선순위로 적용 )
이게 무슨 소리인지는 하나씩 자세히 살펴보자.
flex-grow
지금 상황은 아이템들(.flex-item)의 width를 다 합친 것 보다 컨테이너(.flex-container)의 width가 더 크기에 보라색 배경이 노출되는 상황이다. 여기서 우리는 보라색이 보이지 않고 모두 같은 비율로 컨테이너를 꽉 채웠으면 한다.
이럴 때 사용하는 것이 flex-grow다.
.flex-item {
flex-grow: 1;
}
위처럼 모든 아이템에 flex-grow를 추가하고 다시 확인해보자.
그럼 이런 식으로 보라색은 보이지 않고 같은 비율로 늘어난 아이템들이 나타난다!
혹시나 하고 화면을 줄여봐도 문제 없이 잘 노출된다.
여기서 만약 모든 아이템을 같은 비율로 맞추는 게 아니라 특정 아이템만 늘리고 싶다면 flex-grow를 각각 주면 된다.
.flex-item:nth-child(2) {
flex-grow: 1;
}
.flex-item:nth-child(3) {
flex-grow: 0.5;
}
그러면 이런 식으로 2번째 아이템과 3번째 아이템만 늘어난 모양으로 바뀐다.
여기서 grow 뒤에 들어가는 숫자는 컨테이너의 크기에서 아이템들의 크기를 빼고 남은 여백 사이즈를 나눠서 비율별로 적용한 것이다.
flex-shrink
그럼 flex-shrink는?
이건 flex-grow의 반대로 생각하면 된다.
아까는 컨테이너의 여백이 남아서 문제였다면 이번엔 여백이 없어서 문제인 것!
만약 아이템 안에 들어가는 글자가 4글자라고 해보자.
그럼 화면이 줄어들수록 아이템의 크기도 줄어든다.
flex 속성이기에 무조건 한 줄로는 보여야하는데 컨테이너의 크기가 작아졌으니 아이템들도 그에 맞춰 크기를 줄인 것이다.
이럴때 만약 특정 아이템만 줄이는 비율을 다르게 하고 싶다면 flex-shrink를 각각 주면 된다.
.flex-item:nth-child(2) {
flex-shrink: 0.5;
}
.flex-item:nth-child(3) {
flex-shrink: 0.2;
}
그럼 2번째 아이템과 3번째 아이템이 다른 아이템과 다른 비율의 크기로 적용된 것이 뚜렷하게 보인다.
여기서 flex-grow와 flex-shrink의 차이를 말하자면 grow는 숫자가 클 수록 크기도 커지고 shrink는 숫자가 작을 수록 크기가 커진다는 것!
flex-basis
flex-basis는 말 그대로 기본 값을 의미한다. css의 width와 동일하지만 flex-item에서는 width보다 flex-basis를 더 우선으로 인정해준다. 아이템에 flex-basis를 10px로 주면 해당 아이템은 10px을 제일 기본 사이즈로 가지게 된다.
이렇게 아이템에 적용되는 flex css 속성을 알아봤는데 그럼 이걸 각각 주고 싶을 때 다 따로 하나씩 적는 건 귀찮은데... 싶겠지만 아니다! 이걸 또 요약해서 사용할 수 있다.
flex (요약본)
flex: 1 1 100px; /* flex-grow flex-shrink flex-basis */
flex: 2; /* flex-grow */
flex: 10em; /* flex-basis */
flex: 1 30px; /* flex-grow | flex-basis */
flex: 2 2; /* flex-grow | flex-shrink */
순서대로 grow shrink basis 값을 적으면 쉽게 해결된다.
예를 들어 아이템의 기본값이 50px이고 화면을 늘렸을때는 꽉 차게 늘리고 싶지만 화면을 줄였을 때는 안 줄어들게 하고싶다면
flex: 1 0 50px; 이런 식으로 작성하면 된다.
flex에 값이 한 개일때는 숫자를 적으면 flex-grow이며 px,rem,%등으로 지정하면 flex-basis이다.
값이 두 개일 때는 첫번째 값은 숫자를 적어 flex-grow로 표시하고 두번째 값이 숫자면 flex-shrink이고 px, rem,% 등으로 지정되면 flex-basis로 나타난다.
그럼 이제 컨테이너에 적용되는 flex css를 살펴보자.
컨테이터(.flex-container)에 적용되는 flex css 속성
- flex-wrap : 아이템을 한줄에 배치할지 아니면 여러줄로 나누어 배치할 지 결정
- justify-content: 컨테이너가 아이템들보다 크기가 클 때 아이템들이 가지게 되는 크기 값 (0일시 늘어나지 않음)
- align-items: 아이템들의 크기가 컨테이너보다 클 때 아이템들이 가지게 되는 크기 값 (0일시 줄어들지 않음)
- flex-direction : 아이템의 기본 초기값 (width와 의미는 같지만 flex-basis가 우선순위로 적용 )
flex- wrap
아이템을 배치할 때 한줄로 배치할지 아니면 여러줄로 나누어 배치할지 결정한다.
- nowrap : 한 줄로만 배치
- wrap : 여러줄로 나누어서 배치
- wrap-reverse : 여러줄로 나누어서 배치하지만 순서를 역순으로 변경
아까 위에서 적용한 것 처럼 나는 화면을 늘렸을때는 아이템 크기가 자동적으로 늘어나지만 줄어들었을 때는 두줄로 보이게 하고 싶어요 하는 경우 이런 걸 이용할 수 있다.
flex-direction
아이템을 배치할 때 사용할 주축 및 방향 (정방향, 역방향)을 지정한다.
row는 가로 column은 세로 이며 reverse가 붙는 건 역순을 말한다.
여기서 저 flex-direction으로 정하는 라인을 주축(메인축)이라 부른다.
또한 그 주축(메인축)과 교차되는 축을 교차축이라 부른다.
justify-content
컨테이너의 주축( 메인축 ) 관련 정렬이다.
align-items
컨테이너의 교차축 관련 정렬이다.
justify-content 와 align-items의 정렬 속성으로는 아래와 같다.
- flex-start: 배치의 시작 순서로 정렬
- flex -end: 배치의 끝 순서로 정렬
- center :가운데 정렬
- space-between: 아이템들을 균등한 간격으로정렬
- space-around : 아이템들을 균등한 간격으로 정렬하고 컨테이너의 가장자리에도 반 간격 생성
- space-evenly : 아이템들을 균등한 간격으로 정렬하고 컨테이너의 가장자리에도 간격 생성
이렇게만 보면 헷갈릴 수 있는데 space-around와 space-evenly가 특히 헷갈릴 수 있어서 이미지로 정리했다.
space-between, space-around, space-evenly의 간격이 각각 다른 것이 나타난다.
이 셋의 간격을 조금 더 자세히 살펴보면 아래와 같다.
space-between은 가장자리 여백이 없이 모두가 일정하게 나타난다.
space-around는 아이템의 좌우에 각각 균등한여백이 주어져있다. 그래서 아이템과 아이템 사이에는 같은 여백이 2번 들어가져있고 가장자리에만 1번의 여백이 적용되어 있다.
space-evenly는 아이템의 좌우에 모두 동일한 여백이 주어져 있다.
flex-flow (요약본)
flex-flow: row wrap; /* flex-direction flex-wrap*/
direction과 wrap을 요약해서도 사용할 수 있다.
'HTML & CSS & JS > HTML&CSS' 카테고리의 다른 글
[CSS] svg에 animation 적용하기 (2) | 2023.07.13 |
---|---|
[HTML & CSS]background-attachment:fixed 모바일에서 작동하지 않을 때 해결법 (0) | 2023.07.13 |
[CSS] 모바일에서 링크 클릭시 잡히는 하이라이트 ( -webkit-tap-highlight-color) 수정하기 (0) | 2023.07.13 |
[HTML] 아이폰 모바일(safari)에서 비디오 자동 재생(autoplay)이 안 될 때 해결법 (1) | 2023.07.13 |
[SASS(SCSS)] 정리 (1) | 2023.07.13 |