我有以下标记:
<html>
<body style="margin:0;padding:0">
<div>
<div style="border:3px solid red; width:70%; position:absolute; left:2.5%">Left</div>
<div style="border:3px solid blue; width:25%; position: absolute; left:72.5%">Right</div>
<div style="border:3px solid black; width:95%; margin: 0 auto">Bottom</div>
</div>
</body>
</html>
我在这里试图实现的是三个div,如下所示:
+---------------------------+--------+
|Left |Right |
+---------------------------+--------+
|Bottom |
+------------------------------------+
然而,在我的标记中,“底部”div与“左侧”和“底部”div重叠。
我应该如何设计这三个元素来达到这个效果?
请注意,“bottom”不是页面上的最后一个元素。我只是想“左”和“右”是在一行和页面流继续从以下行的默认定位。
编辑:除了接受的答案...如果你没有静态高度,或者出于某种原因不想硬编码它,你可以通过以下方式实现类似的效果:
<div style="border:3px solid red; width:70%; position:absolute; left:2.5%">Left</div>
<div style="border:3px solid blue; width:25%; margin-left:72.5%">Right</div>
<div style="border:3px solid black; width:95%; margin: 0 auto">Bottom</div>
5条答案
按热度按时间dw1jzc5e1#
我认为问题在于,当你有绝对定位的元素时,它们会被从文档流中取出。所以后面的元素看不到它们,假设它们不在那里,然后跳起来。为了让“bottom”div位于“left”/“right”div之下,你必须给予它一个
margin-top
,它等于它们的高度(或者类似的东西)。r8uurelv2#
这将是一个哲学的咆哮。其他的答案提供了具体的变通办法,这一个着眼于更大的图景。我一直在问自己“为什么”在这个问题上和类似的最近。
CSS是层叠样式表。它被设计用来做造型。它还做了一些布局,almost。
在其他答复中给出了两种达到预期效果的方法。
使用position:absolute答案(see also this technique在
position: relative
中使用position:absolute
),可以通过在两个divs上给出width和left,让“Left”div有固定的宽度,“Right”div占据其余宽度(或者如果你喜欢的话,都使用百分比)。但是,底部div不能正确地在它下面流动,因为绝对div在页面流动之外。如果内容的高度是固定的,则可以提供固定高度。如果没有,你运气不好,必须尝试不同的技术。使用Projapati的
float + margin
技术,流程是好的-但有一个2个div固定的宽度,以像素为单位,另一个占用容器的其余宽度是不可能的-你可以指定百分比,或宽度,以像素为单位为两个div,但没有办法告诉div占用“其余部分”。“Right”div福尔斯到下一行,表示这些div只是临时彼此相邻。简而言之,这两种方法都是复杂的黑客,它们重新利用了不是为这项任务设计的结构,并且都只做了人们想要做的事情的有限子集。这里有很多关于StackOverflow的问题(例如:this one),要求类似的细节,所有的努力陷入tar pit试图微调特定的CSS技术以接近所需的布局,以及如此多的答案沿着“为什么要这样做?”,“不要使用这种技术,它不会做你想要的”和“你不理解CSS正确”。
问题是,你不想要
float: left
。你不想要position: absolute
。这些都是达到目的的可能手段,这是任何人都可以草图和理解的简单布局,并且很难理解为什么CSS不能很好地处理。CSS所做的和人们期望它所做的事情之间有一个基本的不匹配。的确,人们在刚开始使用CSS的时候真的不理解它。但是CSS是为了我们的利益而构建的,它辜负了我们。问题出在CSS上,而不是用户。所需布局看起来像网格。两列,两行。高度将扩展以填充内容。“左”在第一行和第一列中,宽度为总宽度的百分比或固定宽度,并且“右”是第一行和第二列,占据宽度的其余部分。“底部”是第二行内容,其跨越两列。或者“bottom”完全在网格之外,就在页面中的后面。
CSS中需要as proposed here网格布局,因为它们与人们对页面布局的看法非常接近,并且涵盖了各种各样的CSS黑客现在使用的所有情况。
你可以简单地指定一个CSS网格:“我想要一个有两列的网格。左边占100像素,右边占容器宽度的其余部分。高度将扩展以包含内容。剩下的部分在下面继续。”完成。
如果你想改变左栏占宽度的20%,或者修正右栏,或者修正高度,只需要修改一行ccs就可以了。用目前的技术,当你达到你目前使用的css破解的极限时,你从头开始用一个不同的破解,它有不同的但同样严重的限制。
恕我直言,CSS网格比大多数人意识到的更重要,它们会让所有这些愚蠢的CSS布局黑客行为最终消失。
好消息是,这将是doable in IE10和将与之竞争的浏览器。坏消息是,你将在很长一段时间内支持IE8和IE9。我的猜测until at least 2016。
mjqavswn3#
不知道为什么要使用position:absolute
如果你需要给出的布局,你可以试试这个吗?
宽度中的%可能难以控制。
你也可以试试这个吗?您可以根据需要调整宽度。
通常我会把它保存在我的母版页中。这样所有的子页面都很好。
xpcnnkqh4#
您可以使用Yahoo YUI CSS Grid builder生成这种灵活的列布局。
输出不是我想要手工编码的东西,它有嵌套5深的div,并引用YUI CCS库,当缩小时为6kb。我不高兴这是不容易手工编码,尽管它很容易描述。
这是生成的HTML。如果没有CSS,这可能就没什么意义了。
它似乎在当前的Chrome和Firefox以及Internet Explorer 9中工作得很好。请注意,标记中右列位于左列之前-
float: right
用于<div id="yui-main">
。:after
css规则的使用很有趣,可能很重要。7xllpg7q5#
有时你可以很容易地使用负边距代替元素的位置。例如,您可以使用-->
而不是-->
然而,当我面对一个特定的问题时,我发现了这个解决方案,在阅读了网上的所有解决方案后,我发现我可以用这个方法来解决我的问题