Jak wyrównać elementy siatki do dołu w układzie Bootstrap Fluid

123

Mam układ płynny za pomocą bootstrapu Twittera, w którym mam wiersz z dwiema kolumnami. Pierwsza kolumna zawiera dużo treści, które chcę normalnie wypełnić. Druga kolumna ma tylko przycisk i tekst, który chcę wyrównać do dołu względem komórki w pierwszej kolumnie.

Oto co mam:

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

Oto, czego chcę:

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

Widziałem rozwiązania, które ustawiają pierwszą rozpiętość na absolutną wysokość i ustawiają drugą rozpiętość względem niej, ale preferowane byłoby rozwiązanie, w którym nie musiałem określać bezwzględnej wysokości moich elementów div. Jestem również otwarty na całkowite przemyślenie, jak osiągnąć ten sam efekt. Nie jestem żonaty z tym użyciem rusztowania, po prostu wydawało mi się to najbardziej sensowne.

Ten układ jako skrzypce:

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

Ryan
źródło
czy nie mógłbyś dodać górnego marginesu około 200 pikseli do swojego .rightspan?
Richlewis
Skrót do CSS odpowiada tylko na to pytanie: stackoverflow.com/a/14223553/259725
Adam
bootply.com/125740# (Przepraszam, zapomniałem, z której odpowiedzi SO pochodzi ten link.)
ToolmakerSteve

Odpowiedzi:

50

Uwaga: dla użytkowników Bootstrap 4+, proszę rozważyć rozwiązanie Christophe'a (Bootstrap 4 wprowadził flexbox, który zapewnia bardziej eleganckie rozwiązanie tylko CSS). Poniższe informacje będą działać dla wcześniejszych wersji Bootstrap ...


Zobacz http://jsfiddle.net/jhfrench/bAHfj/, aby uzyskać działające rozwiązanie.

//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())
});

Na plus:

  • w duchu istniejących klas pomocniczych Bootstrap , nazwałem tę klasę pull-down.
  • tylko element, który jest „ściągany”, musi zostać sklasyfikowany, więc ...
  • ... jest wielokrotnego użytku dla różnych typów elementów (div, span, section, p itd.)
  • jest dość dobrze obsługiwany (wszystkie główne przeglądarki obsługują marginesy)

Teraz zła wiadomość:

  • wymaga jQuery
  • nie jest, jak napisano, responsywny (przepraszam)
Jeromy French
źródło
3
aby uzyskać responsywność, może podpiąć okno. zmienić rozmiar? stackoverflow.com/a/2969091/244811
Scott Weaver
22
Nie używaj rozwiązania jQuery do czegoś, co mogłoby być rozwiązaniem CSS. Istnieje wiele powodów, dla których należy unikać manipulacji DOM w celu stylizacji.
Archonic
1
@Archonic: co to za rozwiązanie zawierające tylko CSS? Wolałbym również to od rozwiązania zależnego od JS. Pamiętaj tylko o zastrzeżeniu OP: „preferowane byłoby rozwiązanie, w którym nie musiałem określać bezwzględnej wysokości moich elementów div”
Jeromy French
1
@cfx Opublikował tylko rozwiązanie CSS ze skrzypcami, które nie wymagają absolutnych wysokości.
Archonic
1
Z drugiej strony, moje rozwiązanie pozwala użytkownikowi wyrównać poszczególne elementy do dołu (dając podobne zachowanie do Bootstrap .pull-lefti .pull-right), bez wpływu na rodzeństwo. Czy można to zrobić za pomocą samego rozwiązania CSS?
Jeromy French
68

To zaktualizowane rozwiązanie dla Bootstrap 3 (powinno jednak działać dla starszych wersji), które używa tylko CSS / LESS:

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

Ustawiasz rozmiar czcionki na 0 w wierszu (w przeciwnym razie skończysz z nieznośnym odstępem między kolumnami), a następnie usuniesz kolumny pływające, ustaw wyświetlanie inline-block, ponownie ustaw ich rozmiar czcionki, a następnie vertical-alignmożesz ustawić na wszystko czego potrzebujesz.

Nie jest wymagane jQuery.

cfx
źródło
Chcę, żeby to było w środku. Jednak w twoim jsfiddle, kiedy próbowałem "vertical-allign: middle", to nie działało. jakieś pomysły?
radość
Spróbuj ustawić oba divna vertical-align: middle;.
cfx
6
To jedyna akceptowalna odpowiedź! @ Lukas zignoruje szerokości kolumn, które nie wypełniają wiersza. I manipulacja DOM do stylizacji ... SMH.
Archonic
Twój kod CSS jest oddzielony od wiersza (konkretnie .myrow) ... czy to nie oznacza, że ​​nie możesz mieć jednej kolumny wyrównanej do góry, jednej do dołu i trzeciej do góry?
Jeromy French
Dzięki ! Działa dobrze z Bootstrap 4.
Elie Teyssedou
33

Możesz użyć flex:

