Як вирівняти елементи сітки внизу в макеті рідини для завантажувача


123

Я маю текуче розташування за допомогою завантажувального пристрою Twitter, в якому я є ряд з двома стовпцями. Перший стовпчик містить багато вмісту, який я хочу нормально заповнити. У другому стовпчику є лише кнопка і текст, який я хочу знизу вирівняти відносно комірки в першому стовпчику.

Ось що я маю:

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

Ось що я хочу:

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

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

Цей макет як загадка:

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


Ви не можете додати маржу на верхню відстань близько 200 пікселів до свого .rightspas?
Richlewis

Ярлик до CSS відповідає лише на це запитання: stackoverflow.com/a/14223553/259725
Адам

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 тощо)
  • він досить добре підтримується (усі основні браузери підтримують margin-top)

Тепер погані новини:

  • для цього потрібен jQuery
  • це не так, як написано, чуйно (вибачте)

3
для чуйності, можливо, зачепи вікно.зміна? stackoverflow.com/a/2969091/244811
Скотт Вівер

22
Не використовуйте рішення jQuery для чогось, що може бути рішенням CSS. Є багато причин, щоб уникнути маніпуляцій з DOM для цілей стилізації.
Архонічний

1
@Archonic: що це за CSS-рішення? Я також вважаю за краще рішення, що залежить від JS. Просто майте на увазі положення ОП: "Кращим було б рішення, де я не повинен був би вказувати абсолютну висоту своїх
дівок

1
@cfx Опублікував лише рішення css із загадкою, яка не потребує абсолютних висот.
Архонічний

1
З іншого боку, моє рішення дозволяє користувачеві вирівняти окремі елементи (надаючи подібну поведінку Bootstrap's .pull-leftта .pull-right), не впливаючи на братів і сестер. Чи можна це зробити за допомогою лише CSS?
Jeromy French

68

Це оновлене рішення для Bootstrap 3 (хоча він повинен працювати і для старих версій), який використовує лише CSS / LESS:

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

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

Не потрібно jQuery.


Я хочу тримати це посередині. Однак у вашій jsfiddle, коли я намагався "вертикально-вирівняти: середній", тоді це не вийшло. Будь-які думки?
радість

Спробуйте встановити обидва divs на vertical-align: middle;.
cfx

6
Це єдина прийнятна відповідь! @ Лукас буде ігнорувати ширину стовпців, які не заповнюють рядок. І DOM маніпуляція для стилізації ... SMH.
Архонічний

Ваш CSS відключений від рядка (конкретно, .myrow) ... чи це не означає, що ви не можете мати один стовпець у верхньому рівні, один стовпець вирівняний у нижній частині та третій стовпець вгорі?
Jeromy French

Дякую ! Чудово працює з Bootstrap 4.
Elie Teyssedou

33

Ви можете використовувати flex:

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

На мою думку, використання felx є дуже приємним та простим, і я мав ще одну перевагу, використовуючи "align-items: baseline", що було чудово для різних шрифтів у різних елементах для вирівнювання.
Алессандро Дентелла

Відмінна пропозиція використовувати флекс. Простий, прямолінійний і використовує Bootstrap для вирішення проблеми Bootstrap.
CheddarMonkey

1
Блискуча відповідь і прекрасно працює з завантажувальним інструментом без необхідності JavaScript / jquery.
фільм

1
Так, додайте це до звичайного ряду завантажувального рядка та бам, це працює. Гарний. Як невідкличне рішення jquery стало головною відповіддю? Ми ніколи не дізнаємось.
Леві Фуллер

@LeviFuller Моя здогадка, тому що це рішення підтримує лише одну точку розриву
clamchoda

27

Вам потрібно додати трохи стилю для span6, smthg, як:

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

і це ваша загадка: http://jsfiddle.net/sgB3T/


4
Я б створив специфічний клас css замість того, щоб встановити його на span6, але стратегія таблиці-комірки працює добре! Я також повинен був встановити "display: table-рядок", що містить div, щоб мати правильну ширину.
Мета-лицар

3
Для Bootstrap 3 я додав це правило: .row.align-bottom> [class ^ = col] {display: table-cell; вертикальне вирівнювання: дно; float: жоден; } застосувати align-bottom до рядка & lt; div class = "рядок вирівнювання-низу" & gt;
Мартін

@Martin, ваше правило працює нормально, коли ви також встановите .align-bottom {display: table-row;}, проте вирівнювання рядків вимкнено, оскільки рядки таблиці не відповідають полю завантажувальної сторінки ліворуч та margin-right: -15px ...... думки?
Алекс Білий

@AlexWhite - Введіть padding-left: 0і введіть padding-right: 0усі команди в цьому ряду.
AnalogWeapon

1
Це ігнорує ширину стовпців, коли стовпці не заповнюють ширину рядка. Наприклад, при використанні компенсацій.
Архонічний

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коли у вас є висота батьківського елемента чи іншого елемента, більший, ніж дочірній елемент, який цікавить ваш батьківський елемент.


Це має бути прийнятою відповіддю: він короткий, простий і працює в будь-якому браузері, що підтримує flex. Єдиний недолік - це порушення чуйності.
tbm

4

На основі інших відповідей тут ще більш чуйна версія. Я змінив версію Івана для підтримки вікон перегляду <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);

дякую за це уточнення, я щойно взяв його за поточний проект, і він працює добре.
sifriday

1
Чому слід встановити margin-top0, а потім встановити його знову на нове значення? Також, навіщо робити ці речі в дві each()"петлі"?
Jeromy French

4

Це ґрунтується на рішенні cfx, але замість того, щоб встановити розмір шрифту нульовим у батьківському контейнері, щоб видалити проміжки між стовпцями, додані через дисплей: вбудований блок і потрібно їх скинути, я просто додав

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

до дівок стовпців для компенсації.


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
ви повинні спробувати додати інформацію у свою відповідь, пояснюючи, чому вона відповідає на питання ОП
MLavoie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.