HTML/CSS:Создание двух плавающих элементов одинаковой высоты
-
05-07-2019 - |
Вопрос
У меня есть небольшая своеобразная проблема, которую я в настоящее время решаю с помощью table
, смотрите ниже.По сути, я хочу, чтобы два divs занимали 100% доступной ширины, но занимали только столько вертикального пространства, сколько необходимо (что на самом деле не так очевидно из рисунка).Они всегда должны иметь одинаковую высоту с небольшой линией между ними, как показано на рисунке.
(источник: pici.se)
Все это очень легко сделать с помощью table
, чем я сейчас и занимаюсь.Однако я не слишком заинтересован в решении, поскольку семантически это на самом деле не таблица.
Решение
Вы можете получить столбцы одинаковой высоты в CSS, применив нижнее заполнение большого размера, нижнее отрицательное поле такого же размера и окружив столбцы div, в котором скрыто переполнение.Центрировать текст по вертикали немного сложнее, но это должно помочь вам в пути.
#container {
overflow: hidden;
width: 100%;
}
#left-col {
float: left;
width: 50%;
background-color: orange;
padding-bottom: 500em;
margin-bottom: -500em;
}
#right-col {
float: left;
width: 50%;
margin-right: -1px; /* Thank you IE */
border-left: 1px solid black;
background-color: red;
padding-bottom: 500em;
margin-bottom: -500em;
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head></head>
<body>
<div id="container">
<div id="left-col">
<p>Test content</p>
<p>longer</p>
</div>
<div id="right-col">
<p>Test content</p>
</div>
</div>
</body>
Я думаю, стоит упомянуть, что предыдущий ответ streetpc содержит недопустимый html, тип документа - XHTML, а атрибуты заключены в одинарные кавычки.Также стоит отметить, что вам не нужен дополнительный элемент с clear
включить, чтобы очистить внутренние поплавки контейнера.Если вы используете overflow hidden, это очищает значения с плавающей точкой во всех браузерах, отличных от IE, а затем просто добавление чего-либо для предоставления hasLayout, такого как width или zoom: 1, приведет к тому, что IE очистит свои внутренние значения с плавающей точкой.
Я протестировал это во всех современных браузерах FF3 + Opera9 + Chrome Safari 3+ и IE6 / 7 / 8.Это может показаться уродливым трюком, но он хорошо работает, и я часто использую его в производстве.
Я надеюсь, что это поможет.
Другие советы
Это 2012 год + n, поэтому, если вам больше не нужны IE6 / 7, display: table
, display: table-row
и display: ячейка таблицы
работает во всех современных браузерах:
http://www.456bereastreet.com/archive/200405/equal_height_boxes_with_css/
Обновление 2016-06-17: Если вы считаете, что пришло время для display: flex
, посмотрите Flexbox Froggy .
Для этого вы должны использовать flexbox. Он не поддерживается в IE8 и IE9 и только с префиксом -ms в IE10, но все остальные браузеры поддерживают его. Для префиксов поставщиков также следует использовать авторефиксер .
.parent {
display: flex;
flex-wrap: wrap; // allow wrapping items
}
.child {
flex-grow: 1;
flex-basis: 50%; // 50% for two in a row, 33% three in a row etc.
}
вы можете заставить это работать с js:
<script>
$(document).ready(function() {
var height = Math.max($("#left").height(), $("#right").height());
$("#left").height(height);
$("#right").height(height);
});
</script>
Это классическая проблема в CSS. На самом деле нет решения для этого.
Эта статья из A List Apart является хорошим чтением по этой проблеме. Он использует технику под названием «искусственные столбцы», основанную на наличии одного вертикально мозаичного фонового изображения в элементе , содержащем столбцы , который создает иллюзию столбцов одинаковой длины. Поскольку он находится в оболочке плавающих элементов, он равен длине самого длинного элемента.
<Ч>У редакторов A List Apart есть эта заметка к статье:
Примечание редакторов: хотя эта статья отлично подходит для своего времени, она может не отражать современные лучшие практики.
Для этой технологии требуются полностью статичные конструкции ширины, которые плохо сочетаются с жидкими макетами и адаптивными методами проектирования, которые сегодня популярны для сайтов с несколькими устройствами. Однако для сайтов со статической шириной это надежный вариант.
У меня была похожая проблема, и, на мой взгляд, лучший вариант - это использовать немного javascript или jquery.
Вы можете получить желаемые элементы div одинаковой высоты, получив максимальное значение div и применив это значение ко всем другим элементам div. Если у вас есть много div-ов и много решений, я предлагаю написать небольшой предварительный код js, чтобы выяснить, какой из всех div-ов самый высокий, а затем использовать его значение.
С jquery и 2 divs это очень просто, вот пример кода:
.<код> $ ( 'меньше-ДИВ ') CSS (' высота', $ () CSS ( 'высота ')' выше-DIV.'.); Код>
И, наконец, 1 вещь. Их отступы (верх и низ) должны быть одинаковыми! Если у вас есть большие отступы, вы должны устранить разницу в отступах. Р>
Насколько я знаю, вы не можете сделать это, используя текущие реализации CSS. Чтобы сделать два столбца равными по высоте, вам нужен JS.
Это работает для меня в IE 7, FF 3.5, Chrome 3b, Safari 4 (Windows).
Также работает в IE 6, если вы раскомментируете более понятный div в нижней части.
Изменить : как сказала Натали Даун, вместо этого вы можете просто добавить width: 100%;
в #container
.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<style type="text/css">
#container {
overflow: hidden;
border: 1px solid black;
background-color: red;
}
#left-col {
float: left;
width: 50%;
background-color: white;
}
#right-col {
float: left;
width: 50%;
margin-right: -1px; /* Thank you IE */
}
</style>
</head>
<body>
<div id='container'>
<div id='left-col'>
Test content<br />
longer
</div>
<div id='right-col'>
Test content
</div>
<!--div style='clear: both;'></div-->
</div>
</body>
</html>
Я не знаю способа CSS для вертикального центрирования текста в правильном div, если div не имеет фиксированной высоты. Если это так, вы можете установить для line-height
то же значение, что и для высоты div, и поместить внутренний div, содержащий ваш текст, с помощью display: inline; высота строки: 110%
.
Используя Javascript, вы можете сделать два тега div одинаковой высоты. Меньший тег div будет соответствовать высоте самого высокого тега div с помощью кода, показанного ниже:
var rightHeight = document.getElementById('right').clientHeight;
var leftHeight = document.getElementById('left').clientHeight;
if (leftHeight > rightHeight) {
document.getElementById('right').style.height=leftHeight+'px';
} else {
document.getElementById('left').style.height=rightHeight+'px';
}
С " оставленным " и "правильно" быть идентификаторами тегов div. Р>
Используя css-свойство --> отобразить:таблица-ячейка
div {
border: 1px solid #000;
margin: 5px;
padding: 4px;
display:table-cell;
width:25% ;position:relative;
}
body{display:table;
border-collapse:separate;
border-spacing:5px 5px}
<div>
This is my div one This is my div one This is my div one
</div>
<div>
This is my div two This is my div two This is my div two This is my div two This is my div two This is my div two
</div>
<div>
This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3
</div>
div {
border: 1px solid #000;
margin: 5px;
padding: 4px;
display:table-cell;
width:25% ;position:relative;
}
body{display:table;
border-collapse:separate;
border-spacing:5px 5px}
<div>
This is my div one This is my div one This is my div one
</div>
<div>
This is my div two This is my div two This is my div two This is my div two This is my div two This is my div two
</div>
<div>
This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3 This is my div 3
</div>
Используя JS, используйте data-same-height = " имя_группы "
во всех элементах, для которых требуется одинаковая высота .
Пример: https://jsfiddle.net/eoom2b82/
Код:
$(document).ready(function() {
var equalize = function () {
var disableOnMaxWidth = 0; // 767 for bootstrap
var grouped = {};
var elements = $('*[data-same-height]');
elements.each(function () {
var el = $(this);
var id = el.attr('data-same-height');
if (!grouped[id]) {
grouped[id] = [];
}
grouped[id].push(el);
});
$.each(grouped, function (key) {
var elements = $('*[data-same-height="' + key + '"]');
elements.css('height', '');
var winWidth = $(window).width();
if (winWidth <= disableOnMaxWidth) {
return;
}
var maxHeight = 0;
elements.each(function () {
var eleq = $(this);
maxHeight = Math.max(eleq.height(), maxHeight);
});
elements.css('height', maxHeight + "px");
});
};
var timeout = null;
$(window).resize(function () {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
timeout = setTimeout(equalize, 250);
});
equalize();
});
Мне нужно было сделать что-то подобное, вот моя реализация.Подводя итог цели, можно сказать, что 2 элемента занимают ширину данного родительского контейнера, а высота должна быть только такой, какая ему необходима.По существу, высота равна максимальной высоте наибольшего объема содержимого, но другой контейнер находится на одном уровне.
HTML
<div id="ven">
<section>some content</section>
<section>some content</section>
</div>
css
#ven {
height: 100%;
}
#ven section {
width: 50%;
float: left;
height: 100%;
}