[ CSS ] Grid 사용하기 , element 위치설정, content와 grid 위치설정

     

     

    css에서 element를 배치시키는 방법에는 grid와 flexbox가 존재한다.

    flexbox의 경우 element들을 한 번에 특정 위치로 옮기는 것은 쉬우나

    그리드모양으로 배치하긴 쉽지 않아 flexbox대신 grid를 사용한다.

     

     

     

    [ grid 사용하기 위한 설정 1 - display 변경 ]

     

    //부모 element가 자식 element를 배치시키기 위해 부모의 display를 grid로 변경
    display:grid

     

     

    [ grid 사용하기 위한 설정 2  - 원하는 grid의 칼럼 수와 행 수, 크기 설정 ]

     

    grid-template-columns : 만들고 싶은 칼럼 수에 맞게 너비 지정

    grid-template-rows : 만들고 싶은 행 수에 맞게 높이를 지정

                                   : 높이 지정을 안 할 경우 안에 들어가는 텍스트와 이미지 크기로 설정된다.

    grid-template-columns : 100px 100px;
    grid-template-rows : 50px 50px;

     

    grid-template : row값 / column 값 -> 각각의 값을 따로 주지 않고 한 번에 주고 싶을 경우 사용

    grid-template: 100px 100px / 50px 50px;

     

    만약 100px씩 10개의 column을 가지고싶다면 100px를 10번 적는 것보단 repeat( 개수, 크기 )를 사용하면 된다.

    grid-template-columns:repeat(10,100px);

     


     

    element를 배치하는 방법은 여러 개다.

    아래의 모양대로 위치시키며 어떤 방법이 있는지 알아보고

    각자 편한 방법대로 사용해 보자 :)

     

     

     

     

     

    [ HTML 요소들 원하는 grid 위치에 삽입하기 - 1 ] 

     

    첫 번째로 부모 element에 자식 element들의 영역명을 이용해 해당 영역이 가지는 공간을 설정한다.

    //부모 element의 설정
    grid-tmeplate-areas : "영역명 영역명 영역명"
                          "영역명 영역명 영역명"
                          "영역명 영역명 영역명"
                          
    //자식 element의 설정
    grid-area : 해당 element 영역의 이름 설정
    
    //-> 3x3의 grid에 영역명에 알맞는 element들이 들어간다.

     

    위의 코드만 봐서는 이해가 어려울 수 있으니 아래 코드를 살펴보자.

     

    우리가 만들어야 하는 grid는 4x4의 grid로 

    grid-template-areas를 보면

    (1,1)~(1,4)는 header의 영역

    (2,1)~(2,3) , (3,1)~(3,3)는 column의 영역

    (2,4), (3,4)는 nav의 영역

    (4,1)~(4,4)는 footer의 영역으로 설정하고 있다.

     

     

    <!DOCTYPE html>
    <html lang="en">
      <head>
      	<style>
            .main {
            	display: grid;
                gap: 10px;
                height: 98vh;
                /*grid 크기 잡기*/
                grid-template-columns: repeat(4, 1fr);
                grid-template-rows: repeat(4, 1fr);
                /*영역명을 통해 위치 설정*/
                grid-template-areas:         
                "header header header header"
                "column column column nav"
                "column column column nav"
                "footer footer footer footer";
                }
             .header {
                background-color: pink;
                /*해당 요소의 영역명 설정*/
                grid-area: header;}
             .column {
                background-color: lightgoldenrodyellow;
                /*해당 요소의 영역명 설정*/
                grid-area: column;}
             .nav {
                background-color: lightgreen;
                /*해당 요소의 영역명 설정*/
                grid-area: nav;}
              .footer {
                background-color: lightsteelblue;
                /*해당 요소의 영역명 설정*/
                grid-area: footer;}
        </style>
      </head>
      <body>
        <div class="main">
          <div class="header">header</div>
          <div class="column">column</div>
          <div class="nav">nav</div>
          <div class="footer">footer</div>
        </div>
      </body>
    </html>

     

     

     

     

     

    [ HTML 요소들 원하는 grid 위치에 삽입하기 - 2 ] 

     

    위의 방법은 영역명을 통해 위치를 배치하는 방식이었다면

    두 번째는 해당 요소의 시작라인과 끝라인을 지정하는 방식이다.

     

    grid-column-start:시작라인;
    grid-column-end:끝라인;
    
    /*start와 end라인을 한번에 설정하는 경우*/
    grid-column:start/end;
    
    -----------------------------------
    
    grid-row-start:시작라인;
    grid-row-end:끝라인;
    
    /*start와 end라인을 한번에 설정하는 경우*/
    grid-row:start/end;
    
    -----------------------------------
    
    /* row와 colum 한번에 설정하는 경우 */
    grid-area : grid-row-s / grid-col-s / grid-row-end / grid-col-end

     

    여기서 조심해야 할 것은 라인의 위치이다.

    4*4의 경우 column의 시작라인은 1 맨 끝라인은 4라고 생각하기 쉬운데

    총 다섯 개의 라인이 존재하기 때문에 맨 끝라인은 5이다.

    아래의 사진을 참고하면 이해하기 더 쉽다.

     

     

    실제 코드는 아래와 같이 작성하면 된다.

     

    <!DOCTYPE html>
    <html lang="en">
      <head>
          <style>
          .header {
            background-color: pink;
            grid-column-start: 1;
            grid-column-end: 5;
          }
          .column {
            background-color: lightgoldenrodyellow;
            grid-column:1/4;
            grid-row-start: 2;
            grid-row-end: 4;
          }
          .nav {
            background-color: lightgreen;
            grid-row-start: 2;
            grid-row-end: 4;
          }
          .footer {
            background-color: lightsteelblue;
            grid-area :4/1/5/5 ;
          }
          .main {
            display: grid;
            gap: 10px;
            height: 98vh;
            grid-template-columns: repeat(4, 1fr);
            grid-template-rows: repeat(4, 1fr);
            }
         </style>
      </head>
      <body>
        <div class="main">
          <div class="header">header</div>
          <div class="column">column</div>
          <div class="nav">nav</div>
          <div class="footer">footer</div>
        </div>
      </body>
    </html>

     

     

     

     

     

    [ HTML 요소들 원하는 grid 위치에 삽입하기 - 3 ] 

     

    세 번째 방법은 span을 사용하는 것이다.

    grid-column : span 원하는 cell 수
    grid-row: span 원하는 cell 수

     

    span을 사용할 경우엔  HTML 상의 다른 element와의 관계(element위치)를 고려해서 작성해야 한다.

    그 이유는 span는 가장 윗부분부터 아래로 남은 공간을 차근차근 채워가는 방식으로

    요소가 나타나는 순서가 중요하기 때문이다.

     

    실제로 아래의 두 html코드는 같은 css 코드를 가지고 서로 다른 결과를 나타낸다.

     

    css / html / html

     

    이러한 현상을 방지하기 위해서 아래와 같이 시작라인을 정해주는 것도 하나의 방법이다.

    grid-column : 시작위치 / span 원하는크기
    grid-row : 시작위치 / span 원하는크기

     

     

     

     

     

    [ HTML 요소들 원하는 grid 위치에 삽입하기 - 4 ] 

     

    마지막 방법으로 line naming이다.

    2번과 유사한 방법이지만 라인의 번호대신 라인에 이름을 부여하여 사용한다.

     

    /* 부모 element - 2개의 칼럼 생성 */
    grid-template-colums : [lineName1] size [lineName2] size [lineName3] 
    
    /* 자식 element - lineName1부터 lineName2까지 영역을 가짐 = 1개의 칼럼 */
    grid-column : lineName1 / lineName2
    
    --------------------------------------------------------------------
    
    /* 부모 element - 2개의 행 생성 */
    grid-template-rows : [lineName1] size [lineName2] size [lineName3] 
    
    /* 자식 element - lineName1부터 lineName2까지 영역을 가짐 = 1개의 행 */
    grid-row : lineName1 / lineName2

     

     

     


     

    [ cell 속 content  위치 설정 ] 

    - 부모 element에 설정

    • justify-items : 수평상의 위치 
    • align-items : 수직상의 위치
    • place-items: 수직값 수평값 을 차례대로 작성

     

    들어갈 수 있는 값의 종류

    1. stretch : item을 늘려서 grid를 채우게 한다.
 [ defalut ] - 높이와 너비가 없어야한다.
    2. start : item을 cell 시작에 배치한다.
 - 높이와 너비가 있어야한다.
    3. center : item을 cell 중앙에 배치한다. - 높이와 너비가 있어야한다. 

    4.  end : item을 cell 끝에 배치한다. - 높이와 너비가 있어야한다.

     


     

    [ grid 위치 설정 ] 

    - 부모 element에 설정

     

    items는 각각의 cell을 의미한다면 content는 그리드 전체를 의미한다.
    jusitfy(align)-items은 각각의 셀 내부에서 그리드 요소를 움직이는 것이고
    justify(align)-content은 즉 그리드 전체를 움직이게 된다.

    • justify-content: 수평상의 위치 
    • align-content: 수직상의 위치
    • place-content: 수직값 수평값 을 차례대로 작성

     


     

    [ 하나의 content 위치 변경 ]

     

    justify-items, align-items, place-items의 경우 모든 element의 content를 한 번에 이동시켜준다.

    하지만 코드를 짜다보면 특정 content만 옮기고 싶을 때가 발생하는데

    이때에는 items를 self로만 바꿔주면 된다.

     

    • justify-self : 수평상의 위치 
    • align-self : 수직상의 위치
    • place-self: 수직값 수평값 을 차례대로 작성

     

    댓글