allineare verticalmente con Bootstrap 3


889

Sto usando Twitter Bootstrap 3 e ho problemi quando voglio allineare verticalmente due div, ad esempio - JSFiddle link :

<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<div class="row">
  <div class="col-xs-5">
    <div style="height:5em;border:1px solid #000">Big</div>
  </div>
  <div class="col-xs-5">
    <div style="height:3em;border:1px solid #F00">Small</div>
  </div>
</div>

Il sistema a griglia in Bootstrap utilizza float: left, no display:inline-block, quindi la proprietà vertical-alignnon funziona. Ho provato a usarlo margin-topper risolverlo, ma penso che questa non sia una buona soluzione per il design reattivo.


1
no no, voglio allineare verticalmente il 2 div, no il testo all'interno, qualcosa del genere jsfiddle.net/corinem/Aj9H9 ma in questo esempio non uso bootstrap
corinem


6
IMPORTANTE: entrambe le colonne richiedono la classe "vcenter". Altrimenti non funzionerà. Ho passato un'ora all'ora solo a capirlo.
Cymro,

nessuno della risposta funziona perfettamente su Chrome IE8 e mobile per me con una riga contenente 5 col- (e 3 col-su mobile)
amdev

In Bootstrap 4, l'allineamento verticale centrale è molto diverso: stackoverflow.com/a/41464397/171456
Zim

Risposte:


938

Questa risposta presenta un trucco, ma ti consiglio vivamente di usare la flexbox (come indicato nella risposta di @Haschem ), poiché ora è supportata ovunque.

Collegamento demo:
- Bootstrap 3
- Bootstrap 4 alpha 6

Puoi comunque utilizzare una classe personalizzata quando ne hai bisogno:

.vcenter {
    display: inline-block;
    vertical-align: middle;
    float: none;
}
<div class="row">
    <div class="col-xs-5 col-md-3 col-lg-1 vcenter">
        <div style="height:10em;border:1px solid #000">Big</div>
    </div><!--
    --><div class="col-xs-5 col-md-7 col-lg-9 vcenter">
        <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
</div>

Bootply

L'uso di inline-blockaggiunge spazio extra tra i blocchi se si lascia uno spazio reale nel proprio codice (come ...</div> </div>...). Questo spazio extra rompe la nostra griglia se le dimensioni delle colonne aggiungono fino a 12:

<div class="row">
    <div class="col-xs-6 col-md-4 col-lg-2 vcenter">
        <div style="height:10em;border:1px solid #000">Big</div>
    </div>
    <div class="col-xs-6 col-md-8 col-lg-10 vcenter">
        <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
</div>

Qui, abbiamo spazi extra tra <div class="[...] col-lg-2">e <div class="[...] col-lg-10">(un ritorno a capo e 2 schede / 8 spazi). E così...

Inserisci qui la descrizione dell'immagine

Calciamo questo spazio extra !!

<div class="row">
    <div class="col-xs-6 col-md-4 col-lg-2 vcenter">
        <div style="height:10em;border:1px solid #000">Big</div>
    </div><!--
    --><div class="col-xs-6 col-md-8 col-lg-10 vcenter">
        <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
</div>

Inserisci qui la descrizione dell'immagine

Notare i commenti apparentemente inutili <!-- ... -->? Sono importanti : senza di essi, lo spazio bianco tra gli <div>elementi occuperà spazio nel layout, rompendo il sistema a griglia.

Nota: Bootply è stato aggiornato


18
Ciò si interrompe se si specificano griglie di colonne che si sommano a 12 (ad es. Utilizzando col-lg-2e col-lg-10). È interessante notare che se aggiungi il seguente codice JS (supponendo jQuery), riesce a risolversi automaticamente:$('.row').html($('.vcenter'));
Jake Z

8
@pasemes Questo è causato dallo inline-block spazio (ben noto) extra . Offro una soluzione nella mia modifica.
zessx,

