Come allineare gli elementi della griglia in basso nel layout fluido bootstrap


123

Ho un layout fluido usando il bootstrap di Twitter, in cui ho una riga con due colonne. La prima colonna ha molti contenuti, che voglio riempire normalmente. La seconda colonna ha solo un pulsante e del testo, che voglio allineare in basso rispetto alla cella nella prima colonna.

Ecco cosa ho:

-row-fluid-------------------------------------
+-span6----------+ +-span6----------+
|                | |short content   |
| content        | +----------------+
| that           | 
| is tall        |    
|                |
+----------------+
-----------------------------------------------

Ecco cosa voglio:

-row-fluid-------------------------------------
+-span6----------+
|                |
| content        |
| that           | 
| is tall        | +-span6----------+    
|                | |short content   |
+----------------+ +----------------+
-----------------------------------------------

Ho visto soluzioni che rendono il primo span un'altezza assoluta e posizionano il secondo span rispetto ad esso, ma sarebbe preferibile una soluzione in cui non dovessi specificare l'altezza assoluta dei miei div. Sono anche aperto a un ripensamento completo di come ottenere lo stesso effetto. Non sono sposato a questo uso delle impalcature, mi è solo sembrato che avesse più senso.

Questo layout come un violino:

http://jsfiddle.net/ryansturmer/A7buv/3/


non potresti aggiungere un margine superiore di circa 200 px al tuo .rightspan?
Richlewis

La scorciatoia per CSS risponde solo a questa domanda: stackoverflow.com/a/14223553/259725
Adam

bootply.com/125740# (Scusa se dimentico la risposta a quale domanda SO da cui proviene questo link.)
ToolmakerSteve

Risposte:


50

Nota: per gli utenti di Bootstrap 4+, considera la soluzione di Christophe (Bootstrap 4 ha introdotto flexbox, che fornisce una soluzione più elegante solo CSS). Quanto segue funzionerà per le versioni precedenti di Bootstrap ...


Vedi http://jsfiddle.net/jhfrench/bAHfj/ per una soluzione funzionante.

//for each element that is classed as 'pull-down', set its margin-top to the difference between its own height and the height of its parent
$('.pull-down').each(function() {
  var $this = $(this);
  $this.css('margin-top', $this.parent().height() - $this.height())
});

Il lato positivo:

  • nello spirito delle classi helper esistenti di Bootstrap , ho chiamato la classepull-down .
  • solo l'elemento che viene "abbattuto" deve essere classificato, quindi ...
  • ... è riutilizzabile per diversi tipi di elementi (div, span, section, p, ecc.)
  • è abbastanza ben supportato (tutti i principali browser supportano margin-top)

Ora la cattiva notizia:

  • richiede jQuery
  • non è, come scritto, reattivo (scusa)

3
per la reattività, forse agganciare window.resize? stackoverflow.com/a/2969091/244811
Scott Weaver

22
Non utilizzare una soluzione jQuery per qualcosa che potrebbe essere una soluzione CSS. Ci sono molte ragioni per evitare la manipolazione del DOM per scopi di stile.
Arconico

1
@Archonic: qual è questa soluzione solo CSS? Lo preferirei anche a una soluzione dipendente da JS. Tieni a mente la clausola di OP: "sarebbe preferibile una soluzione in cui non dovevo specificare l'altezza assoluta dei miei div"
Jeromy French

1
@cfx Ha pubblicato una soluzione solo css con un violino che non richiede altezze assolute.
Archonic

1
D'altra parte, la mia soluzione consente all'utente di allineare i singoli elementi in basso (dando un comportamento simile a Bootstrap .pull-lefte .pull-right), senza influenzare i fratelli. Può essere fatto con la soluzione solo CSS?
Jeromy French

68

Questa è una soluzione aggiornata per Bootstrap 3 (dovrebbe funzionare per le versioni precedenti) che utilizza solo CSS / LESS:

http://jsfiddle.net/silb3r/0srp42pb/11/

Imposta la dimensione del carattere su 0 sulla riga (altrimenti ti ritroverai con uno spazio fastidioso tra le colonne), quindi rimuovi i float delle colonne, imposta la visualizzazione su inline-block, reimposta la dimensione del carattere e quindi vertical-alignpuò essere impostato su tutto ciò di cui hai bisogno.

Nessun jQuery richiesto.


Voglio mantenerlo a metà. Tuttavia nel tuo jsfiddle quando ho provato "vertical-allign: middle", non ha funzionato. qualche idea?
gioia

Prova a impostare entrambe le divs su vertical-align: middle;.
cfx

6
Questa è l'unica risposta accettabile! @ Lukas ignorerà le larghezze sulle colonne che non riempiono una riga. E manipolazione DOM per lo styling ... SMH.
Arconico

Il tuo CSS è codificato dalla riga (in particolare .myrow) ... questo non significa che non puoi avere una colonna allineata in alto, una colonna allineata in basso e una terza colonna allineata in alto?
Jeromy French

Grazie ! Funziona bene con Bootstrap 4.
Elie Teyssedou

33

Puoi usare flex:

@media (min-width: 768px) {
  .row-fluid {
    display: flex;
    align-items: flex-end;
  }
}

Usare felx è molto bello e diretto secondo me e ho avuto un vantaggio in più usando "align-items: baseline" che era fantastico con caratteri differenti nei diversi elementi da allineare.
Alessandro Dentella

Ottimo suggerimento per usare il flex. Semplice, diretto e utilizza Bootstrap per risolvere un problema Bootstrap.
CheddarMonkey

1
Risposta brillante e funziona perfettamente con bootstrap senza bisogno di javascript / jquery.
Filth

1
Sì, aggiungilo a una normale riga di bootstrap e bam, funziona. Bellissimo. In che modo una soluzione jquery non reattiva è diventata la risposta migliore? Non lo sapremo mai.
Levi Fuller

@LeviFuller La mia ipotesi è che questa soluzione supporta solo un punto di interruzione
clamchoda

27

Devi aggiungere un po 'di stile per span6, smthg come quello:

.row-fluid .span6 {
  display: table-cell;
  vertical-align: bottom;
  float: none;
}

e questo è il vostro violino: http://jsfiddle.net/sgB3T/


4
Creerei una classe CSS specifica invece di impostarla su span6, ma la strategia table-cell funziona bene! Ho anche dovuto impostare "display: table-row" al div contenitore per avere larghezze corrette.
Meta-Knight

3
Per Bootstrap 3 ho aggiunto questa regola: .row.align-bottom> [class ^ = col] {display: table-cell; allineamento verticale: in basso; galleggiante: nessuno; } applica align-bottom alla riga & lt; div class = "row align-bottom" & gt;
Martin

@ Martin, la tua regola funziona bene quando imposti anche .align-bottom {display: table-row;}, tuttavia, l'allineamento delle righe è disattivato perché le righe della tabella non rispettano il bootstrap margin-left e margin-right: -15px ......pensieri?
Alex White

@AlexWhite - Metti padding-left: 0e padding-right: 0su tutti i colli in quella riga.
AnalogWeapon

1
Questo ignorerà le larghezze delle colonne quando le colonne non riempiono la larghezza di una riga. Quando si utilizzano offset, ad esempio.
Arconico

14

Ecco anche una direttiva angularjs per implementare questa funzionalità

    pullDown: function() {
      return {
        restrict: 'A',
        link: function ($scope, iElement, iAttrs) {
          var $parent = iElement.parent();
          var $parentHeight = $parent.height();
          var height = iElement.height();

          iElement.css('margin-top', $parentHeight - height);
        }
      };
    }

7

Basta impostare il genitore su display:flex;e il bambino sumargin-top:auto . Questo posizionerà il contenuto figlio nella parte inferiore dell'elemento genitore, assumendo che l'elemento genitore abbia un'altezza maggiore dell'elemento figlio.

Non è necessario provare a calcolare un valore per margin-topquando si ha un'altezza sull'elemento genitore o un altro elemento maggiore dell'elemento figlio di interesse all'interno dell'elemento genitore.


Questa dovrebbe essere la risposta accettata: è breve, semplice e funziona con qualsiasi browser che supporta flex. L'unico inconveniente è che interrompe la reattività.
tbm

4

Sulla base delle altre risposte, ecco una versione ancora più reattiva. Ho apportato modifiche alla versione di Ivan per supportare i viewport <768px di larghezza e per supportare meglio i ridimensionamenti lenti delle finestre.

!function ($) { //ensure $ always references jQuery
    $(function () { //when dom has finished loading
        //make top text appear aligned to bottom: http://stackoverflow.com/questions/13841387/how-do-i-bottom-align-grid-elements-in-bootstrap-fluid-layout
        function fixHeader() {
            //for each element that is classed as 'pull-down'
            //reset margin-top for all pull down items
            $('.pull-down').each(function () {
                $(this).css('margin-top', 0);
            });

            //set its margin-top to the difference between its own height and the height of its parent
            $('.pull-down').each(function () {
                if ($(window).innerWidth() >= 768) {
                    $(this).css('margin-top', $(this).parent().height() - $(this).height());
                }
            });
        }

        $(window).resize(function () {
            fixHeader();
        });

        fixHeader();
    });
}(window.jQuery);

grazie per questo perfezionamento, l'ho appena preso per un progetto in corso e funziona bene.
venerdì

1
Perché impostare margin-topa 0, quindi impostarlo di nuovo sul nuovo valore? Inoltre, perché fare queste cose in due each()"cicli"?
Jeromy French

4

Questo si basa sulla soluzione di cfx, ma piuttosto che impostare la dimensione del carattere su zero nel contenitore genitore per rimuovere gli spazi intercolonna aggiunti a causa della visualizzazione: inline-block e dovendo reimpostarli, ho semplicemente aggiunto

.row.row-align-bottom > div {
    float: none;
    display: inline-block;
    vertical-align: bottom;
    margin-right: -0.25em;
}

alla colonna divs per compensare.


0

Beh, non mi piaceva nessuna di queste risposte, la mia soluzione dello stesso problema è stato quello di aggiungere questo: <div>&nbsp;</div>. Quindi nel tuo schema sarebbe simile a questo (più o meno), nel mio caso non sono state necessarie modifiche di stile:

-row-fluid-------------------------------------
+-span6----------+ +----span6----------+
|                | | +---div---+       |
| content        | | | & nbsp; |       |
| that           | | +---------+       |
| is tall        | | +-----div--------+|   
|                | | |short content   ||
|                | | +----------------+|
+----------------+ +-------------------+
-----------------------------------------------

4
Come fai a sapere il numero di &nbsp;da aggiungere se la lunghezza della cella sinistra è sconosciuta?
Gqqnbig

-2
.align-bottom {
    position: absolute;
    bottom: 10px;
    right: 10px;
}

1
dovresti provare ad aggiungere alcune informazioni alla tua risposta spiegando perché risponde alla domanda OP
MLavoie
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.