효땡 2024. 6. 29. 13:27

Grid

- display: grid

- 자식 요소들이 컨테이너 안 공간을 맞추기 위해서 크기를 키우거나 줄이는 방법을 설정함

- 부모요소를 grid-container / 자식요소를 grid-item

- 그리드 레이아웃은 웹페이지를 위한 2차원 레이아웃(x, y축) 시스템

 

grid-container에 사용하는 속성

 

grid-template-columns

- 열방향 그리드 트랙의 사이즈를 설정

 

grid-template-rows

- 행방향 그리드 트랙의 사이즈를 설정

.container {
	display: grid;
	width: 300px;
	height: 300px;
	grid-template-columns: 100px 100px 100px;
	grid-template-rows: 200px 100px;
}

 

 fr 

- fraction : 분수

- 컨테이너를 분할해줌

- grid 컨테이너 안에서 트랙의 비율을 지정해주는 유연한 길이 단위

- 1fr 1fr 1fr은 1:1:1의 비율을 의미

 

함수

repeat()

- row 혹은 column 방햐으로 grid-track의 사이즈를 좀 더 간단한 형태로 표현하도록 도와주는 CSS함수

- repeat(반복횟수, 반복할 값)

.container {
	display: grid;
	width: 300px;
	height: 300px;
	/* grid-template-columns: 1fr 1fr 1fr; */
	grid-template-columns: repeat(3, 1fr);
	grid-template-rows: 2fr 1fr;
}
/* grid-template-columns: 1fr 2fr 1fr 2fr */
grid-template-columns: repeat(2, 1fr 2fr);

 

minmax()

- 그리드에서 최소와 최대 사이의 범위를 설정하는 함수

- 최소와 최대값을 의미하는 두 가지 인자를 가짐

- min보다 크거나 같고, max보다 작거나 같은 크기 범위를 정의

/* grid-template-columns: 1fr 2fr 1fr 2fr */
grid-template-columns: repeat(2, 1fr 2fr);

 

auto-fill & auto-fit

- 만약 repeat 함수를 사용할 때, 반복되는 카운트를 고정하는 않고 컨테이너의 넓이에 따라 가능한 많이 그리드 컬럼을 배치하고 싶다면 사용하는 키워드 값

- auto-fill : 가능한 많은 칼럼을 만들어 내려고 함 / 빈 공간이 생길 수 있음

- auto-fit : 그리드 컨테이너 내부에 공간이 남을 경우, 그 공간을 각 셀들이 나눠 가짐

 

gap

- 셀과 셀 사이의 간격을 설정할 때, margin 대신 편리하게 간격을 설정할 수 있음

- flex에서와 동일한 속성

gap: 10px 20px;

 

align-content

- 그리드 아이템을 트랙 단위로 수직(열) 정렬

- 그리드 아이템의 세로 높이가 그리드 컨테이너 안에서 움직일 공간이 있어야 함

  ◽ stretch : 기본값 / 그리드 컨테이너 영역을 아이템 트랙 크기를 조정하여 채움

  ◽ center : 그리드 컨테이너 영역의 중앙 아이템 트랙을 정렬

  ◽ start : 그리드 컨테이너 영역의 시작점에 아이템 트랙을 정렬

  ◽ end : 그리드 컨테이너 영역의 끝점에 아이템 트랙을 정렬

  ◽ space-around : 컨테이너의 남은 영역을 아이템 트랙(열)이 좌/우 공간으로 나눔

  ◽ space-between : 컨테이너 영역의 양 가장자리 공백없이, 아이템 트랙(열) 사이 공간을 나눔

  ◽ space-evenly : 공간을 모두 동일하게 나눔

 

justify-content

- 그리드 아이템을 트랙 단위로 수평(행) 정렬

- 그리드 아이템의 가로 너비가 그리드 컨테이너 안에서 움직일 공간이 있어야 함

  ◽ stretch : 기본값 / 그리드 컨테이너 영역을 아이템 트랙 크기를 조정하여 채움

  ◽ center : 그리드 컨테이너 영역의 중앙 아이템 트랙을 정렬

  ◽ start : 그리드 컨테이너 영역의 시작점에 아이템 트랙을 정렬

  ◽ end : 그리드 컨테이너 영역의 끝점에 아이템 트랙을 정렬

  ◽ space-around : 컨테이너의 남은 영역을 아이템 트랙(열)이 좌/우 공간으로 나눔

  ◽ space-between : 컨테이너 영역의 양 가장자리 공백없이, 아이템 트랙(열) 사이 공간을 나눔

  ◽ space-evenly : 공간을 모두 동일하게 나눔

 

align-items

- 직계 자식에 대한 수직(열) 정렬을 각 셀에 모두 동일하게 줌

  ◽ stretch : 기본값 / 그리드 영역 전체 너비를 채움

  ◽  center : 그리드 영역의 중앙에 콘텐츠 정렬

  ◽  start : 그리드 영역의 시작점에 콘텐츠 정렬

  ◽  end : 그리드 영역의 끝점에 콘텐츠 정렬

 

justify-items

- 직계 자식에 대한 수평(열) 정렬을 각 셀에 모두 동일하게 줌

  ◽ stretch : 기본값 / 그리드 영역 전체 너비를 채움

  ◽  center : 그리드 영역의 중앙에 콘텐츠 정렬

  ◽  start : 그리드 영역의 시작점에 콘텐츠 정렬

  ◽  end : 그리드 영역의 끝점에 콘텐츠 정렬

 