92
La parte con i commenti vuoti sembra una magia profonda, oscura, malvagia. E questo è. Ma qualcuno da qualche parte ha deciso che dovrebbe funzionare, quindi funziona.
cfstras,

5
Sorpreso che nessuno lo abbia ancora menzionato, ma, al posto dei commenti, puoi impostare "font-size: 0;" sul genitore dei div del blocco inline per rimuovere lo "spazio misterioso"
Poff

4
Non è necessario utilizzare alcun commento html <! - -> o qualsiasi codice javascript per risolvere il problema di spazio aggiuntivo, esiste un trucco CSS semplice ed efficace: margini negativi. Aggiungi margin-right: -4px; alla classe .vcenter. Testato e funzionante con tutti i browser (tranne i vecchi IE6 e IE7 ... ma a chi importa della preistoria;))
Frank

897

Layout della scatola flessibile

Con l'avvento del CSS Flexible Box , molti degli incubi dei web designer 1 sono stati risolti. Uno dei più confusi, l'allineamento verticale. Ora è possibile anche ad altezze sconosciute .

"Due decenni di hack di layout stanno finendo. Forse non domani, ma presto, e per il resto della nostra vita."

- Il leggendario CSS Eric Meyer al W3Conf 2013

Flexible Box (o in breve, Flexbox), è un nuovo sistema di layout appositamente progettato per scopi di layout. Le specifiche indicano :

Il layout flessibile è superficialmente simile al layout a blocchi. Manca molte delle più complesse proprietà centrate sul testo o sul documento che possono essere utilizzate nel layout a blocchi, come float e colonne. In cambio guadagna strumenti semplici e potenti per la distribuzione dello spazio e l'allineamento dei contenuti in modi spesso necessari alle webapp e alle pagine Web complesse.

Come può essere d'aiuto in questo caso? Bene vediamo.


Colonne allineate verticali

Usando Twitter Bootstrap abbiamo .rowalcuni messaggi .col-*. Tutto quello che dobbiamo fare è visualizzare il .row2 desiderato come una scatola contenitore flessibile e quindi allineare verticalmente tutti gli elementi flessibili (le colonne) in base alla align-itemsproprietà.

ESEMPIO QUI (leggere attentamente i commenti)

<div class="container">
    <div class="row vertical-align"> <!--
                    ^--  Additional class -->
        <div class="col-xs-6"> ... </div>
        <div class="col-xs-6"> ... </div>
    </div>
</div>
.vertical-align {
    display: flex;
    align-items: center;
}

Il risultato

Colonne allineate verticali in Twitter Bootstrap

L'area colorata mostra il riquadro di riempimento delle colonne.

Chiarire align-items: center

8.3 Allineamento trasversale: la align-itemsproprietà

Gli articoli flessibili possono essere allineati nell'asse trasversale della linea corrente del contenitore flessibile, simile justify-contentma nella direzione perpendicolare. align-itemsimposta l'allineamento di default per tutti gli elementi del contenitore flessibile, tra anonimi oggetti flex .

align-items: center; Per valore centrale, la casella del margine dell'elemento flessibile è centrata nell'asse trasversale all'interno della linea.


Allerta grande

Nota importante n. 1: Twitter Bootstrap non specifica le widthcolonne in dispositivi extra piccoli a meno che tu non dia una delle .col-xs-#classi alle colonne.

Pertanto, in questa particolare demo, ho usato le .col-xs-*classi per visualizzare correttamente le colonne in modalità mobile, perché specifica widthesplicitamente la colonna.

Ma in alternativa si può spegnere il layout di Flexbox semplicemente cambiando display: flex;a display: block;in dimensioni dello schermo specifici. Per esempio:

/* Extra small devices (767px and down) */
@media (max-width: 767px) {
    .row.vertical-align {
        display: block; /* Turn off the flexible box layout */
    }
}

Oppure puoi specificare .vertical-align solo su dimensioni dello schermo specifiche in questo modo:

/* Small devices (tablets, 768px and up) */
@media (min-width: 768px) {
    .row.vertical-align {
        display: flex;
        align-items: center;
    }
}

