css

[CSS] grid 속성 총정리(grid container,grid item)

beaksul 2022. 1. 14. 15:21

flex에 이어 오늘은 grid에 대해 알아볼 차례다

 

먼저 flex와 grid의 차이점을 설명하자면,

flex는 한 컨테이너 안에서 한 가지 방향(1차원)만 설정할 수 있었다면

grid는 한 컨테이너 안에서 가로,세로 즉 두 가지 방향(2차원)을 설정할 수 있다는 점이다

 

 

1. grid는 부모요소인 grid container와 자식요소인 grid item으로 구성되어 있다

 

flex와 마찬가지로 grid도 container와 item이 존재하고 각각 적용 가능한 속성이 다르다

 

부모요소인 grid container에 display: grid;를 주면 그 아래 자식요소는 grid item이 된다

 

display: grid; 는 기본적으로 block의 속성을 가지고 있고(수직 쌓임)

inline속성을 가진 container를 만들고 싶으면 display: inline-grid; 를 주면 된다(수평 쌓임)

*위 내용은 container에 관한 설정이므로 item에는 영향을 주지 않는다

 

 

2. grid container에 적용 가능한 속성

 

grid-template-rows

grid-template-columns

grid track(행, 열)의 크기를 설정하는 속성

 

각종 단위 사용 가능

.container{
	display: grid;
	grid-template-rows: 100px 50% auto;
    	grid-template-columns: 100px 50% 1fr;
}

container의 row를 100px, 50%, auto로, columns를 100px, 50%, 1fr로 만들겠다는 뜻이다

 

- fraction(fr)

fr은 숫자의 비율대로 트랙의 크기를 나누어 각각의 row, columns에 적용하는 단위

 

아래처럼 설정하면 container의 columns은 각각 1:2:1 비율을 가지게 된다

.container{
	display: grid;
	grid-template-columns: 1fr 2fr 1fr;
}

 

- repeat함수

repeat(반복횟수, 반복값)

 

container{
	display: grid;
	grid-template-row: 200px 100px 200px 100px;
	grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
}

repeat을 사용하게 되면 반복되는 값을 불필요하게 기술하지 않아도 된다

container{
	display: grid;
	grid-template-row: repeat(2, 200px 100px);
	grid-template-columns: repeat(7, 1fr);
}

 

- minmax함수

minmax(최소값, 최대값)

 

아래처럼 설정하면 container안의 column은 item의 내용이 작더라도 최소한 200px을 유지하고, 그 이상이라면 자동으로 늘어나도록 설정된다

.container{
	display: grid;
	grid-template-columns: minmax(200px, auto);
}

 

- auto-fill, auto-fit

auto-fill

범위 안에서 최대한 많은 column을 생성(item이 모자라면 비워둠)

auto-fit

현재 가지고 있는 범위 안에서 item을 늘려 영역을 가득 채움

 

.container{
	display: grid;
	grid-template-columns: repeat(auto-fill, 20%);
    	grid-template-columns: repeat(auto-fit, 20%);
}

 

 

 

grid-auto-row

grid-auto-columns

row와 column의 개수를 미리 알 수 없는 경우 사용하는 속성

 

아래처럼 설정하면 몇개인지 모를 row를 최소한 200px 그 이상은 자동으로 늘어나게 설정된다

.container{
	display: grid;
	grid-auto-row: minmax(200px, auto);
}

 

 

grid-auto-flow

배치하지 않은 아이템이 자동 배치되는 흐름을 결정하는 속성

 

grid-auto-flow: row;

- 각 행 축을 따라 차례대로 배치

grid-auto-flow: column;

- 각 열 축을 따라 차례대로 배치

grid-auto-flow: row dense; (dense)

- 빈영역을 메우며 각 행 축을 따라 차례대로 배치

grid-auto-flow: column dense;

- 빈영역을 메우며 각 열 축을 따라 차례대로 배치

 

 

 

row-gap

column-gap

gap

셀 사이의 간격을 설정하는 속성

 

.container{
	display: grid;
	row-gap: 10px;
    	column-gap: 20px;
    	gap: 20px;
}

순서대로 row의 간격 10px, column의 간격 20px

row, column 두 간격 모두 20px

 

초기엔 속성 앞에 grid가 붙었으므로 호환성을 위해 아래처럼 쓰기도 한다

.container{
	display: grid;
	grid-gap: 20px;
	gap: 20px;
}

 

 

grid-template-areas

각 영역에 이름을 지정하고 그 이름을 이용하여 배치할 수 있게하는 속성

 

.container{
	display: grid;
	grid-template-areas: 
    	"header header header"
        "main main a"
        ". . none"
        "footer footer footer";
}

위처럼 container에 설정한 뒤

(*빈영역은 마침표 또는 none을 적어주면 됨)

 

해당 아이템 요소에 grid-area 속성으로 같은 이름을 지정하여 매칭할 수 있게 해준다

.header { grid-area: header; }
.main-content { grid-area: main; }
.side { grid-area: a; }
.footer { grid-area: footer; }

 

grid-template

grid-template-rows, grid-template-columns, grid-template-areas

세 가지 속성을 한 줄에 설정할 수 있는 속성

 

- 기본문법

grid-template: <grid-template-rows> / <grid-template-columns>;

grid-template: <grid-template-areas>;

 

아래처럼 사용도 가능하다

.container {
    display: grid;
    grid-template:
        "header header header" 80px
        "main main a" 350px
        ". . ." 50px
        "footer footer footer" 130px
        / 2fr 100px 1fr;
}
.header { grid-area: header; }
.main   { grid-area: main; }
.side  { grid-area: a; }
.footer { grid-area: footer; }

위 내용은 아래와 같이 해석할 수 있다

.container {
    display: grid;
    grid-template-rows: 80px 350px 130px;
    grid-template-columns: 2fr 100px 1fr;
    grid-template-areas:
        "header header header"
        "main main a"
        ". . ."
        "footer footer footer";
}

 

 

justify-content

아이템 컨텐츠의 수평축 정렬 방법을 설정하는 속성

 

 

 

align-content

place-content

justify-items

align-items

place-items

 

 

*바빠서 다음에 이어서 작성하겠습니ㄷ...ㅏ............*