Centratura nella griglia CSS


179

Sto cercando di creare una semplice pagina con CSS Grid.

Quello che non riesco a fare è centrare il testo dall'HTML alle rispettive celle della griglia.

Ho provato il contenuto messa in separata divs sia all'interno che all'esterno della left_bge right_bgselettori e giocando con alcune delle proprietà CSS senza alcun risultato.

Come faccio a fare questo?

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>


1
Si prega di controllare il link w3.org/Style/Examples/007/center.en.html , spero che sia utile.
Ali,

Risposte:


433

Questa risposta ha due sezioni principali:

  1. Comprensione del funzionamento dell'allineamento nella griglia CSS.
  2. Sei metodi per centrare nella griglia CSS.

Se sei interessato solo alle soluzioni, salta la prima sezione.


Struttura e ambito di layout della griglia

Per comprendere appieno il funzionamento del centraggio in un contenitore della griglia, è importante comprendere innanzitutto la struttura e l'ambito del layout della griglia.

La struttura HTML di un contenitore della griglia ha tre livelli:

  • Il container
  • l'oggetto
  • il contenuto

Ciascuno di questi livelli è indipendente dagli altri, in termini di applicazione delle proprietà della griglia.

L' ambito di un contenitore della griglia è limitato a una relazione padre-figlio.

Ciò significa che un contenitore della griglia è sempre il genitore e un elemento della griglia è sempre il figlio. Le proprietà della griglia funzionano solo all'interno di questa relazione.

I discendenti di un contenitore della griglia oltre i figli non fanno parte del layout della griglia e non accetteranno le proprietà della griglia. (Almeno non fino a quando la subgridfunzione non sarà stata implementata, il che consentirà ai discendenti degli elementi della griglia di rispettare le linee del contenitore primario.)

Ecco un esempio dei concetti di struttura e ambito descritti sopra.

Immagina una griglia simile al tic-tac-toe.

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
}

inserisci qui la descrizione dell'immagine

Vuoi che le X e le O siano centrate in ogni cella.

Quindi applichi il centraggio a livello di contenitore:

article {
  display: inline-grid;
  grid-template-rows: 100px 100px 100px;
  grid-template-columns: 100px 100px 100px;
  grid-gap: 3px;
  justify-items: center;
}

Ma a causa della struttura e della portata del layout della griglia, justify-itemssul contenitore centra gli elementi della griglia, non il contenuto (almeno non direttamente).

inserisci qui la descrizione dell'immagine

Stesso problema con align-items: il contenuto può essere centrato come sottoprodotto, ma hai perso il design del layout.

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;
}

inserisci qui la descrizione dell'immagine

Per centrare il contenuto è necessario adottare un approccio diverso. Facendo nuovamente riferimento alla struttura e all'ambito del layout della griglia, è necessario considerare l'elemento della griglia come elemento principale e il contenuto come elemento secondario.

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;
}

inserisci qui la descrizione dell'immagine

jsFiddle demo


Sei metodi per centrare nella griglia CSS

Esistono diversi metodi per centrare gli elementi della griglia e il loro contenuto.

Ecco una griglia 2x2 di base:

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

Per un modo semplice e facile per centrare il contenuto degli elementi della griglia, utilizzare la flexbox.

Più specificamente, trasforma l'elemento griglia in un contenitore flessibile.

Non vi è alcun conflitto, violazione delle specifiche o altri problemi con questo metodo. È pulito e valido.

grid-item {
  display: flex;
  align-items: center;
  justify-content: center;
}

Vedi questo post per una spiegazione completa:


Layout della griglia

Allo stesso modo in cui un articolo flessibile può anche essere un contenitore flessibile, un elemento griglia può anche essere un contenitore griglia. Questa soluzione è simile alla soluzione flexbox di cui sopra, tranne per il fatto che il centraggio viene eseguito con proprietà grid, non flex.


auto margini

Utilizzare margin: autoper centrare verticalmente e orizzontalmente gli elementi della griglia.

grid-item {
  margin: auto;
}

Per centrare il contenuto degli elementi della griglia è necessario trasformarlo in un contenitore a griglia (o flessibile), avvolgere gli elementi anonimi nei propri elementi ( poiché non possono essere scelti come target direttamente dai CSS ) e applicare i margini ai nuovi elementi.

grid-item {
  display: flex;
}

span, img {
  margin: auto;
}


Proprietà di allineamento casella

Quando si considera l'utilizzo delle seguenti proprietà per allineare gli elementi della griglia, leggere la sezione sui automargini sopra.

  • align-items
  • justify-items
  • align-self
  • justify-self

https://www.w3.org/TR/css-align-3/#property-index


text-align: center

Per centrare il contenuto in orizzontale in un elemento della griglia, è possibile utilizzare la text-alignproprietà

Si noti che per il centraggio verticale, vertical-align: middlenon funzionerà.

Questo perché la vertical-alignproprietà si applica solo ai contenitori inline e a celle di tabella.

Si potrebbe dire che display: inline-gridstabilisce un contenitore a livello di linea e che sarebbe vero. Quindi perché non vertical-alignfunziona con gli elementi della griglia?

Il motivo è che in un contesto di formattazione della griglia , gli elementi vengono trattati come elementi a livello di blocco.

6.1. Visualizzazione elemento griglia

Il displayvalore di un elemento della griglia è bloccato : se il valore specificato displaydi un figlio in-flow di un elemento che genera un contenitore di griglia è un valore a livello in linea, viene calcolato al suo equivalente a livello di blocco.