In tal caso, seguirei l' approccio di @KevinNelson .

Nota importante n. 2: prefissi del fornitore omessi per brevità. La sintassi di Flexbox è stata modificata nel tempo. La nuova sintassi scritta non funzionerà con le versioni precedenti dei browser Web (ma non così vecchia come Internet Explorer 9! Flexbox è supportato su Internet Explorer 10 e versioni successive).

Ciò significa che è necessario utilizzare anche proprietà con prefisso fornitore come display: -webkit-boxe così via in modalità di produzione.

Se fai clic su "Attiva / disattiva vista compilata" nella Demo , vedrai la versione con prefisso delle dichiarazioni CSS (grazie a Autoprefixer ).


Colonne a tutta altezza con contenuti allineati verticali

Come si vede nella demo precedente , le colonne (gli oggetti flessibili) non sono più alte del loro contenitore (la scatola del contenitore flessibile. Cioè l' .rowelemento).

Ciò è dovuto all'uso del centervalore per la align-itemsproprietà. Il valore predefinito è in stretchmodo che gli elementi possano riempire l'intera altezza dell'elemento principale.

Per risolvere questo problema, puoi aggiungere anche display: flex;alle colonne:

ESEMPIO QUI (Ancora una volta, attenzione ai commenti)

.vertical-align {
  display: flex;
  flex-direction: row;
}

.vertical-align > [class^="col-"],
.vertical-align > [class*=" col-"] {
  display: flex;
  align-items: center;     /* Align the flex-items vertically */
  justify-content: center; /* Optional, to align inner flex-items
                              horizontally within the column  */
}

Il risultato

Colonne a tutta altezza con contenuti allineati verticali nel Bootstrap di Twitter

L'area colorata mostra il riquadro di riempimento delle colonne.

Ultimo, ma non meno importante, notare che le demo e gli snippet di codice qui sono pensati per darti un'idea diversa, per fornire un approccio moderno per raggiungere l'obiettivo. Si prega di tenere presente la sezione " Big Alert " se si intende utilizzare questo approccio in siti Web o applicazioni reali.


Per ulteriori letture incluso il supporto del browser, queste risorse sarebbero utili:


1. Allineare verticalmente un'immagine all'interno di un div con un'altezza reattiva 2. È meglio utilizzare una classe aggiuntiva per non alterare l'impostazione predefinita di Bootstrap di Twitter .row.


9
Dopo una piccola ricerca, ho effettivamente scoperto che HTML5Please.com afferma che c'è abbastanza supporto per usarlo. Quindi è davvero fantastico! html5please.com/#flexbox
Alec Moore,

6
Questa è in realtà la soluzione migliore e dovrebbe avere più supporto. E ovviamente noi sviluppatori dobbiamo usarlo il più possibile per propagarlo.
Mateus Neves,

12
Ho provato questo e non funzionavo per me nel modo previsto, fino a quando ho modificato i tuoi violini e ho capito che questo è totalmente inutile e una perdita di tempo. In questo modo manca completamente il punto di progettazione reattiva, poiché le colonne non si impilano più una sopra l'altra quando non si adattano allo schermo, rendendo quindi la necessità di bootstrap totalmente inutile e rendendo il tuo sito non rispondente. Per vedere cosa intendo, cambia qualsiasi col-xs- * in col-xs-12 nei rispettivi esempi, rendi lo schermo del tuo browser molto piccolo (come un dispositivo mobile) e vedi i risultati: niente più reattività.
Pere,

8
@HashemQolami sebbene tu stia usando le classi nominate col-*, i tuoi violini / codici non usano il bootstrap, quindi sono fuorvianti. I tuoi esempi non funzionano con bootstrap; il suo sistema di griglia non è basato su flex, quindi sono incompatibili. Prova semplicemente qualsiasi tuo esempio in una pagina basata su bootstrap e ti accorgerai che non funzionano.
Pere,

5
@Hashem Qolami non riesce ancora a trovare alcun caso d'uso per i tuoi suggerimenti. Una delle caratteristiche fondamentali e discrete di Bootstrap è che le colonne si impilano una sull'altra una volta che non si adattano orizzontalmente. Ciò non accade più con la tua soluzione. Il sistema a griglia funziona anche se carichi solo gli stili, come puoi vedere in questo violino . No js; solo css. Cambia la dimensione dell'area di rendering e risponderà. Ciò non accade in nessuno dei tuoi esempi. L'approccio "mobile first" viene perso, rendendo Bootstrap superfluo. Quindi questa risposta è errata, fuorviante o incompleta.
Pere,

48

Il codice seguente ha funzionato per me:

.vertical-align {
    display: flex;
    align-items: center;
}

4
Soluzione più semplice IMHO
saiyancoder il

3
Qualcuno ha una soluzione che funziona con una singola colonna? Ho una fila, e poi dentro solo un col-md-6. Questa soluzione e il resto di quelli flexbox funzionano solo quando ci sono 2 colonne
Ka Mok,

36

Aggiornamento 2020

So che la domanda originale era per Bootstrap 3, ma ora che Bootstrap 4 è stato rilasciato, ecco alcune indicazioni aggiornate sul centro verticale.

Importante! Il centro verticale è relativo all'altezza del genitore

Se il genitore dell'elemento che stai cercando di centrare non ha un'altezza definita , nessuna delle soluzioni di centraggio verticale funzionerà!

Bootstrap 4

Ora che Bootstrap 4 è flexbox per impostazione predefinita, ci sono molti approcci diversi all'allineamento verticale usando: margini automatici , programmi di utilità flexbox o programmi di visualizzazione insieme a programmi di allineamento verticale . Inizialmente "utils di allineamento verticale" sembra ovvio, ma funzionano solo con elementi di visualizzazione inline e table. Ecco alcune opzioni di centraggio verticale Bootstrap 4.


1 - Centro verticale usando i margini automatici:

Un altro modo per centrare verticalmente è usare my-auto. Questo centrerà l'elemento all'interno del suo contenitore. Ad esempio, h-100rende la riga a tutta altezza e my-autocentrerà verticalmente la col-sm-12colonna.

<div class="row h-100">
    <div class="col-sm-12 my-auto">
        <div class="card card-block w-25">Card</div>
    </div>
</div>

Bootstrap 4 - Centro verticale usando la demo dei margini automatici

my-auto rappresenta i margini sull'asse y verticale ed equivale a:

margin-top: auto;
margin-bottom: auto;

2 - Centro verticale con Flexbox:

Colonne della griglia centrale verticale

Poiché Bootstrap 4 .rowè ora display:flexpuoi semplicemente usare align-self-centersu qualsiasi colonna per centrarlo verticalmente ...

       <div class="row">
           <div class="col-6 align-self-center">
                <div class="card card-block">
                 Center
                </div>
           </div>
           <div class="col-6">
                <div class="card card-inverse card-danger">
                    Taller
                </div>
          </div>
    </div>

oppure, usa align-items-centertutto .rowper allineare verticalmente al centro tutto col-*nella riga ...

       <div class="row align-items-center">
           <div class="col-6">
                <div class="card card-block">
                 Center
                </div>
           </div>
           <div class="col-6">
                <div class="card card-inverse card-danger">
                    Taller
                </div>
          </div>
    </div>

Bootstrap 4 - Demo di colonne verticali diverse di altezza centrale


3 - Centro verticale utilizzando gli strumenti di visualizzazione:

Bootstrap 4 ha utils visualizzazione che possono essere utilizzati per display:table, display:table-cell, display:inline, ecc .. Questi possono essere usati con i utils di allineamento verticale alla linea di allineamento, linea-blocco o elementi di cella di tabella.

<div class="row h-50">
    <div class="col-sm-12 h-100 d-table">
        <div class="card card-block d-table-cell align-middle">
            I am centered vertically
        </div>
    </div>
</div>

Bootstrap 4 - Centro verticale usando Demo utils display

Vedi anche: Centro di allineamento verticale in Bootstrap 4


Bootstrap 3

Metodo Flexbox sul contenitore degli articoli da centrare:

.display-flex-center {
    display: flex;
    align-items: center;
}

Trasforma il metodo translateY:

.transform-center-parent {
    position: relative;
    transform-style: preserve-3d;
}

.transform-center {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}

Visualizza metodo in linea:

.display-inline-block {
    display: inline;
}
.display-inline-block > div {
    display: inline-block;
    float: none;
    vertical-align: middle;
}

Demo dei metodi di centraggio di Bootstrap 3


1
Ecco la documentazione Bootstrap per mx-auto(centraggio orizzontale), quindi ha senso centrare my-autoverticalmente (asse y).
xinthose,

26

Prova questo nel CSS del div:

display: table-cell;
vertical-align: middle;

4
l'elemento genitore deve essere visualizzato: tabella
Az.Youness

21

Ho pensato di condividere la mia "soluzione" nel caso in cui fosse utile a chiunque non avesse familiarità con le query @media stesse.

Grazie alla risposta di @ HashemQolami, ho creato alcune query multimediali che funzionerebbero in modo mobile come le classi col- * in modo da poter impilare il col * per dispositivo mobile ma visualizzarle allineate verticalmente al centro per schermi più grandi, ad es.

<div class='row row-sm-flex-center'>
    <div class='col-xs-12 col-sm-6'></div>
    <div class='col-xs-12 col-sm-6'></div>
</div>

.

.row-xs-flex-center {
    display:flex;
    align-items:center;
}
@media ( min-width:768px ) {
    .row-sm-flex-center {
        display:flex;
        align-items:center;
    }
}
@media ( min-width: 992px ) {
    .row-md-flex-center {
        display:flex;
        align-items:center;
    }
}
@media ( min-width: 1200px ) {
    .row-lg-flex-center {
        display:flex;
        align-items:center;
    }
}

Layout più complicati che richiedono un diverso numero di colonne per risoluzione dello schermo (ad es. 2 righe per -xs, 3 per -sm e 4 per -md, ecc.) Avrebbero bisogno di un finagling più avanzato, ma per una semplice pagina con -xs impilati e -sm e più grandi nelle righe, funziona benissimo.


Nel mio caso ho dovuto aggiungere clear: both;a alle classi all'interno delle media query per farlo funzionare.
motaa,

1
@motaa, scusami per la confusione ... Alla moda di BS3, come puoi vedere nel mio esempio HTML, lo uso come .rowmodificatore ... quindi dovrebbe apparire class="row row-sm-flex-center". La .rowdefinizione di BS3 gestisceclear:both;
Kevin Nelson

Avrei dovuto analizzare il tuo codice html in modo più approfondito. :) Anche io uso il modificatore .row ma nel mio caso (wordpress), è stato cambiato nel tema principale che alla fine mi ha portato ad aggiungere di clear: both;nuovo.
motaa,

