HTML / CSS:使两个浮动div的高度相同


106

我目前使用来解决一个特殊的问题table,请参阅下文。基本上,我希望两个div占用可用宽度的100%,但只占用所需的垂直空间(从图片上看并不是很明显)。如图所示,两者始终应具有完全相同的高度,并且两者之间应有一点线。

替代文字
(来源:pici.se

table我目前正在使用,这一切都很容易做到。但是,我不太热衷于解决方案,因为从语义上讲这实际上不是表。


2
嗯...图片在哪里?我知道对此发表评论为时已晚
Ajay Kulkarni

Answers:


160

通过应用大量的底部填充,等量的底部负边距并用隐藏了溢出的div包围列,可以在CSS中获得等高的列。将文本垂直居中会有些棘手,但这将对您有所帮助。

#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,并且属性周围有单引号。另外值得注意的是您不需要带有clearon 的额外元素即可清除容器的内部浮点数。如果您使用隐藏的溢出,这将清除所有非IE浏览器中的浮点数,然后仅添加一些东西给hasLayout,例如width或zoom:1,将导致IE清除其内部浮点数。

我已经在所有现代浏览器FF3 + Opera9 + Chrome Safari 3+和IE6 / 7/8中对此进行了测试。这看似很难看,但是效果很好,我在生产中经常使用它。

我希望这有帮助。


1
我提供的代码在W3C的验证器中进行验证(嗯,一旦添加了<title>元素,那不是您的意思)。此外,根据此讨论,规范允许使用单引号:sitepoint.com/forums/showthread.php?t=54273
instanceof me

1
抱歉,我的错。我已经修改了上面的答案。不过要指出一点,如果您的方法正确,则右列的大小会比左列大,因为下面两个框的高度不正确,所以红色显示在下面。根据设计的不同,我会选择使用人造色谱柱或这种具有底部边距和填充的方法。
Natalie Downe,2009年

2
实际上,尽管Kevin C.给出的关于阴影被切除的解决方案适用于顶部,左侧和右侧填充,但不适用于底部。到目前为止尚未找到解决方案。
JeanMertz

1
娜塔莉,做得好。@laarsk不可预测的高度到底是什么,不是吗?参见演示:jsfiddle.net/RT3MT/4将“较长的”段落移至周围
jpillora

1
这是我见过的最丑陋的CSS hack之一,但是我将张开双臂拥抱它。这似乎是唯一的出路
Matt Vukas 2014年

98

现在是2012年+ n年,因此,如果您不再关心IE6 / 7 display:table、,display:table-row并且display:table-cell可以在所有现代浏览器中使用:

http://www.456bereastreet.com/archive/200405/equal_height_boxes_with_css/

2016-06-17更新:如果您认为需要时间display:flex,请查看Flexbox Froggy


30
将此答案替换为哪一年display: flex
LandonSchropp

12
不,我们现在是2014年;(
弗朗西斯科·普雷森西亚

9
aaaaaaand可能是2015年年底,我们可以更改答案以显示:flex :)
MetalWeirdo

5
我仍然生活在1950年代。
杰伊

1
您好,2016年!我们现在可以使用flex
Brett Gregson,2016年

20

您应该使用flexbox实现这一点。IE8和IE9不支持此功能,IE10不支持-ms前缀,但所有其他浏览器均支持。对于供应商前缀,还应该使用autoprefixer

.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.
}

1
我在flex中遇到的问题是它需要在列周围使用包装器。使用floats + display:table技术,我可以拥有例如标题和一堆列,并且效果可以作用于列而不会影响标题。
斯蒂恩·德·威特

10

您可以使用js进行此操作:

<script>
    $(document).ready(function() {
        var height = Math.max($("#left").height(), $("#right").height());
        $("#left").height(height);
        $("#right").height(height);
    });
</script>

1
请注意,这个问题已经很老了,并且已经提供了更好的解决方案(不需要javascript)。
nirazul 2013年

1
我实际上很喜欢这种解决方案。这很有趣,表明您不仅可以使用css操作html,还可以借助jquery进行操作
csichar 2015年

6
如果列的高度发生更改,此解决方案将不起作用。如果更改列的内容,则可能会发生这种情况。此功能需要运行:内容更改时,浏览器调整大小时。css方法更为理想,因为它避免了这些担忧
alexreardon 2015年

5

这是CSS中的经典问题。确实没有解决方案。

A List Apart的这篇文章很好地解决了这个问题。它使用一种称为“仿列”的技术,其基础是在包含这些列元素上放置一个垂直平铺的背景图像,从而产生等长列的错觉。由于它位于浮动元素的包装上,因此它与最长的元素一样长。


A List Apart编辑器在文章上有此注释:

编者注:尽管这篇文章非常出色,但可能无法反映现代最佳实践。

该技术需要完全静态的宽度设计,该设计与当前在跨设备站点中流行的液体布局和自适应设计技术不能很好地配合使用。但是,对于静态宽度站点,这是一个可靠的选择。


谢谢,这似乎是一个不错的技巧。但是,我忘了提到右边的列中应该有垂直居中的文本。我是否相信人造色谱柱无法做到这一点?
Deniz Dogan

4

我有类似的问题,我认为最好的选择是只使用少量的javascript或jquery。

通过获取最高div值并将该值应用于所有其他div,可以使所需的div高度相同。如果您有很多div和许多解决方案,我建议您编写一点高级js代码,以找出所有div中哪个是最高的,然后使用它的值。

使用jquery和2 divs非常简单,这是示例代码:

$('.smaller-div').css('height',$('.higher-div').css('height'));

最后,最后一件事。它们的填充(顶部和底部)必须相同!如果填充较大,则需要消除填充差异。


1

据我所知,您无法使用当前的CSS实现来做到这一点。要制作两列相等的高度,您需要JS。


1

这适用于IE 7,FF 3.5,Chrome 3b,Safari 4(Windows)。

如果取消注释底部的更清晰的div,则在IE 6中也可以使用。 编辑:作为娜塔莉道恩说,你可以简单地添加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>

如果div的高度不固定,我不知道CSS在垂直方向上将文本垂直居中的方式。如果是,则可以将line-heightdiv的值设置为与div高度相同的值,然后使用放一个包含文本的内部div display: inline; line-height: 110%


1

使用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';
}

其中“ left”和“ right”是div标签的ID。


1

通过使用CSS属性-> display:table-cell

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>


0

使用JS,data-same-height="group_name"在要具有相同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();
});

0

我需要做类似的事情,这是我的实现。概括地说,它是让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%;
}

0

几年前,该float属性table使用display: table;display: table-row;和方法来解决该问题display: table-cell;

但现在与Flex属性,你可以用3行代码解决这个问题:display: flex;flex-wrap: wrap;flex: 1 0 50%;

.parent {
    display: flex;
    flex-wrap: wrap;
}

.child {
 // flex: flex-grow flex-shrink flex-basis;
    flex: 1 0 50%;
}

1 0 50%flex我们送给值:flex-grow flex-shrink flex-basis分别。在flexbox中,这是一个相对较新的快捷方式,可以避免单独键入它们。我希望这可以帮助某人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.