it-swarm.com.ru

Как выровнять нижние элементы сетки в bootstrap жидком макете

У меня плавный макет с использованием начальной загрузки Twitter, где у меня есть строка с двумя столбцами. В первом столбце много содержимого, которое я хочу заполнить обычным образом. Во втором столбце есть кнопка и некоторый текст, который я хочу выровнять снизу относительно ячейки в первом столбце.

Вот что у меня есть:

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

Вот что я хочу:

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

Я видел решения, которые делают первый диапазон абсолютной высотой и позиционируют второй диапазон относительно него, но было бы предпочтительным решение, в котором мне не нужно было указывать абсолютную высоту моих элементов div. Я также готов переосмыслить, как добиться того же эффекта. Я не женат на этом использовании лесов, мне показалось, что это имеет смысл.

Этот макет как скрипка:

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

119
Ryan

Смотрите http://jsfiddle.net/jhfrench/bAHfj/ для рабочего решения.

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

С положительной стороны:

  • в духе существующие вспомогательные классы Bootstrap , я назвал класс pull-down.
  • только элемент, который "вытягивается" должен быть классифицирован, так что ...
  • ... его можно использовать для разных типов элементов (div, span, section, p и т. д.)
  • он довольно хорошо поддерживается (все основные браузеры поддерживают margin-top)

Теперь плохие новости:

  • это требует JQuery
  • это не так, как написано, отзывчиво (извините)
50
Jeromy French

Это обновленное решение для Bootstrap 3 (должно работать для более старых версий), которое использует только CSS/LESS:

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

Вы устанавливаете размер шрифта на 0 в строке (в противном случае вы получите досадный пробел между столбцами), затем удаляете плавающие столбцы, устанавливаете отображение на inline-block, заново устанавливаете их размер шрифта, и тогда vertical-align может быть установите все, что вам нужно.

Не требуется jQuery.

68
cfx

Вы можете использовать flex:

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

Вам нужно добавить какой-нибудь стиль для span6, вот так:

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

и это ваша скрипка: http://jsfiddle.net/sgB3T/

27
Lukas

Вот также директива angularjs для реализации этой функциональности

    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);
        }
      };
    }
14
Ilya Schukin

На основе других ответов здесь приведена еще более отзывчивая версия. Я сделал изменения из версии Ивана, чтобы поддерживать области просмотра <768px в ширину и чтобы лучше поддерживать медленное изменение размеров окна.

!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);
4
bbodenmiller

Просто установите для родительского элемента display:flex;, а для дочернего - margin-top:auto. Это поместит дочерний контент внизу родительского элемента, предполагая, что родительский элемент имеет высоту больше, чем дочерний элемент.

Нет необходимости пытаться вычислить значение для margin-top, если у вас есть высота для вашего родительского элемента или другой элемент больше, чем интересующий вас дочерний элемент в пределах вашего родительского элемента.

4
Wagtail

Это основано на решении cfx, но вместо того, чтобы устанавливать нулевой размер шрифта в родительском контейнере для удаления пробелов между столбцами, добавленных из-за display: inline-block и необходимости их сброса, я просто добавил

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

в столбцах div для компенсации.

3
Kirtlander

Ну, мне не понравился ни один из этих ответов, мое решение той же проблемы состояло в том, чтобы добавить это: <div>&nbsp;</div>. Так что в вашей схеме это выглядело бы так (более или менее), в моем случае не требовалось никаких изменений стиля:

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