21

A seguito della risposta accettata, se non si desidera personalizzare il markup, per la separazione delle preoccupazioni o semplicemente perché si utilizza un CMS, la seguente soluzione funziona correttamente:

.valign {
  font-size: 0;
}

.valign > [class*="col"] {
  display: inline-block;
  float: none;
  font-size: 14px;
  font-size: 1rem;
  vertical-align: middle;
}
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
<div class="row valign">
   <div class="col-xs-5">
      <div style="height:5em;border:1px solid #000">Big</div>
   </div>
   <div class="col-xs-5">
       <div style="height:3em;border:1px solid #F00">Small</div>
   </div>
 </div>

La limitazione qui è che non è possibile ereditare la dimensione del carattere dall'elemento padre poiché la riga imposta la dimensione del carattere su 0 per rimuovere lo spazio bianco.



17

Questa è la mia soluzione Aggiungi questa classe al tuo contenuto CSS.

.align-middle {
  display: flex;
  justify-content: center;
  align-items: center;
}

Quindi il tuo HTML sarebbe simile al seguente:

<div class="col-xs-12 align-middle">
  <div class="col-xs-6" style="background-color:blue;">
    <h3>Item</h3>
    <h3>Item</h3>
  </div>
  <div class="col-xs-6" style="background-color:red;">
    <h3>Item</h3>
  </div>
