Esta respuesta tiene dos secciones principales:
- Comprender cómo funciona la alineación en CSS Grid.
- Seis métodos para centrarse en CSS Grid.
Si solo está interesado en las soluciones, omita la primera sección.
La estructura y el alcance del diseño de cuadrícula
Para comprender completamente cómo funciona el centrado en un contenedor de cuadrícula, es importante comprender primero la estructura y el alcance del diseño de la cuadrícula.
La estructura HTML de un contenedor de cuadrícula tiene tres niveles:
- El contenedor
- el objeto
- el contenido
Cada uno de estos niveles es independiente de los demás, en términos de aplicación de propiedades de cuadrícula.
El alcance de un contenedor de cuadrícula se limita a una relación padre-hijo.
Esto significa que un contenedor de cuadrícula es siempre el elemento primario y un elemento de cuadrícula es siempre el elemento secundario. Las propiedades de cuadrícula solo funcionan dentro de esta relación.
Los descendientes de un contenedor de cuadrícula más allá de los elementos secundarios no forman parte del diseño de cuadrícula y no aceptarán propiedades de cuadrícula. (Al menos no hasta que subgrid
se haya implementado la característica, lo que permitirá a los descendientes de los elementos de la cuadrícula respetar las líneas del contenedor primario).
Aquí hay un ejemplo de los conceptos de estructura y alcance descritos anteriormente.
Imagine una cuadrícula de tres en raya.
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
Desea que las X y O estén centradas en cada celda.
Entonces aplica el centrado a nivel de contenedor:
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
Pero debido a la estructura y el alcance del diseño de la cuadrícula, justify-items
en el contenedor se centran los elementos de la cuadrícula, no el contenido (al menos no directamente).
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>
Mismo problema con align-items
: El contenido puede estar centrado como un subproducto, pero ha perdido el diseño del diseño.
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>
Para centrar el contenido, debe adoptar un enfoque diferente. Refiriéndose nuevamente a la estructura y el alcance del diseño de la cuadrícula, debe tratar el elemento de la cuadrícula como principal y el contenido como secundario.
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 demo
Seis métodos para centrar en la cuadrícula CSS
Existen varios métodos para centrar elementos de cuadrícula y su contenido.
Aquí hay una grilla básica de 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
Para una forma simple y fácil de centrar el contenido de los elementos de la cuadrícula, use flexbox.
Más específicamente, convierta el elemento de la cuadrícula en un contenedor flexible.
No hay conflicto, violación de especificaciones u otro problema con este método. Es limpio y válido.
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>
Vea esta publicación para una explicación completa:
Diseño de cuadrícula
De la misma manera que un elemento flexible también puede ser un contenedor flexible, un elemento de cuadrícula también puede ser un contenedor de cuadrícula. Esta solución es similar a la solución flexbox anterior, excepto que el centrado se realiza con propiedades de cuadrícula, no flex.
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
márgenes
Úselo margin: auto
para centrar vertical y horizontalmente los elementos de la cuadrícula.
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>
Para centrar el contenido de los elementos de la cuadrícula, debe convertir el elemento en un contenedor de cuadrícula (o flex), envolver los elementos anónimos en sus propios elementos ( ya que CSS no puede orientarlos directamente ) y aplicar los márgenes a los nuevos elementos.
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>
Propiedades de alineación de caja
Cuando considere usar las siguientes propiedades para alinear los elementos de la cuadrícula, lea la sección sobre auto
márgenes de arriba.
align-items
justify-items
align-self
justify-self
https://www.w3.org/TR/css-align-3/#property-index
text-align: center
Para centrar el contenido horizontalmente en un elemento de cuadrícula, puede usar la text-align
propiedad.
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>
Tenga en cuenta que para el centrado vertical, vertical-align: middle
no funcionará.
Esto se debe a que la vertical-align
propiedad solo se aplica a los contenedores en línea y de celda de tabla.
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>
Se podría decir que display: inline-grid
establece un contenedor de nivel en línea, y eso sería cierto. Entonces, ¿por qué no vertical-align
funciona en elementos de cuadrícula?
La razón es que en un contexto de formato de cuadrícula , los elementos se tratan como elementos a nivel de bloque.
6.1. Visualización de elementos de cuadrícula
El display
valor de un elemento de cuadrícula está bloqueado : si el valor especificado display
de un elemento secundario en flujo de un elemento que genera un contenedor de cuadrícula es un valor de nivel en línea, se calcula a su equivalente de nivel de bloque.
En un contexto de formato de bloque , algo para lo que la vertical-align
propiedad fue diseñada originalmente, el navegador no espera encontrar un elemento de nivel de bloque en un contenedor de nivel en línea. Eso es HTML inválido.
Posicionamiento CSS
Por último, hay una solución de centrado de CSS general que también funciona en Grid: posicionamiento absoluto
Este es un buen método para centrar objetos que deben eliminarse del flujo de documentos. Por ejemplo, si quieres:
Simplemente establezca position: absolute
el elemento que se va a centrar y position: relative
el antepasado que servirá como bloque de contención (generalmente es el padre). Algo como esto:
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>
Aquí hay una explicación completa de cómo funciona este método:
Aquí está la sección sobre posicionamiento absoluto en la especificación de cuadrícula: