CSS Flex vs Grid

기존 레이아웃 속성과 다른점

  • inline-block, float, absolute : 요소 자체에 속성을 부여
  • Flexbox, Grid : 부모요소에서 레이아웃을 제어(자식도 가능)

Flexbox

특징

  • 1차원 레이아웃(2차원도 가능)
  • 컴포넌트용
  • 용도에 맞게 사용

소개

  • display를 flex로 바꾸면 "flex 서식 컨텍스트"가 생성
  • 즉, 기본적으로 모든 자식 항목은 플렉스박스 레이아웃
    알고리즘에 따라 배치

Flex 부모 속성들

.container { display: flex; }
  • flex-direction
  • flex-wrap
  • justify-content
  • align-items
  • align-content

Flex direction

  • 주축: 자식 항목은 컨테이너의 시작점에 묶여 있습니다.

  • 교차축: 자식이 컨테이너 전체를 채우도록 늘어납니다.

    • 기본이 stretch인 이유?

Main Axis vs. Cross Axis

용어

  • justify — 주축을 따라 무언가를 정렬
  • align — 교차축을 따라 무언가를 정렬
  • content — 분산시킬 수 있는 "항목"의 그룹.
  • items — 개별적으로 정렬할 수 있는 단일 항목.

옵션 비교

Flex 자식 속성들

flex grow

  • 남아있는 공간을 사용하여 항목을 성장
  • 기본값 0
  • 남는 공간이 있을 경우에 해당

flex grow의 예시 그림

flex grow에 대한 작동 방식 예제

flex shrink

  • 아이템이 축소되는 능력을 정의
  • 기본값 1
  • 비례적으로 축소되는 것을 원하지 않는 경우
  • 부모 요소의 너비보다
    자식요소들을 합친 너비가 클 경우에 해당

flex shrink의 예시 그림

flex shrink에 대한 작동 방식 예제

flex-basis

  • 아이템의 기본 크기를 설정(기본값은 auto)
  • Flex row에서 flex-basis는 width와 동일한 작업을 수행
  • Flex column에서 축이 바뀌기 때문에 flex-basis는 height와 같은 역할
  • justify-content는 주축을 따라 하위 항목을 배포하며
    주축이 가로로 실행되든 세로로 실행되든 정확히 동일한 방식으로 작동

최소 크기 문제

  • 컨테이너가 특정 지점 아래로 줄어들면 콘텐츠가 넘칩니다!

  • 하지만 왜 그럴까요? 검색 입력은 필요한 만큼 축소될 수 있어야 합니다! 왜 축소를 거부하나요?

  • 그 이유는 바로 최소 크기입니다.

  • Flexbox 알고리즘은 최소 크기 이하로 자식을 축소하는 것을 거부합니다. flex-shrink를 아무리 높게 설정해도 콘텐츠가 더 이상 줄어들지 않고 넘칩니다!

min-width  속성을 사용하여 최소 크기를 재정의

주의사항

justify-content: space-between

  • 퍼블리싱과 실제 서비스의 차이
  • 콘텐츠의 개수가 정해진 경우에만 사용
  • 동적으로 아이템이 변경되는 경우에는 미사

실제로 2개만 있다면?

order 속성

  • order 속성을 이용해서 시각적인 위치를 바꿀 수 있지만 접근성을 위해서 주의

flexbox 예제

텍스트 줄수에 상관없이 가운데로 오는 방법

Swiper에서 최대 높이를 기준으로 채우는 방법

버튼 영역을 하단에 위치시키는 방법

z-index

  • position 속성이 요소에 적용된 경우에만 'z-index'를 추가
  • 예외적으로 flex 항목(flex 컨테이너 내부의 요소들)에
    'z-index'를 적용할 수 있다

Grid

특징

  • 2차원 레이아웃(1차원도 가능)
  • 복잡한 레이아웃

Grid 부모 속성들

.container { 
  display: grid; 
}
  • grid-template
  • justify-items
  • align-items
  • grid-auto-flow
  • justify-content
  • align-content
  • grid-auto-rows

grid-auto-flow

  • 자동 배치 알고리즘이 작동하는 방식을 제어하여
    자동 배치된 항목이 그리드에 흐르는 방식을 정확하게
    지정합니다.