</div>

.align-middle {
  display: flex;
  justify-content: center;
  align-items: center;
}
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<!DOCTYPE html>
    <title>Title</title>
  </head>
  <body>
    <div class="container">
      <div class="row">
        <div class="col-xs-12 align-middle">
          <div class="col-xs-6" style="background-color:blue;">
            <h3>Item</h3>
            <h3>Item</h3>
          </div>
          <div class="col-xs-6" style="background-color:red;">
            <h3>Item</h3>
          </div>
        </div>
      </div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
  </body>
</html>


1
Questo rompe le classi responsive, come col-md-6
Lucas Bustamante,

15

L'ho appena fatto e fa quello che voglio che faccia.

.align-middle {
  margin-top: 25%;
  margin-bottom: 25%;
}

E ora la mia pagina sembra

<div class='container-fluid align-middle'>
    content

 +--------------------------------+
 |                                |
 |  +--------------------------+  |
 |  |                          |  |
 |  |                          |  |
 |  |                          |  |
 |  |                          |  |
 |  |                          |  |
 |  +--------------------------+  |
 |                                |
 +--------------------------------+

Il problema di questo approccio è che non sembra funzionare quando il DIV ha un'altezza specificata: jsfiddle.net/4bpxen25/1 mi consiglia: stackoverflow.com/a/28519318/1477388
user1477388