@media (min-width: 768px) {
  .row-fluid {
    display: flex;
    align-items: flex-end;
  }
}
Christophe
źródło
Korzystanie z felx jest moim zdaniem bardzo przyjemne i proste. Miałem jeszcze jedną zaletę, używając opcji „align-items: baseline”, która była świetna z różnymi czcionkami w różnych elementach do wyrównania.
Alessandro Dentella
Doskonała propozycja użycia flexu. Prosty, strait-forward i używa Bootstrap do rozwiązania problemu Bootstrap.
CheddarMonkey,
1
Genialna odpowiedź i doskonale współpracuje z bootstrapem bez potrzeby używania javascript / jquery.
Filth
1
Tak, dodaj to do zwykłego wiersza bootstrap i bach, to działa. Piękny. Jak niereagujące rozwiązanie jQuery stało się najlepszą odpowiedzią? Nigdy się nie dowiemy.
Levi Fuller,
@LeviFuller Domyślam się, że to rozwiązanie obsługuje tylko jeden punkt przerwania
clamchoda.
27

Musisz dodać trochę stylu span6, coś takiego:

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

a to jest twoje skrzypce: http://jsfiddle.net/sgB3T/

Lukas
źródło
4
Utworzyłbym konkretną klasę css zamiast ustawiać ją na span6, ale strategia table-cell działa dobrze! Musiałem również ustawić "display: table-row" na zawierający element div, aby mieć prawidłowe szerokości.
Meta-Knight
3
Do Bootstrap 3 dodałem tę regułę: .row.align-bottom> [class ^ = col] {display: table-cell; wyrównywanie w pionie: do dołu; float: brak; } zastosuj align-bottom do wiersza & lt; div class = "row align-bottom" & gt;
Martin
@ Martin, twoja reguła działa dobrze, jeśli ustawisz również .align-bottom {display: table-row;}, jednak wyrównanie wierszy jest wyłączone, ponieważ wiersze tabeli nie uwzględniają bootstrap margin-left i margin-right: -15px ......myśli?
Alex White
@AlexWhite - Umieść padding-left: 0i padding-right: 0na wszystkich kolumnach w tym rzędzie.
AnalogWeapon
1
Spowoduje to zignorowanie szerokości kolumn, gdy kolumny nie wypełniają szerokości wiersza. Na przykład przy stosowaniu offsetów.
Archonic
14

Oto również dyrektywa angularjs, która implementuje tę funkcjonalność

    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);
        }
      };
    }
Ilya Schukin
źródło
7

Po prostu ustaw rodzica na, display:flex;a dziecko na margin-top:auto. Spowoduje to umieszczenie treści podrzędnej na dole elementu nadrzędnego, przy założeniu, że element nadrzędny ma wysokość większą niż element podrzędny.

Nie ma potrzeby obliczania wartości, margin-topjeśli wysokość elementu nadrzędnego lub innego elementu jest większa niż element podrzędny będący przedmiotem zainteresowania w elemencie nadrzędnym.

sissypants
źródło
To powinna być akceptowana odpowiedź: jest krótka, prosta i działa w każdej przeglądarce obsługującej flex. Jedyną wadą jest to, że łamie responsywność.
tbm
4

Na podstawie innych odpowiedzi tutaj jest jeszcze bardziej responsywna wersja. Dokonałem zmian w wersji Ivana, aby obsługiwać rzutnie o szerokości <768px i lepiej obsługiwać powolne zmiany rozmiarów okien.

!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);
bbodenmiller
źródło
dzięki za to udoskonalenie, właśnie wziąłem go do bieżącego projektu i działa dobrze.
piątek,
1
Po co ustawiać margin-topna 0, a następnie ustawiać ponownie na nową wartość? Poza tym, dlaczego te rzeczy robią się w dwóch each()„pętlach”?
Jeromy francuski
4

Jest to oparte na rozwiązaniu cfx, ale zamiast ustawiać rozmiar czcionki na zero w kontenerze nadrzędnym, aby usunąć spacje międzykolumnowe dodane z powodu wyświetlania: inline-block i konieczności ich resetowania, po prostu dodałem

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

do elementów div kolumny, aby skompensować.

Kirtlander
źródło
0

Cóż, ja nie jak każda z tych odpowiedzi, moje rozwiązanie tego samego problemu było dodać to: <div>&nbsp;</div>. Więc w twoim schemacie wyglądałoby to tak (mniej więcej), w moim przypadku nie były potrzebne żadne zmiany stylu:

-row-fluid-------------------------------------
+-span6----------+ +----span6----------+
|                | | +---div---+       |
| content        | | | & nbsp; |       |
| that           | | +---------+       |
| is tall        | | +-----div--------+|   
|                | | |short content   ||
|                | | +----------------+|
+----------------+ +-------------------+
-----------------------------------------------
sty b
źródło
4
Skąd znasz liczbę &nbsp;do dodania, jeśli długość lewej komórki jest nieznana?
Gqqnbig
-2
.align-bottom {
    position: absolute;
    bottom: 10px;
    right: 10px;
}
Douglas Ribeiro
źródło
1
powinieneś spróbować dodać trochę informacji do swojej odpowiedzi, wyjaśniając, dlaczego odpowiada na pytanie OP
MLavoie