Подтвердить что ты не робот

Сделать поле заполнения оставшегося поля родителя

Мне нужна помощь с позиционированием div. Структура HTML выглядит следующим образом:

<div class="container">
    <div class="item">
        <div class="left">
            lorem lorem
        </div>
        <div class="right">
            <p>right</p>
            <p class="bottom">bottom</p>
        </div>
    </div>
</div>

И у меня есть следующий CSS:

.container {
    float: left;
    padding: 15px;
    width: 600px;
}
.item {
    float: left;
    padding: 15px;
    width: 570px;
}
.left {
    float: left;
    padding: 40px 20px;
    margin-right: 10px;
}
.right {
    position: relative;
    float: left;
}
.bottom {
    position: absolute;
    bottom: 0;
}

Ширина и высота левого div являются динамическими.

Чего я хочу достичь:

  • Сделайте высоту правого div равным высоте левого div.
  • Сделайте ширину правого div, чтобы заполнить остальную часть div классом item.
  • Абзац с классом bottom должен находиться в нижней части правого div.

Вот простой образ, который представляет мою цель: enter image description here

И ссылка на JSFiddle demo.

4b9b3361

Ответ 1

Получение правильного положения и ширины .bottom представляется самым большим препятствием для кросс-браузерного решения CSS.

Функции

1. Поплавки

Как продемонстрировал @joeellis, гибкие ширины могут быть достигнуты путем плавания только левого столбца и применения overflow:hidden к правому столбцу.

Позиция .bottom не может быть достигнута в любом браузере. Там нет решения CSS для плавающих столбцов с равной, переменной высотой. Абсолютно расположенный элемент .bottom должен находиться внутри правого столбца div, так что ширина 100% даст ему правильный размер. Но так как правый столбец не обязательно должен быть таким же высоким, как левый столбец, позиционирование .bottom с bottom:0 не обязательно будет располагаться в нижней части контейнера.

2. HTML-таблицы и таблицы CSS

Гибкая ширина может быть достигнута путем предоставления левой ячейке ширины 1px и не указывать ширину для правой ячейки. Обе клетки будут расти в соответствии с содержанием. Любое дополнительное пространство будет добавлено только в правую ячейку.

Если .bottom находится внутри правой ячейки таблицы, положение не может быть достигнуто в Firefox. Относительное положение не действует в ячейке таблицы в Firefox; абсолютное положение и ширина 100% не будут относиться к правой ячейке таблицы.

Если .bottom рассматривается как отдельная ячейка таблицы в правом столбце, правильные высоты правой и нижней ячеек таблицы не могут быть достигнуты ни в одном браузере, кроме Firefox. Ячейки таблицы не являются гибкими по высоте так же, как и в ширину (кроме Firefox).

3. CSS3 flexbox и сетки CSS3

Flexbox, а сетки - перспективные инструменты компоновки ближайшего будущего. Но flexbox не поддерживается IE9 или ранее, и сетки не поддерживаются ни одним браузером, кроме IE10. Не проверял, может ли он достичь этого макета, но поддержка браузера может помешать им в настоящее время быть опцией.

Резюме

  • Поплавки не предлагают решение для любого браузера.
  • HTML-таблицы и таблицы CSS не предлагают кросс-браузерное решение.
  • Flexbox не предлагает потенциального решения для IE9 или ранее (и может или не может предложить решение для других браузеров).
  • Grids предлагают только потенциальное решение IE10 ( и может или не может предложить там решение).

Заключение

В настоящее время не существует адекватного решения CSS, которое будет работать в достаточно релевантных браузерах, за возможным исключением flexbox (если поддержка IE9 и ранее не требуется).

JQuery

Здесь несколько модифицированных демоверсий, которые используют jQuery, чтобы заставить столбцы иметь одинаковую высоту. CSS и jQuery для обеих демонстраций одинаковы. HTML только отличается тем, сколько контента находится в левом и правом столбцах. Обе демоверсии прошли проверку во всех браузерах. Такой же базовый подход можно использовать для простого JavaScript.

Чтобы все было просто, я переместил внутреннее дополнение для левого и правого div к дочернему элементу (.content).

Ответ 2

Элементы сиблинга одинаковой высоты и пребывания в одной строке могут быть достигнуты с помощью , отображая их как table-cell, а родительский - как display: table.
Рабочая скрипка: http://jsfiddle.net/SgubR/2/ (который также отображает overflow: hidden по методу плавающего элемента для создания столбца. Последнее требует clearfix)

Столбец в CSS использует любой HTML-элемент, который вы хотите (раздел, div, span, li, whatever), его семантика не связана с элементами таблицы, tr и td, используемыми для макета таблицы (за исключением того, что визуальный результат тот же, что мы хотим).

  • display: table устанавливается на родительский
  • display: table-row может использоваться на промежуточном элементе, но если он работает без него, прекратите
  • display: table-cell устанавливается для каждого дочернего элемента
  • ширина установлена ​​на none, некоторые или все эти "ячейки". Браузер будет адаптироваться как к содержимому, так и к ширине, заданной для расчета их ширины (и общей ширины родителя, очевидно).
  • table-layout: fixed сообщит браузерам перейти на другой алгоритм компоновки таблиц, где они не заботятся о количестве контента, только ширины, заданные CSS
  • vertical-align: top потребуется в большинстве случаев (но вы можете установить другие значения, отлично подходящие для сложных макетов)
  • поля не применяются к "ячейкам", а только к дополнению. Поля применяются только к таблице. Хотя вы все еще можете отделить "ячейки" с помощью border-collapse: separate и/или border-spacing: 4px 6px

Совместимость: IE8 +
Возврат для IE6/7 при необходимости точно такой же, как для встроенного блока

Более длительные объяснения в предыдущих ответах: здесь и там, а также старый добрый метод faux-columns (ваш дизайн должен быть продуман с учетом этой техники)

Ответ 3

Просто добавьте oveflow в правый столбец и не плавайте его.

.right {
  position: relative;
  overflow: hidden;
}

Это сделает right, чтобы заполнить оставшуюся часть ширины.

Ответ 4

Что-то вроде этого может работать:

http://jsfiddle.net/PCvy9/2/

Основной ключ того, что вы ищете в строке:

 .right {
   overflow: hidden;
   background-color: #C82927;
 }

Это связано с тем, что называется "контекстом форматирования блока". Отличные рассуждения и советы о том, почему здесь: http://colinaarts.com/articles/the-magic-of-overflow-hidden/#making-room-for-floats

Однако их высоты не полностью связаны; в этом примере вам нужно будет вручную установить высоту вашего левого блока (в качестве плавающего контейнера)