【问题标题】:Expand the parent div of floated elements to fit their total width?扩展浮动元素的父 div 以适应它们的总宽度?
【发布时间】:2014-01-22 08:01:05
【问题描述】:

我正在尝试将一个页面放在一个页面上,该页面上会有一个水平滚动窗格 - 这是我想要获得的布局示例: 内容是动态添加的并且具有不同的维度。 .

这是一些 HTML:

<div class="container">
    <div class="inner">
        <div></div>
        <div></div>
        <div></div>
    </div>
</div>

基础 CSS:

.container {
    width: 100%;
    height: 100%;
}

.container .inner {
    position: relative 
}

.container .inner > div {
    float: left;
}

目前我可以让它工作的唯一方法是为.inner 设置一个明确的宽度。否则,我最接近的是this 答案,但离我想要的效果还很远。是否有可能单独使用 HTML/CSS 来实现我正在寻找的东西,还是我必须求助于 javascript?

【问题讨论】:

  • 仅供参考 display: inline-block 您只需将文本设置为 vertical-align: top 即可恢复。您是否有不能为.inner 设置显式宽度的原因?
  • 不管怎样,当inline-block .inner 容器宽度不是它的孩子的总和。
  • 是的,我知道,这只是一个旁注。那么您无法在.inner 上设置宽度的原因是什么?
  • 浮动元素的大小/数量发生变化,所以我需要一个动态宽度。
  • 明白了,是的,你最好的选择可能是使用 javascript。您可以在加载时确定盒子的大小并调整容器宽度以匹配

标签: javascript html css responsive-design


【解决方案1】:

这是您的预期吗? http://jsfiddle.net/GE5Hf/4/

只需将white-space: nowrapinline-blockvertical-align: top 一起使用。你不需要你的 .inner div 来达到预期的效果 - 只需使用一个带有 overflow-x: auto 的容器:

<div class="container">
        <div id="i1"></div>
        <div id="i2"></div>
        <div id="i3"></div>
</div>

CSS

.container {
    width: 100%;
    height: 100%;
    overflow-x: auto;
    white-space: nowrap; 
}

.container > div {
    display:inline-block;
    vertical-align: top;
}

注意:最好使用overflow-x: auto 而不是scroll,以防万一不需要滚动条。

编辑:我们猜测您是否真的需要那个 .inner div。如果需要,可以直接添加回来,不需要特殊样式:http://jsfiddle.net/GE5Hf/5/

编辑 2: 要将 .inner div 的宽度作为其子元素,只需将其指定为 display:inline-blockhttp://jsfiddle.net/GE5Hf/8/

编辑 3: 尝试了您在上次删除的评论中的建议,即删除子项的固定宽度。这真的很棘手,我不得不用display: table-cell 将每个子元素包装到特殊的div 中,而inner div 得到dislay: table-rowhttp://jsfiddle.net/GE5Hf/12/

【讨论】:

  • 看起来好像缺少一个 HTML 元素。在这里查看我的小提琴:jsfiddle.net/eZ4j4 - 我相信他想要一个包含名为“inner”的元素,它将所有项目的宽度组合在一起。
  • @codefactor - 我认为您是XY problem 的另一个受害者 :-) 我们必须尝试在 OP 问题中区分什么是 目的 和唯一一个意味着达到那个目的。如果页面的外观和行为符合预期,我认为没有用户会错过一些“内部 div”:-)
  • 我的直觉说你是对的,但我可以想到几个原因,人们希望内部 div 将所有项目的宽度组合在一起。也许是因为他不知道其他方法可以达到这个结果。也许是因为他想要整个项目块周围的填充和/或边框,但在滚动内部而不是在它周围。或者他可能出于一些奇怪的布局原因想使用 offsetWidth 值?
  • @codefactor 这一切都是可能的,但是应该在问题中提到目的,让我们对其进行优化。反正重新加回来也不是很复杂。
  • 我应该指出的另一件事,如果你仔细观察 OPs 模型,元素周围有一个绿色区域,“内部”后面有黑色背景,但仍在“容器”内 -但我同意问题的文本部分没有明确定义“内部”的目的。
【解决方案2】:

看看这个,不需要脚本:

.container {
    width: 300px;
    height: 100%;

    background-color: silver;
}

.container .inner {
    white-space:nowrap;
    padding: 10px;
    overflow-x: scroll;

    background-color: gray;
}

.container .inner > div {
    display: inline-block;
    vertical-align:top;

    background-color: red;
    border: 1px solid black;
}

演示:http://jsfiddle.net/er144/4FLWK/

【讨论】:

    【解决方案3】:

    这只能使用 CSS 来完成。

    这是一个jsFiddle

    解决方案是在.container 上设置position: relative;,这会在.container 内部创建一个新的堆叠上下文,在.inner 上设置position: absolute;white-space: nowrap; 可以确保.inner 的内容@987654330 @'s 不会换行到下一行,.inner 将随其内容增长,在 .inner &gt; div's 上添加 display: inline-block;vertical-align: top; 确保它们被视为内联元素并坚持到顶部它们的包含元素。

    我相信这就是你所追求的,我已经检查了最新版本的 IE、Chrome、Firefox 和 Safari,它们都可以正常运行,我没有理由相信它不会在旧版本上运行版本。

    HTML

    <div class="container">
        <div class="inner">
            <div></div>
            <div></div>
            <div></div>
        </div>
    </div>
    

    CSS

    .container {
        position: relative;
        width: 220px;
        height: 400px;
        overflow-x: scroll;
    }
    .container .inner {
        position: absolute;
        white-space: nowrap;
        background-color: #FFCCFF;
    }
    .container .inner > div {
        vertical-align: top;
        display: inline-block;
        margin: 10px;
    }
    

    【讨论】:

    • 哇!我只是快了 秒,但想法基本相同 :-) 我总是最慢 :) 请注意,此解决方案可以大大简化,请参阅我的回答。
    • 是的,我注意到了,在我的示例中额外的 div 的原因仅仅是因为当我阅读问题时,似乎 OP 需要扩展内部 div,而你我只是把它放在一起,这当然是一般布局问题的更简单的解决方案。我们将看看它是如何从这里开始的:)
    • 我们必须小心不要陷入XY problem :-) 我认为“内部div”不是最终目标,只是尝试手段来实现该目标.如果页面的外观和行为符合预期,我认为没有用户会错过一些“内部 div”:-)
    • @Tomas,是的,你说得对,它可能是 XY,但就像 @codefactor 一样,我可以想到特别想要 .inner div 的原因。
    • 我的荣幸,别忘了用绿色勾号标记这个答案:)
    【解决方案4】:

    @styke 您可以使用 display:inline-block(以及 .inner > div 上的一些字体大小)和 font-size:0 到 div.inner 来做到这一点。

    此处提供小提琴:http://jsfiddle.net/zepva/4/,忽略颜色,我仅将它们用于演示

    font-size:0 将使用 display:inline-block 消除元素之间的间隙,因此当您获得 div.inner 的总宽度时,这将是子 div 的总和

    【讨论】:

      【解决方案5】:

      position: relative 是强制性的吗?

      .container .inner {
          position: fixed;
          overflow: hidden;
      }
      

      demo

      【讨论】:

      • 这不是 OP 想要的。只要给 .inner div 更多的宽度,你就会发现它会停止工作:jsfiddle.net/TKRMB/5
      【解决方案6】:

      display:inline-block,加上vertical-align:top,这样你的文字就不会落在容器的底部。

      .container .inner > div {
          display:inline-block;
      vertical-align:top;
      }
      

      【讨论】:

      • 查看我对 jmore 评论的回复
      猜你喜欢
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多