10

Trovo sinceramente che il seguente codice funzioni utilizzando Chrome e non altri browser rispetto alla risposta attualmente selezionata:

.v-center {
    display:table!important; height:125px;
}

.v-center div[class*='col-'] {
   display: table-cell!important;
   vertical-align:middle;
   float:none;
}
.v-center img {
   max-height:125px;
}

Link Bootply

Potrebbe essere necessario modificare le altezze (in particolare su .v-center) e rimuovere / cambiare div in base div[class*='col-']alle proprie esigenze.


8

Ho riscontrato questo stesso problema. Nel mio caso non conoscevo l'altezza del contenitore esterno, ma è così che l'ho riparato:

Innanzitutto imposta l'altezza per il tuo htmle gli bodyelementi in modo che siano al 100%. Questo è importante! Senza questo, gli elementi htmle bodyerediteranno semplicemente l'altezza dei loro figli.

html, body {
   height: 100%;
}

Poi ho avuto una classe container esterna con:

.container {
  display: table;
  width: 100%;
  height: 100%; /* For at least Firefox */
  min-height: 100%;
}

E infine il contenitore interno con classe:

.inner-container {
  display: table-cell;
  vertical-align: middle;
}

HTML è semplice come:

<body>
   <div class="container">
     <div class="inner-container">
        <p>Vertically Aligned</p>
     </div>
   </div>
</body>

Questo è tutto ciò che serve per allineare verticalmente i contenuti. Dai un'occhiata al violino:

Jsfiddle


8

Non c'è bisogno di tabelle e celle di tabella. Può essere raggiunto facilmente usando la trasformazione.

Esempio: http://codepen.io/arvind/pen/QNbwyM

Codice:

