【问题标题】:Align width of container div to the sum of floating div将容器 div 的宽度与浮动 div 的总和对齐
【发布时间】:2013-02-22 02:08:30
【问题描述】:

我有以下html:

<div class="main_container">
    <div class="sub_container">
        <div class="floating">wookie1</div>
        ...
        <div class="floating">wookie5</div>
    </div>
</div>

把它想象成一个图片库。

main_container 的大小不固定,设置为用户分辨率的百分比。 我希望 sub_container 具有浮动 div 总和的确切宽度。

如果我使用“display:table;”对于 sub_container 和“显示:内联块;”对于浮动 div,它工作正常:

直到列表中有足够的 div,使得宽度的总和大于 main_container 并且它们在下一行中断:

但是,我仍然希望子容器(黄色背景)始终是 div 总和的确切宽度,即使它们分成几行,如下所示:

我已经在 Google 上搜索了几个小时,但无法找到一个优雅的解决方案(如果可能,只能使用 css。)

这是jsfiddle,可以玩这个。

【问题讨论】:

  • 我不明白这个问题。 .main_container 有一个固定的宽度,小于里面的小 div 的总和
  • 也许我不清楚。我希望 sub_container 始终具有浮动 div 总和的确切宽度,即使 div 的数量中断到另一行
  • 但是如果内部浮动 div 的总和大于 .main_container 怎么办?
  • 然后他们会换行。但是 sub_container 仍然不需要 100% 宽度。
  • 如果在父元素上设置宽度,子容器会占据整个父元素的宽度。这对我来说似乎是一个错误。谁能解释这是否是预期的行为?为什么会这样?

标签: css list html width


【解决方案1】:

纯 CSS 解决方案

问题在于,要“知道”到下一行的项目,容器必须“填充”其可用的水平空间,即您的.main_container 宽度。然而,您希望背景不超出实际元素本身所需的范围。所以我使用元素本身在拼凑的伪元素的帮助下创建背景。

Here's the fiddle(在 Win 7 机器上的 IE9、Firefox 18、Chrome 24 中测试)

我正在做的是将背景与每个单独的 .floating 元素拼凑在一起,这使得最右边的元素成为背景大小的右边框控制(注意小提琴中的两个不同宽度的示例)。

每个部分的解释在下面的cmets中给出。有两个主要限制需要注意:

  1. .floating 不能设置 position,因此这是基于特定应用程序的潜在限制。
  2. background 必须是纯色或纯垂直方向的“运动”(即从上到下渐变的渐变,或水平线都可以)。

关键 CSS(带有解释性 cmets)

.sub_container {
    border-left: 1px solid #333; /* forms its own left border */
    overflow: hidden; /* needed for background and border to work */ 
    position: relative; /* positioning background off this */
    z-index: 1; /* needs a stacking context */
}

.floating {
    font-size:20px;
    line-height:30px;
    padding:0 5px 0 5px;
    border: 1px solid black;
    margin: 3px;
    display: inline-block;
    /* NOTE: CANNOT be given positioning  */
}

.floating:after {
    content: '';
    position: absolute; /* will position off subcontainer */
    border-top: 1px solid black; /* makes the top/bottom border itself */
    border-bottom: 1px solid black;
    z-index: -1; /* push it to the background */
    top: 0; /* set it to top of sub_subcontainer */
    bottom: 0; /* set it to bottom of sub_container */
    margin-left: -100%; /* shove it past the far left edge of sub_container */
    /* next, use padding to bring it back to its position at the end
       of the text string of .floating */
    padding-left: 100%;
    /* next, add enough padding on the right to compensate for the right
       padding, right margin, and right border of .floating */
    padding-right: 9px; 
    background-color: yellow; /* set your background color */
    /* NOTE: this will not work with a background image that
       has any horizonal differences to it (top to bottom 
       gradient would probably be okay) */
}

.floating:before { /* make right border */
    content: '';
    padding-top: 10000px; /* give it some obscene height that will not be exceeded */
    margin: -5000px 0; /* counter the padding height by half size margins top/bottom */
     /* next, push this behind the background with an even lower z-index
        to hide it if it is not the right most element beign used to 
        form the right border */
    z-index: -2;
    border-right: 1px solid black; /* make the right border */
    float: right; /* get the before element to the right */
    position: relative; /* needs to be adjusted in position */
    right: -9px; /* move it same as padding-right of the after element */
    display: block; /* give it a display */
}

【讨论】:

  • 太棒了!我已经分叉了小提琴以使其更接近我想要的:jsfiddle.net/3svfj/2。你要去验证和赏金。最后一个问题:我们可以在 main_container 上使用 overflow: auto 吗?到目前为止我失败了。
  • @Seb37:为了确保我清楚,您在其他地方说过 main_container 将按浏览器窗口大小(我相信)。您是否希望它具有窗口的宽度,但 overflow-y 的高度?或者你想要双向溢出(在这种情况下我不得不说,你希望里面的元素什么时候换行)?
  • 仅在高度上溢出。是的,我希望 main_container 由浏览器窗口调整大小。
  • @Seb37:你有很多关键的东西没有在你的小提琴中设置好让它工作。背景颜色不能在sub_container 上以使其“适合”内容的宽度。此外,我发现了额外的限制,即这不允许 text-align: center 出现在包装元素上(但可以出现在 floating 元素本身上)。 Here is the adjusted fiddle. 但是,如果您希望他们到 just align evenly and center,那么您并不真正想要您的问题所要求的内容,而我的所有工作(几乎)都是徒劳的。
  • 我不希望 only 将 sub_container 居中对齐。我需要子容器来定义特定的样式(阴影框、背景等)。我实际上有一个设计,其中页面的宽度分为 3 个元素:左侧菜单(固定宽度)、右侧菜单(固定宽度)和中心,它占据了左侧的所有宽度。我不控制 main_container 的大小,但我想在其中添加一个 sub_container,它将为画廊添加一些背景和样式,所以我真的需要 sub_container div 来设置我想要的确切宽度。我还需要能够在主容器上有溢出-y。谢谢你的工作。
【解决方案2】:

我厌倦了尝试这个并创建了一个基于 jQuery 的 JS 脚本来解决它。

var t = $(".sub_container").width()/$(".floating").outerWidth();
$(".sub_container").width(parseInt(t) * $(".floating").outerWidth());

Demo

【讨论】:

  • 是的!祝你好运。如果你找不到,你可以回到这个。 :)
  • @Seb37 Starx 是对的,没有使用 html/css 解决此问题。最好遵循 jquery 代码,这将更好并且完全兼容浏览器。 +!从我这边。
  • 嗯,这是我目前正在使用的解决方法。如果在赏金结束时我没有得到更好的答案,我会验证这个。
【解决方案3】:

重新阅读您的问题...因为您不会承诺任何事情(最大宽度:80%、500 像素等),我在第四个孩子身上破坏了一切 - 根据您的示例。

CSS

.main_container, .sub_container, .floating { outline:1px solid black }
.sub_container { background-color:yellow; display:table; padding-left:5px }
.floating {
    float:left;
    padding:5px;
    margin:5px 5px 5px 0;
}
.floating:nth-child(4n+5) {
    clear:left;
    float:left;
}

HTML

<div class="main_container">
    <div class="sub_container">
        <div class="floating">wookie1</div>
        <div class="floating">wookie2</div>
        <div class="floating">wookie3</div>
        <div class="floating">wookie4</div>
        <div class="floating">wookie5</div>
        <div class="floating">wookie6</div>
        <div class="floating">wookie7</div>
        <div class="floating">wookie8</div>
        <div class="floating">wookie9</div>
    </div>
</div>



编辑(选项 2)
我不相信您尝试做的事情可以仅通过 HTML/CSS 来完成。我根据预感提供了另一种解决方案……以及您的图片库评论。

CSS

.main_container, .sub_container, .floating { outline:1px solid black }
.main_container {
    text-align:center
}
.sub_container { background-color:yellow; display:inline-block; max-width:80%; }
.floating {
    display:inline-block;
    padding:5px;
    margin:5px;
}

HTML

<div class="main_container">
    <div class="sub_container">
        <div class="floating">wookie1wookie1wookie1</div>
        <div class="floating">wookie2</div>
        <div class="floating">wookie3</div>
        <div class="floating">wookie4</div>
        <div class="floating">wookie5</div>
        <div class="floating">wookie6wookie6</div>
        <div class="floating">wookie7wookie7wookie7</div>
        <div class="floating">wookie8</div>
        <div class="floating">wookie9</div>
    </div>
</div>

它不会使 .subcontainer 捕捉到内容;然而,(使用max-width)它确实允许你从主容器中给它一些喘息的空间,它的子容器可以有各种大小。

【讨论】:

  • 这实际上是我得到的最有启发性的答案。但不幸的是,这仍然不够:我不控制 main_container 的大小,因为它被设置为用户分辨率的百分比。否则,我可以调整 maincontainer 的宽度(带有一些 LESS/SASS 定义)以完美匹配 4 * 浮动 div 宽度。我仍然会编辑问题。
  • 为您的问题添加了另一种方法。这不完全是您正在寻找的东西,但我不认为它甚至可以用直接的 HTML/CSS 做您想做的事情。
  • 显示:表格;这就是解决方案
【解决方案4】:

删除主容器宽度和 .sub_container 绝对位置,你应该很高兴。

.main_container {
    #width:380px;
}

.sub_container {
    #position: absolute;
}

【讨论】:

  • 我仍然希望 main_container 有它的宽度,我只希望 sub_container 完全适合 div 总和的宽度
  • 我明白了,尝试添加 max-width: 335px;到 .main_container
  • 这不是我想去的地方。实际上,我希望这些 div 在需要时可以分几行。我想要的是 sub_container 仍然适合 div 的宽度。我编辑了这个问题,也许现在更清楚了。
  • 我明白了,我认为这在纯 css 中是不可能的。您可能需要像这样使用 jQuery 进行尝试:stackoverflow.com/questions/2335494/…
【解决方案5】:

“sub_container”使用 span 元素而不是 div

.sub_container{background-color:yellow;}     

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多