Как выровнять элементы сетки в макете начальной загрузки

105

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

  • 0
    Не могли бы вы добавить к верхнему краю .rightspan область с полями около 200 пикселей?
  • 0
    Ярлык для CSS только ответ на этот вопрос: stackoverflow.com/a/14223553/259725
Теги:
layout

10 ответов

47
Лучший ответ

См. 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
  • это не так, как написано, отзывчиво (извините)
  • 3
    для отзывчивости, возможно зацепить window.resize? stackoverflow.com/a/2969091/244811
  • 1
    Спасибо. Отлично работает для меня
Показать ещё 5 комментариев
58

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

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

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

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

  • 0
    Я хочу держать это в середине. Однако в вашем jsfiddle, когда я попробовал «vertical-allign: middle», это не сработало. Какие-нибудь мысли?
  • 0
    Попробуйте установить оба div для vertical-align: middle; ,
Показать ещё 10 комментариев
26

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

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

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

  • 4
    Я бы создал конкретный класс CSS вместо того, чтобы устанавливать его на span6, но стратегия ячейки таблицы работает хорошо! Я также должен был установить «display: table-row» на div, чтобы иметь правильную ширину.
  • 3
    Для Bootstrap 3 я добавил это правило: .row.align-bottom> [class ^ = col] {display: table-cell; выравнивание по вертикали: снизу; плавать: нет; } применить align-bottom к строке & lt; div class = "row align-bottom" & gt;
Показать ещё 3 комментария
24

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

@media (min-width: 768px) {
  .row-fluid {
    display: flex;
    align-items: flex-end;
  }
}
  • 0
    Использование felx, на мой взгляд, очень приятно и просто, и у меня было еще одно преимущество, используя «align-items: baseline», который отлично сочетался с разными шрифтами в разных элементах для выравнивания.
  • 0
    Отличное предложение использовать flex. Простой, прямой и использует Bootstrap для решения проблемы Bootstrap.
Показать ещё 2 комментария
13

Здесь также директива 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);
        }
      };
    }
  • 3
    Это было очень полезно, спасибо
  • 0
    Это сработало очень хорошо. :-)
4

На основе других ответов здесь представлена ​​еще более отзывчивая версия. Я внес изменения с версии Ivan, чтобы поддерживать видовые экраны шириной < 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);
  • 0
    спасибо за это уточнение, я просто взял его для текущего проекта, и он работает хорошо.
  • 1
    Зачем устанавливать margin-top на 0, а затем снова устанавливать его на новое значение? Кроме того, почему эти вещи в двух each() циклах?
3

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

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

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

2

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню