Делаем ряд div одинаковой высоты с помощью CSS

У меня есть ряд div, которые должны быть одинаковой высоты, но я не могу заранее узнать, какая эта высота может быть (контент поступает из внешнего источника). Изначально я попытался поместить блоки во внутренний блок и переместил их влево. Затем я установил их высоту на «100%», но это не дало заметного эффекта. Установив фиксированную высоту закрывающего div, я мог бы заставить плавающие div расширяться, но только до фиксированной высоты контейнера. Когда содержимое в одном из блоков div превышало фиксированную высоту, оно выливалось наружу; плавающие блоки отказались расширяться.

Я погуглил эту проблему с плавающими div с одинаковой высотой и, по-видимому, нет способа сделать это с помощью CSS. Итак, теперь я пытаюсь использовать комбинацию относительного и абсолютного позиционирования вместо поплавков. Это CSS:

<style type = "text/css">
div.container {
  background: #ccc;
  position: relative;
  min-height: 10em;
}
div.a {
  background-color: #aaa;
  position: absolute;
  top: 0px;
  left: 0px;
  bottom: 0px;
  width: 40%;
}
div.b {
  background-color: #bbb;
  position: absolute;
  top: 0px;
  left: 41%;
  bottom: 0px;
  width: 40%;
}
</style>

Это упрощенная версия HTML:

   <div class = "container">
    <div class = "a">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.</div>
    <div class = "b">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.</div>
   </div>

Это работает, если вы не измените min-height на что-то вроде 5em (демонстрируя, что происходит, когда содержимое превышает минимальную высоту), и вы можете видеть, что, хотя текст не обрезается, блоки div все равно отказываются расширяться. Теперь я в растерянности. Есть ли способ сделать это с помощью CSS?

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
5
0
6 652
6

Ответы 6

Сделать их абсолютно одинаковой высоты может быть непросто, но если они просто должны казаться одинаковой высоты, вы можете воспользоваться техникой искусственные колонны.

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

Вы можете использовать JavaScript, но, конечно, он сломается без включенного JavaScript. Еще есть таблицы, но это разрушает суть CSS. Возможно, ответ Шонба может сработать, поместите фоновое изображение, которое создает иллюзию, что все столбцы идут вниз. Это известно как искусственный фон.

Или сидите и ждите, пока display: table-cell будет поддерживаться всеми / большинством браузеров.

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

Я первый, кто выбрал несемантический дизайн, поверьте мне, но иногда вам приходится сталкиваться с тем фактом, что семантическая разметка CSS + работает не для всех сценариев дизайна. Я не знаю потребностей этого сайта в доступности, но я бы порекомендовал вам найти более практическое решение этой проблемы.

Приветствую вас за то, что вы подходите к этой проблеме правильно и ищете правильный способ ее решить! К сожалению, это один из темных уголков CSS (наряду с вертикальным позиционированием внутри блока), который просто невозможно обойтись без искусственных столбцов, javascript или ячеек таблицы.

Что бы вы ни выбрали, пожалуйста, не придерживайтесь стандартов ради них самих.

Спасибо за ответы, ребята. Я не думаю, что фоновое изображение будет работать, потому что ширина столбцов также может варьироваться в зависимости от количества столбцов (пользователь может изменить это). Думаю, я буду использовать таблицы :(

Таблицы это есть! Если через несколько лет вы почувствуете себя очень плохо из-за этого, вы можете переключить их на div и использовать display: table-cell ...

alex 17.12.2008 02:37

Хорошо, стол оказался немного сложнее, чем я думал. Оказывается, решение Javascript на самом деле является самым простым (для моей ситуации), поскольку мое приложение является приложением AJAX, а фреймворк использует Prototype.js. Все, что нужно, - это несколько строк JS:

$$('div.container').each(function (element) {
 var longest = 0;

 element.descendants().each(function (child) {
  if (child.getHeight() > longest)
   longest = child.getHeight();
 });

 element.descendants().each(function (child) {
  child.style.height = longest + 'px';
 });
});

Спасибо еще раз за помощь.

Если вы ищете вариант с чисто css, и вы можете отделить фон блока от содержимого, тогда ответ будет два: два бита кода для каждого блока, один для содержимого, один для фона. вот как это делается:

<div id = "wrapper">
  <div class = "content" id='one>
  <div class = "content" id = "two>
  <div class = "content" id = "three>
  <div class = "background" id = "back-one">
  <div class = "background" id = "back-two">
  <div class = "background" id = "back-three">
</div>

Разместите блоки содержимого с помощью чисел с плавающей запятой. Затем разместите фон, используя абсолютное позиционирование (и z-index, чтобы поместить их позади).

Это работает, потому что поплавки могут устанавливать высоту, а абсолютно позиционированные элементы могут иметь высоту 100%. Это немного беспорядочно, но работает.

Другие вопросы по теме