이 답변에는 두 가지 주요 섹션이 있습니다.
- CSS 그리드에서 정렬이 작동하는 방식 이해
- CSS 그리드를 중심으로하는 6 가지 방법.
솔루션에만 관심이 있다면 첫 번째 섹션을 건너 뛰십시오.
그리드 레이아웃의 구조와 범위
그리드 컨테이너에서 센터링이 작동하는 방식을 완전히 이해하려면 먼저 그리드 레이아웃의 구조와 범위를 이해해야합니다.
그리드 컨테이너 의 HTML 구조 에는 세 가지 수준이 있습니다.
이러한 각 수준은 그리드 속성 적용 측면에서 다른 수준과 독립적입니다.
그리드 컨테이너 의 범위 는 부모-자식 관계로 제한됩니다.
즉, 그리드 컨테이너는 항상 상위이고 그리드 항목은 항상 하위입니다. 그리드 속성은이 관계 내에서만 작동합니다.
자식 이외의 격자 컨테이너의 자손은 격자 레이아웃의 일부가 아니며 격자 속성을 허용하지 않습니다. (적어도 subgrid
기능이 구현 될 때까지는 그리드 항목의 하위 항목이 기본 컨테이너의 라인을 존중할 수 있습니다.)
위에서 설명한 구조 및 범위 개념의 예는 다음과 같습니다.
틱택 토와 같은 격자를 상상해보십시오.
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
X와 O가 각 셀의 중심에 오기를 원합니다.
따라서 컨테이너 레벨에서 중심을 적용하십시오.
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
그러나 그리드 레이아웃의 구조와 범위로 justify-items
인해 컨테이너에서 컨텐츠가 아닌 그리드 항목을 중앙에 배치 합니다 (적어도 직접적이지는 않음).
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
section {
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
같은 문제 align-items
: 콘텐츠가 부산물로 중심에있을 수 있지만 레이아웃 디자인이 손실되었습니다.
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
align-items: center;
}
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
align-items: center;
}
section {
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
콘텐츠를 중앙에 배치하려면 다른 접근 방식이 필요합니다. 그리드 레이아웃의 구조와 범위를 다시 참조하려면 그리드 항목을 부모로, 내용을 자식으로 취급해야합니다.
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
section {
display: flex;
justify-content: center;
align-items: center;
border: 2px solid black;
font-size: 3em;
}
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
section {
display: flex;
justify-content: center;
align-items: center;
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
jsFiddle 데모
CSS 그리드를 중심으로하는 6 가지 방법
모눈 항목과 내용을 중앙에 맞추는 방법에는 여러 가지가 있습니다.
기본 2x2 그리드는 다음과 같습니다.
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
플렉스 박스
그리드 항목의 내용을 간단하고 쉽게 가운데에 맞추려면 flexbox를 사용하십시오.
보다 구체적으로, 그리드 아이템을 플렉스 컨테이너로 만든다.
이 방법에는 충돌, 사양 위반 또는 기타 문제가 없습니다. 깨끗하고 유효합니다.
grid-item {
display: flex;
align-items: center;
justify-content: center;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: flex; /* new */
align-items: center; /* new */
justify-content: center; /* new */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
자세한 설명은이 게시물을 참조하십시오.
그리드 레이아웃
플렉스 아이템이 플렉스 컨테이너 일 수있는 것과 같은 방식으로, 그리드 아이템은 또한 그리드 컨테이너 일 수있다. 이 솔루션은 센터링이 플렉스가 아닌 그리드로 수행된다는 점을 제외하고는 위의 플렉스 박스 솔루션과 유사합니다.
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: grid; /* new */
align-items: center; /* new */
justify-items: center; /* new */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
auto
여백
margin: auto
격자 항목을 세로 및 가로로 가운데에 배치하는 데 사용 합니다.
grid-item {
margin: auto;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
margin: auto;
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
모눈 항목의 내용을 가운데에 배치하려면 항목을 모눈 (또는 flex) 컨테이너로 만들어야하고 익명 항목을 자체 요소로 래핑 하고 (CSS에서 직접 타겟팅 할 수 없기 때문에 ) 여백을 새 요소에 적용해야합니다.
grid-item {
display: flex;
}
span, img {
margin: auto;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: flex;
}
span, img {
margin: auto;
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
상자 정렬 속성
격자 선 항목을 정렬하기 위해 다음 속성 사용을 고려할 때는 auto
위의 여백 섹션을 읽으십시오 .
align-items
justify-items
align-self
justify-self
https://www.w3.org/TR/css-align-3/#property-index
text-align: center
격자 항목에서 내용을 가로로 가운데에 맞추려면 text-align
속성을 사용할 수 있습니다 .
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
text-align: center; /* new */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
수직 센터링의 경우 vertical-align: middle
작동하지 않습니다.
vertical-align
속성이 인라인 및 테이블 셀 컨테이너에만 적용 되기 때문 입니다.
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
text-align: center; /* <--- works */
vertical-align: middle; /* <--- fails */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
display: inline-grid
인라인 레벨 컨테이너 를 설정 한다고 말할 수도 있습니다 . 그렇다면 vertical-align
그리드 항목에서 작동 하지 않는 이유는 무엇입니까?
그 이유는에 있다는 것이다 그리드 포맷 컨텍스트 , 항목 블록 레벨 요소로 취급된다.
6.1. 그리드 아이템 디스플레이
display
그리드 항목 의 값이 차단됩니다 . display
그리드 컨테이너를 생성하는 요소의 인플 로우 하위 항목이 지정된 인라인 레벨 값이면 해당 블록 레벨에 해당하는 값으로 계산됩니다.
A의 블록 서식 환경 의 어떤 vertical-align
속성이 원래 설계되었습니다는 브라우저가 인라인 수준의 컨테이너에 블록 레벨 요소를 찾을 것을 기대하지 않습니다. 유효하지 않은 HTML입니다.
CSS 포지셔닝
마지막으로 그리드에서도 작동하는 일반적인 CSS 센터링 솔루션이 있습니다 : 절대 위치
문서 흐름에서 제거해야하는 개체를 중앙에 배치하는 데 좋은 방법입니다. 예를 들어, 원하는 경우 :
position: absolute
중앙에 배치 할 요소와 position: relative
포함 블록으로 사용될 조상 (일반적으로 부 모임) 에 간단히 설정 하십시오 . 이 같은:
grid-item {
position: relative;
text-align: center;
}
span {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
position: relative;
text-align: center;
}
span, img {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
이 방법의 작동 방식에 대한 완전한 설명은 다음과 같습니다.
그리드 스펙에서 절대 위치에 대한 섹션은 다음과 같습니다.