【问题标题】:Extend height to include absolutely positioned children扩展高度以包括绝对定位的儿童
【发布时间】:2013-09-22 19:06:07
【问题描述】:

我正在为 CMS 构建一个 html/javascript 主题设计器。元素是绝对定位的,可以通过鼠标移动/调整大小,和/或包含可编辑的文本,其高度可能由行数决定。但是,我遇到了父元素的高度没有扩展到包括其绝对定位的子元素的问题。

最小代码(也在JSFiddle here):

<style>
    div.layer { position: absolute }
    div.layer1 { width: 400px; border: 1px solid #ccc }
    div.layer2 { top: 15px; left: 100px; width: 100px; border: 1px solid blue }
</style>
<div class="layer layer1">container should expand to the bottom of the child.
    <div class="layer layer2" contentEditable>Child with<br/>editable text.</div>
</div>

纯 CSS 解决方案是理想的,我不关心旧浏览器。但我主要是在寻找任何方法来防止需要使用创建的主题在每个页面上运行 javascript 来设置它们的高度(因为具有相同主题的页面可能有不同数量的文本)。

已经有一些类似的问题,但他们接受的答案(例如,不要使用绝对定位)在我的情况下不起作用。除非有办法拥有多层可拖动/可调整大小的元素而不是位置:绝对。

【问题讨论】:

  • 我不知道,但不认为它可以用纯 CSS 完成。

标签: javascript css html wysiwyg


【解决方案1】:

我找到了一个纯 CSS 解决方案!总结:

  1. 将子元素设置为位置:相对而不是绝对。
  2. 将它们的 margin-right 设置为它们的负宽度,使它们的有效宽度为零,并使它们浮动:left 使它们保持在同一行上。这使得它们都具有 0, 0 的原点。
  3. 然后我们可以设置它们的 left 和 margin-top 属性以将它们绝对定位在它们的父级中。请注意,margin-top 是必需的,而不是 top,因为 top 不会下推父元素的底部。

JSFiddle here 或以下代码:

<style>
    div.layer { position: relative; float: left; }
    div.layer1 { width: 400px; border: 1px solid black }
    div.layer2 { margin-top: 20px; left: 100px; width: 100px; margin-right: -100px; border: 1px solid blue }
    div.layer3 { margin-top: 30px; left: 170px; width: 100px; margin-right: -100px; border: 1px solid red }
    div.layer4 { margin-top: 30px; left: 20px; width: 60px; margin-right: -60px; border: 1px solid green }
</style>
<div class="layer layer1" style="position: relative; display: block; width: 400px; border: 1px solid black;">
    Container
    <div class="layer layer2" contentEditable>Edit me</div>
    <div class="layer layer3">
        <div class="layer layer4" contentEditable>Edit me</div>
    </div>
</div>

【讨论】:

  • 这真是太棒了。荣誉。为您 +2 MySpace 荣誉(或 +1 SO 积分)。
【解决方案2】:

绝对定位元素从流中移除,因此被其他元素忽略

您唯一的方法是将子位置设置为 position:relative,这样就可以使用 右、左、上和下移动它并将父显示更改为 display:inline-block

【讨论】:

  • 感谢您的想法,但不幸的是,当有多个孩子时,这会失败。第二个孩子的位置从第一个孩子的位置偏移,这是 position: relative 的预期行为。
【解决方案3】:

如果您想让孩子保持绝对定位,您可以使用以下脚本来调整容器的大小:http://jsfiddle.net/6csrV/7/

var layer1 = document.getElementsByClassName('layer1'),
    i = 0, len = layer1.length, childHeight;
for(; i < len; i++) {
    childHeight = layer1[i].getElementsByClassName('layer')[0].clientHeight;
    layer1[i].style.height = childHeight + 'px';
}
document.addEventListener('keyup', function(e) {
    if(e.target.className.indexOf('layer2') !== false) {
        e.target.parentNode.style.height = e.target.clientHeight + 'px';
    }
});

【讨论】:

  • 如果找不到更好的解决方案,我将使用与此类似的解决方案。但是当有几十个元素以各种方式嵌套时,它变得更加复杂。那我不喜欢在页面加载时运行 javascript 来修复布局。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2016-06-17
相关资源
最近更新 更多