У меня есть контейнер div
с двумя детьми. Первый ребенок имеет заданный рост. Как мне сделать так, чтобы второй дочерний div
элемент занимал «свободное место» контейнера, не задавая определенной высоты?
В этом примере розовый цвет div
должен занимать также белое пространство.
Подобно этому вопросу: как заставить div занимать оставшуюся высоту?
Но я не хочу давать абсолютную позицию .
Ответы:
Расширение
#down
дочернего элемента, чтобы заполнить оставшееся пространство,#container
может быть выполнено различными способами в зависимости от поддержки браузера, которую вы хотите достичь, и от того,#up
имеет ли она определенную высоту.Образцы
Показать фрагмент кода
Сетка
grid
Макет CSS предлагает еще один вариант, хотя он может быть не таким простым, как модель Flexbox. Однако для этого требуется только стилизация элемента контейнера:В
grid-template-rows
определяет первую строку как фиксированную высоту 100 пикселей, а оставшиеся строки автоматически растягиваются, чтобы заполнить оставшееся пространство.Я почти уверен, что IE11 требует
-ms-
префиксов, поэтому не забудьте проверить функциональность в браузерах, которые вы хотите поддерживать.Flexbox
Модуль
flexbox
CSS3 Flexible Box Layout ( ) теперь хорошо поддерживается и его очень легко реализовать. Поскольку он гибкий, он работает даже тогда, когда#up
не имеет определенной высоты.Важно отметить, что поддержка IE10 и IE11 для некоторых свойств flexbox может содержать ошибки, а IE9 или более ранняя версия не поддерживает вообще.
Расчетная высота
Еще одно простое решение - использовать функциональный блок CSS3
calc
, как указывает Альваро в своем ответе , но для этого требуется, чтобы высота первого дочернего элемента была известным значением:Он довольно широко поддерживается, с единственными заметными исключениями: <= IE8 или Safari 5 (без поддержки) и IE9 (частичная поддержка). Некоторые другие проблемы включают использование calc в сочетании с преобразованием или box-shadow , поэтому обязательно проверьте в нескольких браузерах, если это вас беспокоит.
Другие альтернативы
Если старше необходима поддержка, вы могли бы добавить
height:100%;
к#down
сделают розовую Диву полную высоту, с одной оговоркой. Это вызовет переполнение контейнера, потому что#up
толкает его вниз.Следовательно, вы можете добавить
overflow: hidden;
в контейнер, чтобы исправить это.В качестве альтернативы, если высота
#up
фиксирована, вы можете расположить ее абсолютно внутри контейнера и добавить верхнюю обивку к#down
.И еще один вариант - использовать отображение таблицы:
источник
position: relative;
позиционирует его относительно контейнера, а не окна. Так что это должен быть жизнеспособный вариант.Прошло почти два года с тех пор, как я задал этот вопрос. Я только что придумал css calc (), который решает эту проблему, и подумал, что было бы неплохо добавить его, если у кого-то такая же проблема. (Кстати, в итоге я использовал абсолютную позицию).
http://jsfiddle.net/S8g4E/955/
Вот css
И подробнее об этом здесь: http://css-tricks.com/a-couple-of-use-cases-for-calc/
Поддержка браузера: http://caniuse.com/#feat=calc
источник
calc
где широкая поддержка браузеров не так важна (IE8 и ниже и Safari 5 не поддерживают его).#up
высотой?В моем ответе используется только CSS, и он не использует overflow: hidden или display: table-row. Это требует, чтобы у первого ребенка действительно была заданная высота, но в своем вопросе вы указываете, что только второй ребенок должен иметь не указанную высоту, поэтому я считаю, что вы должны найти это приемлемым.
html
css
http://jsfiddle.net/S8g4E/288/
источник
Аннотация
Я не нашел полностью удовлетворительного ответа, поэтому мне пришлось выяснить его сам.
Мои требования:
calc()
не должен использоваться, так как оставшийся элемент не должен ничего знать о размерах других элементов;Решение
flex-grow: 1
для всех прямых родителей с вычисленной высоты (если таковые имеются) и элемент , таким образом они будут занимать все оставшееся пространство , когда размер содержание элемента меньше;flex-shrink: 0
для всех гибких элементов фиксированную высоту, чтобы они не становились меньше, когда размер содержимого элемента больше, чем размер оставшегося пространства;overflow: hidden
для всех прямых родителей с вычисленной высоты (если таковые имеются) , чтобы отключить скроллинг и запретить отображение содержимого переполнения;overflow: auto
на элемент , чтобы включить прокрутку внутри него.JSFiddle (элемент имеет прямых родителей с вычисленной высотой)
JSFiddle (простой случай: нет прямых родителей с вычисленной высотой)
источник
проверьте демо - http://jsfiddle.net/S8g4E/6/
использовать css -
источник
height: 1px
к,#up
чтобы убедиться, что он занимает минимальную высоту. Вот поддержка браузером дляdisplay: table
: caniuse.com/css-tableЕсли меня не недоразумение, вы можете просто добавить
height: 100%;
иoverflow:hidden;
к#down
.Живая ДЕМО
Изменить: поскольку вы не хотите использовать
overflow:hidden;
, вы можете использоватьdisplay: table;
для этого сценария; однако он не поддерживается до IE 8. (display: table;
поддержка )Живая ДЕМО
Примечание: вы сказали, что хотите, чтобы
#down
высота была равна#container
высоте минус#up
высота.display:table;
Решение делает именно то, что и это jsfiddle будет изображать , что довольно ясно.источник
overflow:hidden
чтобы скрыть дополнительный контент.Вы можете использовать поплавки для перемещения содержимого вниз:
http://jsfiddle.net/S8g4E/5/
У вас есть контейнер фиксированного размера:
Контенту разрешено течь рядом с поплавком. Если мы не установим float на полную ширину:
В то время как
#up
и#down
разделяют верхнюю позицию,#down
содержимое может начинаться только после нижней части плавающего#up
:источник
#up
самом деле это верхняя часть#down
: jsfiddle.net/thirtydot/S8g4E/9#up
, то это, вероятно, приемлемо.Я не уверен, что это можно сделать исключительно с помощью CSS, если только вам не удобно имитировать это с помощью иллюзий. Возможно использовать ответ Джош Mein, и набор
#container
дляoverflow:hidden
.Для чего это стоит, вот решение jQuery:
источник