8/16 1분코딩 Flex&Grid 학습메모

그른손·2023년 8월 16일
0

Flex => '유연한' 박스 레이아웃을 잘 만들 수 있게 고안된 스펙

기존의 float, inline-block을 사용하는 레이아웃보다 훨씬 강력하고 편리한 기능 많다

Grid => Flex보다 더 강력하고 많은 기능을 제공하는 최신 스펙. Flex로 되는 건 대부분 Grid로도 구현 가능하기 때문에 상위호환으로 생각하는 경우가 많음

  • 그리드로는 구현이 어렵지만 Flex로는 쉽게 구현할 수 있는 경우도 있음

  • 그리드보다는 플렉스가 더 사용하기가 간단함

  • 두 개의 특징을 잘 알아두고 적재적소에 사용하는 게 중요

[실습]

부모 요소 => flex container

자식 요소 => flex item

컨테이너에 적용하는 속성과 아이템에 적용하는 속성이 따로 있음

부모 요소에 적용하는 속성

display:flex를 적용한 결과 (flex의 기본 동작)

[블럭 엘리먼트인 div들이 인라인처럼 나란히 배치되고 차지하고 있는 폭도 꽉 차있었던게 각자의 contents만큼의 폭을 가지게 바뀜]

flex의 장점 : column 디자인할 때 좋음

알아야 할 용어

축!

flex item이 배치된 방향의 축 : 메인축(main axis)

메인축과 수직이 되는 방향의 축 : 교차축(cross axis), 수직축

가로축 세로축이 아님! (flex-direction: column이면 세로축이 메인축이니까)

떡꼬치라고 생각하셈 (꼬챙이 = 메인축, flex item = 떡)

flex-direction => 가로/가로거꾸로/세로/세로거꾸로 4가지 있음. 순서는 왼쪽에서 오른쪽 (언어를 따라감)

flex-wrap : 아이템의 총합보다 컨테이너의 크기가 작을 때 줄바꿈 어떻게 할지 설정

nowrap: 기본값. 컨텐츠가 길어지면 컨테이너를 넘어감 (컨테이너가 뻐팅김)

wrap: 컨텐츠가 길어지면 컨테이너가 늘어남 (가로 길이가 늘어나든 세로 길이가 늘어나든, 컨텐츠를 포함할 수 있는 크기가 되고, 컨텐츠는 줄바꿈됨)

wrap-reverse : wrap과 같지만 배치 순서가 뒤집힘

flex-direction과 flex-wrap을 동시에 같이 쓸 수 있는 flex-flow

사용예시

flex-flow: row wrap;

flex-flow: column wrap-reverse;

두개를 한번에 쓸수있는 축약형임

[지금까지 배운걸로 반응형 만들어보자]

flex나 grid (특히 grid)는 파폭으로 연습하면 좋다 (플렉스/그리드를 위한 특별한 기능이 있음 (레이아웃 가이드 등...)

그리드는 코딩할 때 몇째줄 몇째칸인지 알아보기 힘들어서 이런 기능이 유용함

-미디어 쿼리! 라는 걸 썼다! (화면이 특정 크기일 때 특정 스타일을 적용한다! 이걸로 반응형 만드는듯)

<style>
      @media (min-width: 600px) {
        .flex-container {
          display: flex;
        }
      }
    </style>

 기본 스타일에도 플렉스를 적용하고 media가 발동하면 바뀌게 할 수도 있으

    <style>
      .flex-container {
        display: flex;
        flex-direction: column;
      }
      @media (min-width: 600px) {
        .flex-container {
          display: flex;
          flex-direction: row;
        }
      }
    </style>

justify => 메인 축 위에서 떡을 정렬하는 것 (떡 뽑아먹는 방향)

align => 수직 축 방향에서 떡을 정렬하는 것 (떡 뜯어먹는 방향)

가로정렬, 세로정렬이라고 정해져있는 게 아님!! 메인 축 방향이 바뀌면 이것도 반대가 됨

=> 제일 처음 배울 때 맨날 justify가 가로인지 세로인지 헷갈리는 이유. 가로도 세로도 아님!! main axis가 세로면 justify는 세로 정렬이 되고, 가로면 가로 정렬이 되는 것

justify-content : 컨텐트를 메인축 방향에서 정렬

flex-start : 시작 위치

flex-end : 시작 위치 반대

center : 가운데

space-between : 사이에 공간 두기 (양끝에 붙고 사이의 공간 균일하게 나눠가짐)

space-around : 주변에 공간 두기 (아이템들이 동일한 크기의 주변 공간을 양 끝마다 가짐 = 아이템A(좌10우10) 아이템B(좌10우10) 이런 식으로)

space-evenly : 모두 동일한 크기의 사이 여백을 가짐

space-evenly는 ms계열 브라우저에서는 지원하지 않으니 주의

보통은 space-between, space-around 많이 씀

 align-content : 여러 행 정렬!

flex-wrap: wrap;이 설정된 상태 (줄바꿈이 있는 상태)에서, 아이템들의 행이 2줄 이상 되었을 때 수직축 방향 정렬을 결정하는 속성

stretch : 기본값 (컨테이너에 맞춰서 수직축 방향으로 아이템 길이를 늘림)

flex-start : 시작 위치 기준으로

flex-end : 끝 위치 기준으로

center : 가운데

space-between : 양 끝방향에 붙이고 사이에 중간 행들을 놓음 (첫행과 마지막행을)

space-around : 각 행이 각각 동등한 여백 공간을 가짐

space-evenly : 각 행 사이 공간이 모두 똑같은 크기를 가짐

align -> 수직 축 위에서 떡을 정렬하는 것 (떡 뜯어먹는 방향)

align-items : 기본값은 stretch(아이템 크기를 맞춤으로 늘려버림)

flex-start : 시작부분 기준

flex-end : 끝부분 (시작 반대편) 기준

center : 중앙 정렬 (굉장히 많이 씀)

baseline : 텍스트 베이스라인 기준으로 정렬

justify-content: center;
align-items: center;

보통 이런 식으로 가운데 정렬 시킨다. 익숙하다!

 자식 요소 (flex item)에 적용하는 속성들

flex-basis : 아이템이 가지는 기본 크기를 메인 축 기준으로 설정한다고 생각하면 됨 (근데 width, height랑은 다름...)

flex-basis: 100px (메인 축 기준으로 기본 크기가 100px)

width와의 차이는?

width: 100px이면 아이템의 컨텐츠 길이와 상관없이 무조건 100px로 맞춰버림

flex-basis가 100px이면 아이템의 컨텐츠 길이가 작아도 크기가 '최소 100px'로 맞춰짐 (컨텐츠 길이가 길어지면 늘어남)

둘 다 설정하면? => flex-basis가 적용되는듯?

 flex-grow : 유연하게 늘리기

아이템이 flex-basis의 값보다 커질 수 있는지를 결정하는 속성

숫자값이 들어가며, 0보다 큰 값이 세팅되면 해당 아이템이 유연한(flexible)박스로 변하고 원래의 크기보다 커지면 빈 공간을 메우게 됨

기본값은 0

flex-grow에 들어가는 숫자의 의미 : 아이템들의 flex-basis를 제외한 여백 부분을 flex-grow에 지정된 숫자의 비율로 나누어 가진다.

늘어날 수 있는 한계 : 내 부모의 width

flex-shrink : 유연하게 줄이기 (flex-grow와 세트!) 아이템이 flex-basis의 값보다 작아질 수 있는지 결정

0보다 큰 값이 세팅되면 아이템이 유연한 박스로 변하고 flex-basis보다 작아질 수 있게 됨

기본값이 1이라서 따로 세팅하지 않아도 활성화되어있음

숫자값 의미 = > 줄어들 때 몇대몇으로 줄어드느냐

flex-shrink : 0; => 안줄어든다! 아무리 컨테이너가 짜그라들어도 안줄어든다

flex-basis는 단독으로는 잘 안쓰고 다른 속성들을 같이 설정할 수 있는 축약형을 사용할 때 많이 쓴다고 했는데, 그 다른 속성이 flex-grow, flex-shrink임 (flex: 0 1 10 이따구로 쓰는 거 본거같다)

flex-basis, flex-grow, flex-shrink 는 세트다!

flex : 그로우; 쉬링크; 베이시스;

flex: 1;로 설정하면?

flex-grow : 1; flex-shrink: 1; flex-basis: 0%;

flex-basis를 생략해서 쓰면 flex-basis값은 0이 된다! (기본값은 auto)

flex: 1 500px;

grow 1 shrink 1 basis 500px

다단컬럼같은 거 만들때는 flex-grow보단 width로 설정하는 게 더 확실함 (flex는 강제적으로 줄이거나 하지는 않기 때문에...)

엄청 긴 문단을 nowrap으로 넣어놓고 각각 설정했을 때

flex-grow 설정 => 아이템 크기를 줄이지 않고 줄바꿈없이 쭉~~~보여줌 = 아이템 크기가 엄청 커짐

width: 20%로 설정하면? => 아이템 크기를 20%로 강제하고, 내용이 삐져나오든 말든 신경안씀

flex-grow를 이용하든 basis를 이용하든 width를 이용하든 구현하는데는 상관이 별로 없는데, 아이템 내용이 넘치는 걸 대비해서 width로 설정하는 게 일반적이다

그럼 grow basis같은건 어따쓰냐? => 쓰는데가 따로 있다

(...flex grow, basis 사용예시 설명...)

어디다 뭘 써야되는지 정답은 없다! (그래서 어려움...)

각 속성들의 특징을 잘 파악해야 잘 쓸 수 있다

다단 컬럼 만들기

flex-basis의 기본값은 auto다.

=> auto가 뭐냐? = width를 basis로 가진다 (내가 설정한 width가 있다면 그 값을 basis로 가지는 것)

flex-item에 flex: 1 1 auto를 줬는데, 그 상태에서 flex-item의 width가 50%로 설정되면 자연스럽게 flex-basis가 50%가 되어 작동하는 것

basis 명시 안하면 0%되는거 생각할것

3단컬럼 만들 때 flex-item width를 33.33333%로 안하고 27%, 30%처럼 애매한 값으로 설정해도 대충 알아먹고 작동하는 이유 => flex-grow가 1이니까 (flex-grow: 1이면 내 width가 모자라도 알아서 늘어나서 빈부분을 채우니까! 27%로 설정하면 지알아서 늘어나서 33.3333333...%로 만드는거)

 유용한 기법들

auto-margin

ABC에 있으면 C에다가 (혹은 라스트차일드에다가) margin-left: auto로 두면? => c만 끝에 감 (마진auto는 남아있는 마진을 다 점유해버림)

이거 어디서 썼냐? 메인프로젝트때 nav만들면서 로그아웃버튼이랑 만들기버튼 nav 맨아래로 꼬라박는데 썼다

고정폭 컬럼과 가변폭 컬럼 혼합

flex를 이용하면 쉽게 만들 수 있따

123 있으면, 1번(width 150px) 3번(width 200px)로 설정하고 flex-shrink 꺼버리면(flex: 0 0 auto;)=>2번은 가변폭을 갖고(flex-grow 1설정해주기), 1 3번은 고정폭을 가진 레이아웃을 만들 수 있다

footer를 창 바닥에 붙이기

컨텐트에다가 flex-grow 설정하기 (flex: 1 auto;) + 페이지에 min-height: 100vh 설정하기

=> 페이지가 100vh를 차지하고, 컨텐트는 여백을 모두 점유해서 쫙 늘어나고 푸터는 자연스럽게 맨 아래에 갖다박힘

IE버그

IE에서는 위에서 한거 적용 안됨 (min-height => height로 바꾸면 적용됨...근데 이상함)

 개별 아이템 속성

align-items => 아이템들을 통째로 수직축 방향 정렬

align-self => 특정 아이템을 개별적으로 수직축 방향 정렬

order => 시각적 나열 순서 결정하는 속성 (숫자가 작을 수록 먼저 배치) / 시각적인 나열 순서일 뿐 HTML 구조는 그대로이므로 접근성 측면에서 주의해야 함 (스크린리더 쓰는 사용자라든가...)

z-index => Z축정렬시킴 (포토샵의 레이어랑 비슷하게)

profile
프론트엔드 개발자

0개의 댓글