.child {
  height: 10em;
  border: 1px solid green;
  position: relative;
}
.child-content {
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<div class="row parent">
  <div class="col-xs-6 col-lg-6 child">
    <div class="child-content">
      <div style="height:4em;border:1px solid #000">Big</div>
    </div>
  </div>
  <div class="col-xs-6 col-lg-6 child">
    <div class="child-content">
      <div style="height:3em;border:1px solid #F00">Small</div>
    </div>
  </div>
</div>


7

Se stai usando Meno versione di Bootstrap e stai compilando il CSS da solo, puoi utilizzare alcune classi di utilità da utilizzare con le classi Bootstrap.

Ho trovato che funzionano fantasticamente bene dove voglio preservare la reattività e la configurabilità del sistema di griglia Bootstrap (come usare -mdo-sm ), ma voglio che tutte le colonne di una determinata riga abbiano tutte la stessa altezza verticale (in modo che io possa quindi allineare verticalmente il loro contenuto e fare in modo che tutte le colonne della riga condividano un centro comune).

CSS / Meno:

.display-table {
    display: table;
    width: 100%;
}
.col-md-table-cell {
    @media (min-width: @screen-md-min) {
        display: table-cell;
        vertical-align: top;
        float: none;
    }
}
.col-sm-table-cell {
    @media (min-width: @screen-sm-min) {
        display: table-cell;
        vertical-align: top;
        float: none;
    }
}
.vertical-align-middle {
    vertical-align: middle;
}

HTML:

<div class="row display-table">
    <div class="col-sm-5 col-sm-table-cell vertical-align-middle">
        ...
    </div>
    <div class="col-sm-5 col-sm-table-cell vertical-align-middle">
        ...
    </div>
</div>

6

Ho elaborato un po ' la risposta di zessx , al fine di renderlo più facile da usare quando si mischiano colonne di dimensioni diverse su schermi di dimensioni diverse.

Se usi Sass , puoi aggiungerlo al tuo file scss:

@mixin v-col($prefix, $min-width) {
    @media (min-width: $min-width) {
        .col-#{$prefix}-v {
            display: inline-block;
            vertical-align: middle;
            float: none;
        }
    }
}

@include v-col(lg, $screen-lg);
@include v-col(md, $screen-md);
@include v-col(sm, $screen-sm);
@include v-col(xs, $screen-xs);

Che genera il seguente CSS (che puoi usare direttamente nei tuoi fogli di stile, se non stai usando Sass):

@media (min-width: 1200px) {
    .col-lg-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: 992px) {
    .col-md-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: 768px) {
    .col-sm-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

@media (min-width: 480px) {
    .col-xs-v {
        display: inline-block;
        vertical-align: middle;
        float: none;
    }
}

Ora puoi usarlo sulle tue colonne reattive in questo modo:

<div class="container">
    <div class="row">
        <div class="col-sm-7 col-sm-v col-xs-12">
            <p>
                This content is vertically aligned on tablets and larger. On mobile it will expand to screen width.
            </p>
        </div><div class="col-sm-5 col-sm-v col-xs-12">
            <p>
                This content is vertically aligned on tablets and larger. On mobile it will expand to screen width.
            </p>
        </div>
    </div>
    <div class="row">
        <div class="col-md-7 col-md-v col-sm-12">
            <p>
                This content is vertically aligned on desktops and larger. On tablets and smaller it will expand to screen width.
            </p>
        </div><div class="col-md-5 col-md-v col-sm-12">
            <p>
                This content is vertically aligned on desktops and larger. On tablets and smaller it will expand to screen width.
            </p>
        </div>
    </div>
</div>

Questo è davvero carino!
Pietro Coelho,

Eseguito l'upgrade solo a causa della breve sintassi e dell'uso delle variabili LESS.
Eduard Luca,

5

I comportamenti Flex sono supportati in modo nativo da Bootstrap 4. Aggiungi d-flex align-items-centerinrow div. Non è più necessario modificare il contenuto CSS.

Esempio semplice: http://jsfiddle.net/vgks6L74/

<!-- language: html -->
<div class="row d-flex align-items-center">
  <div class="col-5 border border-dark" style="height:10em">  Big </div>
  <div class="col-2 border border-danger" style="height:3em"> Small </div>
</div>

Con il tuo esempio: http://jsfiddle.net/7zwtL702/

<!-- language: html -->
<div class="row d-flex align-items-center">
    <div class="col-5">
        <div class="border border-dark" style="height:10em">Big</div>
    </div>
    <div class="col-2">
        <div class="border border-danger" style="height:3em">Small</div>
   </div>
</div>

Fonte: Flex · Bootstrap


4

OK, per sbaglio ho mescolato alcune soluzioni e finalmente funziona ora per il mio layout in cui ho provato a creare una tabella 3x3 con colonne Bootstrap con la risoluzione più piccola.

/* Required styles */

#grid a {
  display: table;
}

