html - template - Centrado en CSS Grid
grid css responsive (5)
¿Tu quieres esto?
html,
body {
margin: 0;
padding: 0;
}
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100vh;
grid-gap: 0px 0px;
}
.left_bg {
display: subgrid;
background-color: #3498db;
grid-column: 1 / 1;
grid-row: 1 / 1;
z-index: 0;
}
.right_bg {
display: subgrid;
background-color: #ecf0f1;
grid-column: 2 / 2;
grid_row: 1 / 1;
z-index: 0;
}
.text {
font-family: Raleway;
font-size: large;
text-align: center;
}
<div class="container">
<!--everything on the page-->
<div class="left_bg">
<!--left background color of the page-->
<div class="text">
<!--left side text content-->
<p>Review my stuff</p>
</div>
</div>
<div class="right_bg">
<!--right background color of the page-->
<div class="text">
<!--right side text content-->
<p>Hire me!</p>
</div>
</div>
</div>
Estoy tratando de crear una página simple con CSS Grid.
Lo que no puedo hacer es centrar el texto del HTML en las celdas de la cuadrícula respectiva.
Intenté colocar contenido en
left_bg
separadas tanto dentro como fuera de los selectores
left_bg
y
right_bg
y jugar con algunas de las propiedades CSS en vano.
¿Cómo hago esto?
html,
body {
margin: 0;
padding: 0;
}
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100vh;
grid-gap: 0px 0px;
}
.left_bg {
display: subgrid;
background-color: #3498db;
grid-column: 1 / 1;
grid-row: 1 / 1;
z-index: 0;
}
.right_bg {
display: subgrid;
background-color: #ecf0f1;
grid-column: 2 / 2;
grid_row: 1 / 1;
z-index: 0;
}
.left_text {
grid-column: 1 / 1;
grid-row: 1 / 1;
position: relative;
z-index: 1;
justify-self: center;
font-family: Raleway;
font-size: large;
}
.right_text {
grid-column: 2 / 2;
grid_row: 1 / 1;
position: relative;
z-index: 1;
justify-self: center;
font-family: Raleway;
font-size: large;
}
<div class="container">
<!--everything on the page-->
<div class="left_bg">
<!--left background color of the page-->
</div>
</div>
<div class="right_bg">
<!--right background color of the page-->
</div>
<div class="left_text">
<!--left side text content-->
<p>Review my stuff</p>
<div class="right_text">
<!--right side text content-->
<p>Hire me!</p>
</div>
</div>
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 se haya implementado la función de
subgrid
, lo que permitirá que los descendientes de los elementos de la cuadrícula respeten 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 centra 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>
El 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 el elemento primario y el contenido como el elemento 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>
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:
- Cómo centrar elementos vertical y horizontalmente en Flexbox
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>
márgenes
auto
Use
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 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 márgenes
auto
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 propiedad de
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>
Tenga en cuenta que para el centrado vertical,
vertical-align: middle
no funcionará.
Esto se debe a que la propiedad de
vertical-align
aplica solo 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é
vertical-align
no 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 valor de
display
de un elemento de cuadrícula se bloquea : si ladisplay
especificada 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 se diseñó originalmente la propiedad de
vertical-align
, 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 general de centrado CSS 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:
- Centrar texto sobre una imagen , o
- Coloque asteriscos (*) sobre los campos de formulario requeridos
Simplemente establezca
position: absolute
en el elemento que se va a centrar, y
position: relative
en 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:
- El elemento no permanecerá centrado, especialmente al cambiar el tamaño de la pantalla
Aquí está la sección sobre posicionamiento absoluto en la especificación de cuadrícula:
Intenta usar flex:
Demo de Plunker: https://plnkr.co/edit/nk02ojKuXD2tAqZiWvf9
/* Styles go here */
html,
body {
margin: 0;
padding: 0;
}
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100vh;
grid-gap: 0px 0px;
}
.left_bg {
background-color: #3498db;
grid-column: 1 / 1;
grid-row: 1 / 1;
z-index: 0;
display: flex;
justify-content: center;
align-items: center;
}
.right_bg {
background-color: #ecf0f1;
grid-column: 2 / 2;
grid_row: 1 / 1;
z-index: 0;
display: flex;
justify-content: center;
align-items: center;
}
.text {
font-family: Raleway;
font-size: large;
text-align: center;
}
HTML
<div class="container">
<!--everything on the page-->
<div class="left_bg">
<!--left background color of the page-->
<div class="text">
<!--left side text content-->
<p>Review my stuff</p>
</div>
</div>
<div class="right_bg">
<!--right background color of the page-->
<div class="text">
<!--right side text content-->
<p>Hire me!</p>
</div>
</div>
</div>
Ni siquiera intentes usar flex; quédate con css grid !! :)
https://jsfiddle.net/ctt3bqr0/
justify-self: center;
align-self: center;
está haciendo el trabajo de centrado aquí.
Si desea centrar algo que está dentro de
div
que está dentro de la celda de la cuadrícula, debe definir una cuadrícula anidada para que funcione.
(Mire el violín de los dos ejemplos que se muestran allí).
https://css-tricks.com/snippets/css/complete-guide-grid/
¡Aclamaciones!
Puede usar flexbox para centrar su texto. Por cierto, no se necesitan contenedores adicionales porque el texto se considera un elemento flexible anónimo.
De las especificaciones de flexbox :
Cada elemento secundario en flujo de un contenedor flexible se convierte en un elemento flexible , y cada corrida contigua de texto que está contenida directamente dentro de un contenedor flexible se envuelve en un elemento flexible anónimo. Sin embargo, un elemento flexible anónimo que contiene solo espacio en blanco (es decir, caracteres que pueden verse afectados por la propiedad de
white-space
) no se representa (como si sedisplay:none
).
Así que solo haga elementos de cuadrícula como contenedores flexibles (
display: flex
), y agregue elementos de
align-items: center
y
justify-content: center
a centro tanto vertical como horizontalmente.
También se realizó la optimización de HTML y CSS:
html,
body {
margin: 0;
padding: 0;
}
.container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 100vh;
font-family: Raleway;
font-size: large;
}
.left_bg,
.right_bg {
display: flex;
align-items: center;
justify-content: center;
}
.left_bg {
background-color: #3498db;
}
.right_bg {
background-color: #ecf0f1;
}
<div class="container">
<div class="left_bg">Review my stuff</div>
<div class="right_bg">Hire me!</div>
</div>