grid-item에 사용하는 속성

grid-area

- grid-column-start : 그리드 열 시작점

- grid-column-end : 그리드 열 끝점

- grid-row-start : 그리드 행 시작점

- grid-row-end : 그리드 행 끝점

  /* 각각의 값은 그리드 라인의 번호를 의미합니다. */	
  grid-row-start: 1; 
  grid-row-end: 2; 
  grid-column-start: 1; 
  grid-column-end: 4; 

  /* row-start, column-start의 축약입니다. */
  grid-row: 1/2;
  grid-column: 1/4;

	/* grid-row-start는 첫 번째 값, 
	grid-column-start는 두 번째 값, 
	grid-row-end는 세 번째 값, 
	grid-column-end는 네 번째 값으로 설정됩니다. */
  grid-area: 1/1/2/4;

	/* span 은 셀을 의미합니다. span 3은 셀 세개를 의미합니다. */
	grid-area: 1/1/1/span 3;
.container {
	grid-template-areas: 
		"header header header"
		"section section aside"
		"footer footer footer"
}

header{
	grid-area:header;
}

 

z-index

- grid 안에서도 사용 가능

- grid 안에서는 굳이 position 속성을 사용하지 않아도 화면에 보여지는 우선순위 설정 가능

 

align-self

- 아이템 개별로 수직(열) 정렬 지정

align-self: stretch;

 

align-self- center;

 

align-self: start;

 

align-self: end;

 

justify-self

- 아이템 개별로 수평(행) 정렬을 지정

justify-self: stretch;

 

justify-self: center;

 

justify-self: start;

 

justify-self: end;

 

place-self

- align-self justify-self를 함께 적는 단축속성

/* 수직: 중앙, 수평 : 끝(오른쪽) */
place-self: center end;

 

order

- (flex와 마찬가지로) 아이템의 배치 순서를 지정

 


가상 선택자

:active

- 클릭 시 활성화 (누르고 있는 동안)

 

:visited

- 사용자가 이미 방문한 링크일 경우, 해당 상태에 만족

- 웹브라우저의 방문기록 정보를 사용

 

:hover

- 마우스 커서를 요소에 올려두었을 때

 

:focus

- focus받은 상태를 나타냄


:focus-visible

- :focus와 유사하게 포커스 받은 상태를 나타냄

- 분명하게 포커스 되었다는 정보를 표시해야 할 경우에만 작동하는 특징을 가지고 있음

- <button>, <a> 요소 사용 시 차이를 확인 가능

input:focus-visible{
  background: green;
}

button:focus-visible{
  background: green;
}

a:focus-visible{
  background: green;
}

 

:focus-within

- 요소를 포커스했을 때, 요소 / 요소의 부모에서 해당 선택자를 사용

 

:enabled, :disabled

- 활성화 / 비활성화 상태일 때


[실습] 레이아웃

 

첫 번째 방법 (grid-area)

<style>
      .container {
        display: grid;
        grid-template-areas:
          "blue blue blue yellow yellow"
          "blue blue blue yellow yellow"
          "purple purple orange yellow yellow"
          "pink pink green green green"
          "pink pink green green green";
        width: 500px;
        height: 500px;
        gap: 3px;
      }
      .item {
        border: 3px solid whitesmoke;
      }
      .item1 {
        grid-area: blue;
        background-color: cornflowerblue;
      }
      .item2 {
        grid-area: yellow;
        background-color: gold;
      }
      .item3 {
        grid-area: purple;
        background-color: slateblue;
      }
      .item4 {
        grid-area: orange;
        background-color: orange;
      }
      .item5 {
        grid-area: green;
        background-color: green;
      }
      .item6 {
        grid-area: pink;
        background-color: salmon;
      }
    </style>
 <div class="container">
      <div class="item item1"></div>
      <div class="item item2"></div>
      <div class="item item3"></div>
      <div class="item item4"></div>
      <div class="item item5"></div>
      <div class="item item6"></div>
    </div>

 

두 번째 방법(grid-rows / grid-columns)

<style>
      .container {
        display: grid;
        width: 500px;
        height: 500px;
        grid-template-columns: repeat(5, 1fr);
        grid-template-rows: repeat(5, 1fr);
      }
      .item {
        border: 3px solid whitesmoke;
      }
      .item1 {
        background-color: cornflowerblue;
        grid-column: 1/4;
        grid-row: 1/3;
      }
      .item2 {
        background-color: slateblue;
        grid-column: 1/3;
        grid-row: 3/4;
      }
      .item3 {
        background-color: salmon;
        grid-column: -6/-4;
        grid-row: 4/6;
      }
      .item4 {
        background-color: gold;
        grid-column: 4/6;
        grid-row: 1/4;
      }
      .item5 {
        background-color: orange;
        grid-column: 3/4;
        grid-row: 3/4;
      }
      .item6 {
        background-color: green;
        grid-column: 3/6;
        grid-row: 4/6;
      }
 <div class="container">
      <div class="item item1"></div>
      <div class="item item2"></div>
      <div class="item item3"></div>
      <div class="item item4"></div>
      <div class="item item5"></div>
      <div class="item item6"></div>
</div>

 

출처 - 위니브 (Weniv)