본문 바로가기
Frontend/CSS

CSS의 grid를 함께 공부해보자 - 1. 그리드의 기본

by 코딩쥐 2024. 7. 13.

그리드(grid)는 수평선과 수직선으로 이루어져 격자형 배치가 가능한 레이아웃이다. 그리드의 경우 다양한 레이아웃을 훨씬 더 쉽게 구현할 수 있어 웹 페이지를 생성하는데 용이하다.

  • display: grid | inline-grid ; 

그리드 관련 용어

  • grid-container
    그리드 요소를 포함하고 있는 공간
  • grid-item 
    그리드 컨테이너 내부에 표시되는 그리드 컨테이너의 자식요소
  • track
    그리드의 행과 열을 의미한다.
  • cell
    그리드에서 한 칸을 의미한다.
  • line
    그리드에서 셀들의 구분 선을 의미한다.
  • number
    그리드 라인의 각 번호를 의미한다.
  • gap
    그리드 셀 사이의 간격을 의미한다.
  • grid-area
    그리드 라인으로 둘러쌓인 영역을 의미한다.

 


그리드 설정하는 법 (number 사용 방법)

grid-template-rows | grid-template-columns

그리드 컨테이너의 행(row)과 열(column)의 길이를 설정한다.

  • grid-template-rows | columns: 값1, 값2, ..., 값n;
    그리드의 행과 열의 길이는 절대단위를 사용해도 되지만, 고정적인 길이를 가져가는 것이 아니라면 fr을 사용해서 가변적인 환경에서 대처할 수 있다. fr사용 가능한 공간을 비율로 나눠서 할당해준다.

아래의 예제는 2행(row) 3열(column)의 그리드를 만들었다.

 

<예제코드>