grid-auto-rows

  • 암시적으로 생성된 그리드 행 트랙 또는 트랙 패턴의
    크기를 지정합니다.

Grid 자식 속성들

  • justify-self
  • align-self
  • grid-column
  • grid-row

Grid 레이아웃 방법

  • 그리드 영역 이름을 지정하는 레이아웃
  • 라인 기반 배치를 사용한 그리드 레이아웃
  • 명명된 그리드 선을 사용하는 그리드 레이아웃

그리드 영역 이름을 지정하는 레이아웃

.container {
  display: grid;
  grid-template-areas: 
    "header header"
    "content sidebar"
    "footer footer";
}
.header {
  grid-area: header;
}
.footer {
  grid-area: footer;
}
.content {
  grid-area: content;
}
.sidebar {
  grid-area: sidebar;
}

라인 기반 배치를 사용한 그리드 레이아웃

.container {
  display: grid;
}
.header {
  grid-area: 1 / 1 / 2 / 3;
  /* 
  grid-row-start: 1;
  grid-column-start: 1;
  grid-row-end: 2;
  grid-column-end: 3;
  */
}
.footer {
  grid-area: 3 / 1 / 4 / 3;
}
.content {
  grid-area: 2 / 1 / 3 / 2;
}
.sidebar {
  grid-area: 2 / 2 / 3 / 3;
}

명명된 그리드 선을 사용하는 그리드 레이아웃

.container {
  display: grid;
  grid-template-columns: 
    [full-start] 1fr
    [popout-start] 220px
    [content-start] 1400px [content-end]
    220px [popout-end]
    1fr [full-end];
}
> * {
  grid-column: content;
}
.popout {
  grid-column: popout;
}
.full {
  grid-column: full;
}

CSS 그리드 동일 열!

1fr 1fr 1fr은 작동하지만 몇 가지 문제가 있습니다!

그리드에서의 absolute 작동 방식

절대 위치를 가진 그리드 자식이 있는 경우
그리드를 사용하여 위치를 지정할 수 있습니다.

참고 사이트 https://dev.to/nicm42/using-position-absolute-in-a-grid-1apg

Grid를 완성시키는 속성의 탄생

Subgrid

Subgrid는?

  • CSS Grid는 매우 강력한 레이아웃 엔진이지만 상위 그리드에 만들어진 행 및 열 트랙은 그리드 컨테이너의 직접 하위 요소를 배치하는 데만 사용할 수 있습니다.
  • 작성자가 정의한 이름이 지정된 그리드 영역 및 선은 직계 하위 요소 이외의 다른 요소에서 손실되었습니다.
  • subgrid를 사용하면 트랙 크기, 템플릿 및 이름을 중첩된 그리드와 공유할 수 있습니다. 

Subgrid 이전

Subgrid 이후

그러나...

브라우저 지원

실무 사례 소개

A 프로젝트

알아두면 쓸데없는 팁

aspect-ratio

적용 규칙 기본

  • width, height 둘 다 고정값이면 비율은 무시됩니다.
  • 둘 중 하나는 auto여야 하는 거죠.
  • 둘 다 auto면 내용물에 따라서 적용 여부가 달라집니다. 예컨대 img 요소면 이미지의 종횡비와 img에 걸린
    스타일에 따라서 적용 여부가 결정됩니다.

출처 : https://twitter.com/mytory/status/1696020598487695508

focus

:focus-within

  • 요소 또는 해당 하위 항목에 초점이 맞춰진 경우
    해당 요소와 일치합니다

:focus-visible

  • 요소에 키보드를 사용하여 탭으로 초점이 맞춰진 경우
    해당 요소와 일치합니다
  • :focus는 마우스 클릭시에도 해당됩니다.

filter

  • 메뉴 호버시 아이콘만 다른색으로 변경하고 싶을 경우
  • CSS filter를 이용해서 변경이 가능합니다.
  • 물론 아이콘을 2개로 만들어서 하는 방법도 있지만
    하나만 관리한다면 편리합니다.

filter: invert(103%) saturate(100%) contrast(100%);

text-decoration-skip-ink

  • none auto의 차이

CSS Flex Grid

By kyoo119@gmail.com

CSS Flex Grid

  • 200