In un contesto di formattazione a blocchi , qualcosa per cui la vertical-alignproprietà è stata originariamente progettata, il browser non si aspetta di trovare un elemento a livello di blocco in un contenitore a livello inline. Questo è HTML non valido.


Posizionamento CSS

Infine, esiste una soluzione di centraggio CSS generale che funziona anche in Grid: posizionamento assoluto

Questo è un buon metodo per centrare oggetti che devono essere rimossi dal flusso di documenti. Ad esempio, se si desidera:

Basta impostare position: absolutesull'elemento da centrare e position: relativesull'antenato che fungerà da blocco contenitore (di solito è il genitore). Qualcosa come questo:

grid-item {
  position: relative;
  text-align: center;
}

span {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

Ecco una spiegazione completa di come funziona questo metodo:

Ecco la sezione sul posizionamento assoluto nelle specifiche Grid:


Ciao Michael, mi chiedevo se fosse possibile semplicemente usando la griglia per ridimensionare ogni colonna in base alla dimensione della colonna più piccola della riga?
Il Codesee

@TheCodesee, che potrebbe essere possibile, a seconda di tutte le tue esigenze. Hai un esempio di codice? Oppure considera di pubblicare una nuova domanda con tutti i dettagli.
Michael Benjamin,

sono grid-containere grid-itemsono tag HTML?
diEcho,

1
Sono tag HTML personalizzati . Puoi creare i tuoi tag, come ho fatto per questa demo. stackoverflow.com/q/36380449/3597276 @ pro.mean
Michael Benjamin

5
Questa è una risposta meravigliosa, grazie. Mi ha fatto capire, nei tuoi primi due esempi, che tra flexe grid, align-itemsrimane lo stesso ma per qualche ragione justify-contentdiventajustify-items
WoJ

11

Puoi usare flexbox per centrare il testo. A proposito, non sono necessari contenitori aggiuntivi perché il testo è considerato un oggetto flessibile anonimo.

Dalle specifiche di flexbox :

Ogni figlio in-flow di un contenitore flessibile diventa un oggetto flessibile e ogni sequenza contigua di testo direttamente contenuta in un contenitore flessibile viene racchiusa in un oggetto flessibile anonimo . Tuttavia, un oggetto flessibile anonimo che contiene solo spazi bianchi (ovvero caratteri che possono essere influenzati dalla white-spaceproprietà) non viene reso (proprio come se lo fosse display:none).

Quindi, basta creare elementi della griglia come contenitori flessibili ( display: flex) e aggiungere align-items: centere justify-content: centercentrare sia in verticale che in orizzontale.

Ha anche eseguito l'ottimizzazione di HTML e 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>


9

Non provare nemmeno a usare il flex; resta con griglia css !! :)

https://jsfiddle.net/ctt3bqr0/

justify-self: center;
align-self: center;

sta facendo il lavoro di centraggio qui.

Se vuoi centrare qualcosa che è dentro divche è all'interno della cella della griglia devi definire la griglia nidificata per farlo funzionare. (Si prega di guardare il violino entrambi gli esempi mostrati lì.)

https://css-tricks.com/snippets/css/complete-guide-grid/

Saluti!


Mi chiedevo quali fossero le griglie nidificate. Grazie per avermi mostrato come ha fatto immagino. Quindi pensi che il flex dovrebbe essere evitato con la griglia o va bene combinarlo?
barbabietola

Va bene combinare ma devi essere sicuro di utilizzare lo strumento giusto per il lavoro. Trova un po 'di tempo e guarda la presentazione di Rachels, che ti chiarirà molto nell'argomento della griglia CSS. youtu.be/3vJE3bVoF-Q
Konrad Albrecht

Il problema con questo approccio si verifica quando si utilizzano i bordi sugli elementi della griglia ...
Andrew

2
Questo può essere abbreviato da place-self: center;.
DevonDahon,

6

La proprietà di scorciatoia degli oggetti segnaposto CSS imposta rispettivamente le proprietà align-items e justify-items. Se il secondo valore non è impostato, viene utilizzato anche il primo valore.

.parent {
  display: grid;
  place-items: center;
}

place-itemsnon è attualmente supportato in edge
Konrad Albrecht il

1

Prova a usare flex:

Demo 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>

-2

Tu vuoi questo?

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>


1
Non proprio. Anche il testo dovrebbe essere allineato verticalmente.
barbabietola

Usa.text{ font-family: Raleway; font-size: large; text-align: center; -webkit-transform: rotate(-90deg); -moz-transform: rotate(-90deg); }
Renato siqueira il

-2

So che questa domanda ha un paio d'anni, ma sono sorpreso di scoprire che nessuno ha suggerito:

   text-align: center;

questa è una proprietà più universale del contenuto giustificato, e non è assolutamente unica per la griglia, ma trovo che quando si tratta di testo, che è esattamente ciò di cui si pone questa domanda, che allinea il testo al centro senza influire sullo spazio tra gli elementi della griglia o il centraggio verticale. Centra il testo in orizzontale dove si trova sul suo asse verticale. Trovo anche per rimuovere un livello di complessità che giustifica il contenuto e allinea gli elementi. justify-content e align-items influisce sull'intero o sugli elementi della griglia, text-align centra il testo senza influire sul contenitore in cui si trova. Spero che questo aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.