#grid a div {
  display: table-cell;
  vertical-align: middle;
  float: none;
}


/* Additional styles for demo: */

body {
  padding: 20px;
}

a {
  height: 40px;
  border: 1px solid #444;
}

a > div {
  width: 100%;
  text-align: center;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />

<div id="grid" class="clearfix row">
  <a class="col-xs-4 align-center" href="#">
    <div>1</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>2</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>3</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>4</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>5</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>6</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>7</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>8</div>
  </a>
  <a class="col-xs-4 align-center" href="#">
    <div>9</div>
  </a>
</div>


2

    div{
        border: 1px solid;
    }
    span{
        display: flex;
        align-items: center;
    }
    .col-5{
        width: 100px;
        height: 50px;
        float: left;
        background: red;
    }
    .col-7{
        width: 200px;
        height: 24px;

        float: left;
        background: green;
    }
    <span>
        <div class="col-5">
        </div>
        <div class="col-7"></div>
    </span>


1

Prova questo,

.exe {
  font-size: 0;
}

.exe > [class*="col"] {
  display: inline-block;
  float: none;
  font-size: 14px;
  font-size: 1rem;
  vertical-align: middle;
}
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet"/>
<div class="row  exe">
   <div class="col-xs-5">
      <div style="height:5em;border:1px solid grey">Big</div>
   </div>
   <div class="col-xs-5">
       <div style="height:3em;border:1px solid red">Small</div>
   </div>
 </div>


1

Esistono diversi modi per farlo:

  1. Uso 

    display: table-cell;
    vertical-align: middle;

    e il CSS del contenitore a

    display: table;
  2. Utilizzare l'imbottitura insieme allo schermo multimediale per modificare l'imbottitura in relazione alle dimensioni dello schermo. Schermata di Google @media per saperne di più.

  3. Usa un'imbottitura relativa

    Vale a dire, specificare il riempimento in termini di%


0

Con Bootstrap 4 (che è attualmente in Alpha) puoi usare la .align-items-centerclasse. Quindi puoi mantenere il carattere reattivo di Bootstrap. Funziona subito bene per me. Vedi la documentazione di Bootstrap 4 .


Questo funziona solo per alcuni elementi quando viene visualizzato l'elemento contenitore: flex.
Zim,

0

HTML

<div class="row">
    <div class="col-xs-2 pull-bottom"
         style="height:100px;background:blue">
    </div>
    <div class="col-xs-8 pull-bottom"
         style="height:50px;background:yellow">
    </div>
</div>

CSS

.pull-bottom {
    display: inline-block;
    vertical-align: bottom;
    float: none;
}

-4

Mi sono imbattuto nella stessa situazione in cui volevo allineare verticalmente alcuni elementi div in una riga e ho scoperto che le classi Bootstrap col-xx-xx applicano lo stile al div come float: left.

Ho dovuto applicare lo stile agli elementi div come style = "Float: none" e tutti i miei elementi div hanno iniziato allineati verticalmente. Ecco l'esempio funzionante:

<div class="col-lg-4" style="float:none;">

JsFiddle Link

Nel caso in cui qualcuno volesse leggere di più sulla proprietà float:

W3Schools - Float


Questo non funziona per me. Ho provato su Firefox e Chrome. Tutti i pannelli sono impilati verticalmente.
Alf

float: nessuno li farà impilare verticalmente, ecco come dovrebbe funzionare.
ATHER,

1
Quindi è la risposta giusta per una domanda diversa. ;)
Alf
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.