Как выровнять элементы сетки по нижнему краю в макете bootstrap Fluid

123

У меня есть гибкий макет с использованием начальной загрузки 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/

Райан
источник
не могли бы вы добавить верхний край поля около 200 пикселей к вашему .rightspan?
Richlewis
Ярлык для CSS отвечает только на этот вопрос: stackoverflow.com/a/14223553/259725
Adam
bootply.com/125740# ( К сожалению , я забыл , какой ответ на который SO вопрос эта ссылка с.)
ToolmakerSteve

Ответы:

50

Обратите внимание: для пользователей Bootstrap 4+ обратите внимание на решение Christophe (Bootstrap 4 представил flexbox, который обеспечивает более элегантное решение только для CSS). Следующее будет работать для более ранних версий Bootstrap ...


См. 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 и т. д.)
  • он довольно хорошо поддерживается (все основные браузеры поддерживают маржу сверху)

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

  • это требует jQuery
  • это не так, как написано, отзывчивый (извините)
Джероми Френч
источник
3
для отзывчивости, возможно, зацепите window.resize? stackoverflow.com/a/2969091/244811
Скотт Уивер
22
Не используйте решение jQuery для чего-то, что может быть решением CSS. Есть много причин избегать манипуляций с DOM в целях стилизации.
Archonic
1
@Archonic: что это за решение только для CSS? Я бы также предпочел это JS-зависимому решению. Просто имейте в виду условие OP: «предпочтительнее решение, в котором мне не нужно указывать абсолютную высоту моих
div
1
@cfx Опубликовал только css-решение со скрипкой, не требующей абсолютных высот.
Archonic 02
1
С другой стороны, мое решение позволяет пользователю выравнивать отдельные элементы по нижнему краю (обеспечивая поведение, аналогичное Bootstrap .pull-leftи .pull-right), не затрагивая братьев и сестер. Можно ли это сделать с помощью решения только для CSS?
Джероми Френч
68

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

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

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

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

CFX
источник
Я хочу держать его посередине. Однако в вашем jsfiddle, когда я попробовал "vertical-allign: middle", это не сработало. Есть предположения?
радость
Попробуйте установить для обоих divs значение vertical-align: middle;.
cfx 08
6
Это единственно приемлемый ответ! @ Lukas игнорирует ширину столбцов, которые не заполняют строку. И манипуляции с DOM для стилизации ... SMH.
Archonic
Ваш CSS привязан к строке (в частности .myrow) ... не означает ли это, что вы не можете иметь один столбец с выравниванием по верхнему краю, один столбец с выравниванием по нижнему краю и третий столбец с выравниванием по верхнему краю?
Джероми Френч
Спасибо ! Прекрасно работает с Bootstrap 4.
Эли Тейсседу
33

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

@media (min-width: 768px) {
  .row-fluid {
    display: flex;
    align-items: flex-end;
  }
}
Christophe
источник
На мой взгляд, использование felx очень удобно и просто, и у меня было еще одно преимущество - использование «align-items: baseline», которое отлично подходит для разных шрифтов в разных элементах для выравнивания.
Алессандро Дентелла,
Отличное предложение использовать flex. Простой, понятный и использует Bootstrap для решения проблемы Bootstrap.
CheddarMonkey
1
Блестящий ответ и отлично работает с начальной загрузкой без использования javascript / jquery.
Filth
1
Ага, добавьте это в обычную строку начальной загрузки и бац, это работает. Прекрасный. Как неотзывчивое решение jquery стало лучшим ответом? Мы никогда не узнаем.
Леви Фуллер
@LeviFuller Я предполагаю, потому что это решение поддерживает только одну
точку
27

Вам нужно добавить стиль для span6чего-то вроде этого:

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

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

Lukas
источник
4
Я бы создал конкретный класс css вместо того, чтобы устанавливать для него span6, но стратегия ячейки таблицы работает хорошо! Мне также пришлось установить display: table-row для содержащего div, чтобы иметь правильную ширину.
Meta-Knight
3
Для Bootstrap 3 я добавил это правило: .row.align-bottom> [class ^ = col] {display: table-cell; вертикальное выравнивание: снизу; float: нет; } применить align-bottom к строке & lt; div class = "row align-bottom" & gt;
Мартин
@Martin, ваше правило работает нормально, когда вы также устанавливаете .align-bottom {display: table-row;}, однако выравнивание строк отключено, потому что строки таблицы не соблюдают поля начальной загрузки margin-left и margin-right: -15px ...... мысли?
Alex White
@AlexWhite - Поставьте padding-left: 0и поставьте padding-right: 0все столбцы в этом ряду.
AnalogWeapon
1
Это будет игнорировать ширину столбца, если столбцы не заполняют ширину строки. Например, при использовании смещений.
Archonic
14

Вот также директива 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);
        }
      };
    }
Илья Щукин
источник
7

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

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

sissypants
источник
Это должен быть принятый ответ: он короткий, простой и работает в любом браузере, поддерживающем flex. Единственный недостаток - ломается отзывчивость.
tbm 07
4

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

!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
источник
спасибо за это уточнение, я только что взял его для текущего проекта, и он работает хорошо.
sifriday
1
Зачем устанавливать margin-topзначение 0, а затем снова устанавливать новое значение? Кроме того, почему эти вещи делаются двумя each()«петлями»?
Джероми Френч
4

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

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

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

Kirtlander
источник
0

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

-row-fluid-------------------------------------
+-span6----------+ +----span6----------+
|                | | +---div---+       |
| content        | | | & nbsp; |       |
| that           | | +---------+       |
| is tall        | | +-----div--------+|   
|                | | |short content   ||
|                | | +----------------+|
+----------------+ +-------------------+
-----------------------------------------------
Ян Б.
источник
4
Как узнать, сколько &nbsp;нужно добавить, если длина левой ячейки неизвестна?
Gqqnbig
-2
.align-bottom {
    position: absolute;
    bottom: 10px;
    right: 10px;
}
Дуглас Рибейро
источник
1
вы должны попытаться добавить некоторую информацию к своему ответу, объясняя, почему он отвечает на вопрос OP
MLavoie