더보기
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .grid-container{
            display:grid;
            height: 90vh;
            width: 100vw;
            grid-template-rows: 2fr 1fr;
            grid-template-columns: 3fr 200px 1fr;
            gap: 20px;
        }
        .grid-item{
            background-color: lightgreen;
        }
        p{
            font-size: 1.2em;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <div class="grid-item"><p> 행: 2fr, 열: 3fr</p></div>
        <div class="grid-item"><p> 행: 2fr, 열: 200px</p></div>
        <div class="grid-item"><p> 행: 2fr, 열: 1fr</p></div>
        <div class="grid-item"><p> 행: 1fr, 열: 3fr</p></div>
        <div class="grid-item"><p> 행: 1fr, 열: 200px</p></div>
        <div class="grid-item"><p> 행: 1fr, 열: 1fr</p></div>
    </div>
</body>

</html>

 


grid-area

그리드의 라인의 번호(number)을 가지고서 영역을 지정할 수 있다. 라인의 번호는 행의 경우 맨 위쪽에서 부터 1, 열의 경우 맨 왼쪽에서부터 1을 기준으로 한다. 

  • grid-row-start | end: 행시작번호 | 행끝번호;
    row의 범위를 지정할 수 있다.

  • grid-column start | end: 열시작번호 | 열끝번호;
    column의 범위를 지정할 수 있다.

  • grid-area: 행시작번호 / 열시작번호 / 행끝번호 / 열끝번호;
    row와 column의 시작 라인 번호와 끝 라인 번호를 적어 영역을 지정할 수 있다. 

  • grid-row | grid-column: 시작기준 / span 값;
    시작 기준에서 값만큼 영역을 넓히는 방법이다.

아래의 예제는 3행(row) 3열(column)의 그리드를 만들고, 아래처럼 4개의 셀을 합쳤다. 

     
  4개의 셀을 합쳐 볼 예정
 

3x3의 그리드여서, 행과 열 모두 다 2에서 시작해서 4에서 끝난다.

<예제코드>

더보기
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .grid-container{
            display:grid;
            height: 90vh;
            width: 100vw;
            grid-template-rows: 1fr 1fr 1fr;
            grid-template-columns: 1fr 1fr 1fr;
            gap: 20px;
        }
        .grid-item{
            background-color: lightgreen;
            text-align: center;
        }
        p{
            font-size: 1.2em;
        }

        .grid-item:nth-child(6){
            grid-row-start: 2;
            grid-row-end: 4;
            grid-column-start: 2;
            grid-column-end: 4;
            /* 
            1. grid-area를 사용하는 방법
            grid-area: 2/ 2/ 4/ 4; 
            
            2. span을 사용하는 방법 
            grid-row: 2 / span 2;
            grid-column: 2  / span 2;
            */
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <div class="grid-item"><p>1</p></div>
        <div class="grid-item"><p>2</p></div>
        <div class="grid-item"><p>3</p></div>
        <div class="grid-item"><p>4</p></div>
        <div class="grid-item"><p>5</p></div>
        <div class="grid-item"><p>6</p></div>

    </div>
</body>

</html>

그리드의 반복

트랙 내에서 계속 반복되는 경우 지정된 횟수와 패턴에 따라 반복적인 배치를 할 수 있다. 

  • grid-template-rows | grid-template-columns: repeat(횟수, 셀의 길이); 

  • minmax(최소값, 최대값); 
    비율로 셀의 길이를 설정하게 되면 전체 너비가 변경되면서 변할 수 있기 때문에, 이를 예방하기 위해 최소, 최대 길이를 지정해 줄 수 있다. 최소 어디까지 축소 그리고 최대 어디까지 확장할 수 있는지 지정하는 것으로 배치가 망가지는 것을 방지한다.

  • grid-auto-rows | columns: minmax(값, 값);
    repeat의 설정된 횟수가 지나고 그 다음에 만들어지는 아이템들의 대해서 minmax값을 지정할 수 있다.

 

 

<예제코드>

더보기
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .grid-container:nth-of-type(1){
            display:grid;
            width: 100vw;
            gap: 20px;
            grid-template-rows: repeat(2, 100px);
        
        }
        .grid-container:nth-of-type(2){
            display:grid;
            width: 100vw;
            gap: 20px;
            grid-template-rows: repeat(2, 100px);
            grid-auto-rows: minmax(auto, 100px);
        }
        .grid-item{
            background-color: lightgreen;
            text-align: center;
        }
        p{
            font-size: 1.2em;
        }


    </style>
</head>

<body>
    <h2>minmax 지정했을 때</h2>
    <div class="grid-container">
        <div class="grid-item">1</div>
        <div class="grid-item">2</div>
        <div class="grid-item">3</div>
        <div class="grid-item">4</div>
    </div>

    <h2>minmax 지정 안했을 때</h2>
    <div class="grid-container">
        <div class="grid-item">1</div>
        <div class="grid-item">2</div>
        <div class="grid-item">3</div>
        <div class="grid-item">4</div>
    </div>
</body>

</html>

 

 

  • grid-auto-flow: row | column | dense | row dense | column dense;
    자동으로 배치되는 아이템들을 그리드 안에 어떻게 넣을 것인가를 설정할 수 있다. 기본값은 row로 각 행 축을 따라서 배치가 된다. column의 경우 자동으로 배치되는 아이템들이 열 축을 따라서 배치가 된다. dense의 경우에는 그리드에 빈공간이 있으면 먼저 채우고, row dense는 각 행 축을 따라서 배치가 되면서 빈 공간이 있을 경우 먼저 채운다. column dense는 각 열 축을 따라서 배치가 되면서 빈공간이 있을 경우 먼저 채운다.

 

위의 repeat의 경우 횟수를 지정했었으나, 열 또는 행의 개수를 미리 지정하지 않고 최대한 셀을 채우게 하는 방법이 있다.

  • repeat(auto-fill, minmax(최소값, 최대값));
    사용 가능한 공간을 채울 수 있는 만큼의 row 혹은 column을 생성한다. 공간이 남으면 빈 공간이 발생한다.

  • repeat(auto-fit, minmax(최소값, 최대값));
    사용 가능한 공간을 채울 수 있는 만큼의 row 혹은 column을 생성한다. 공간이 남으면 빈 공간이 발생한다. 공간이 남아도 빈 공간이 발생하지 않는다. 

아래 사진처럼 auti-fill은 공간이 남으면 빈 공간이 생기고, auto-fit의 경우에는 빈공간이 없이 생성된다. 

 

<예제코드>

더보기
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .grid-container:nth-of-type(1){
            display:grid;
            height: 40vh;
            width: 100vw;
            gap: 20px;
            grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
        }
        .grid-container:nth-of-type(2){
            display:grid;
            height: 40vh;
            width: 100vw;
            gap: 20px;
            grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
        }
        .grid-item{
            background-color: lightgreen;
            text-align: center;
        }
        p{
            font-size: 1.2em;
        }


    </style>
</head>

<body>
    <h2>auto-fill</h2>
    <div class="grid-container">
        <div class="grid-item">1</div>
        <div class="grid-item">2</div>
        <div class="grid-item">3</div>
        <div class="grid-item">4</div>
        <div class="grid-item">5</div>
        <div class="grid-item">6</div>
        <div class="grid-item">7</div>
        <div class="grid-item">8</div>
        <div class="grid-item">9</div>
    </div>

    <h2>auto-fit</h2>
    <div class="grid-container">
        <div class="grid-item">1</div>
        <div class="grid-item">2</div>
        <div class="grid-item">3</div>
        <div class="grid-item">4</div>
        <div class="grid-item">5</div>
        <div class="grid-item">6</div>
        <div class="grid-item">7</div>
        <div class="grid-item">8</div>
        <div class="grid-item">9</div>
    </div>
</body>

</html>