【问题标题】:Set div to have its siblings width将 div 设置为具有其兄弟姐妹的宽度
【发布时间】:2012-04-03 21:41:42
【问题描述】:

我正在寻找以下 CSS 解决方案:-

<div style="display:inline;">
     <div>The content of this div is dynamically created but will always be wider than
              the below div. 
     </div>
     <div> Need this div to have the same width as the above div.
     </div>
</div>

包装器div 具有内联显示并按预期工作,两个子 div 都具有动态生成的内容。我需要底部的取前一个兄弟的宽度。

非常感谢您提前提出的任何建议。

【问题讨论】:

  • div 是一个块元素,它们会自动采用他的父宽度。检查这个jsfiddle.net/qG7b8
  • 确实如此。两个内部 div 的宽度最大化以适合其父级的宽度。这可能不是你的意思......
  • 感谢您的 cmets。我给了包装器 div 一个 display:inline 属性,这意味着它采用了它最宽的孩子的宽度。现在我需要的是让第二个子 div 取第一个子 div 的宽度。
  • 检查我上面的小提琴:)
  • @sandeep 我不希望包装 div 占据整个屏幕。我希望它和它最宽的孩子一样宽。我希望这是有道理的。

标签: html css


【解决方案1】:

不确定我是否理解您要执行的操作,但看起来为最后一个 div 设置 100% 宽度应该可以:

<div style="width:100%;"> 

顺便说一句,第一个 div 中的样式没有很好地定义,您应该在属性定义中使用冒号而不是等号:

<div style="display:inline;">

【讨论】:

  • 不需要定义 width:100% 因为 div 是一个块元素并且它需要自动宽度
  • 这会强制包装 div 占据整个屏幕,而不是将子 div 设置为包装 div 的 100%...是的 ;) 很好。
  • 在花了很多时间弄乱 CSS 之后,我决定抽出一些时间来使用表格。半分钟 = 工作完成。 jsfiddle.net/XdLku/1现在大家不要一下子大喊大叫!感谢您的贡献。
【解决方案2】:

将您的 div 设置为 display:inline-block,这样您的 div 将随着其中的内容展开。

http://jsfiddle.net/CpKDX/

【讨论】:

  • jsfiddle.net/CpKDX/5 在上面的示例中,我希望第二个子 div 采用第一个子 div 的宽度,即它是前一个兄弟。
  • @user1278456 你可以将你的容器 div 设置为 display:inline-block 而不是 display:inline 并且你会得到这些结果,jsfiddle.net/CpKDX/6
  • 这并没有给我想要的结果。我想要的是底部 div 采用上面小提琴中没有的顶部 div 的高度。
  • @user1278456 aah,刚刚明白你的问题,试试这个:jsfiddle.net/CpKDX/7 .. 使用通用兄弟选择器,您可以将样式应用于第一个之后的 div。
【解决方案3】:

更新:这对我有用,我刚刚尝试过:

<div style="max-width:980px;border:1px solid red;">
   <div style="background:#EEE;float:left;">
     <div style="width:auto;border:1px solid blue;float:left;">If you use 100% here, it will fit to the width of the mother div automatically.</div>
     <div style="border:1px solid green;"> The div will be 100% of the mother div too.</div>
   </div>
     <div style="clear:both;"></div>
</div>

这是你想要的吗?边框和背景只是为了显示 div ;)


就这样吧:

假设您希望整个 div 最大。 980px(否则就忽略它或用 100% 替换)...

<div style="max-width:980px;">
     <div style="width:100%;">If you use 100% here, it will fit to the width of the mother div automatically.
     </div>
     <div style="width:100%;"> The div will be 100% of the mother div too.
     </div>
</div>

第二种选择是,多使用一个 div... 或者您使用 style="width:auto;" 作为动态 div...

【讨论】:

  • 啊,恐怕这也不会产生预期的效果。
  • 因为它是妈妈的 100% 的 div,对吧?如果这不是您想要的,请对两个内部 div 使用 width:auto .. 这对您有用吗?
  • @user1278456:我刚刚更新了它,它对我有用...如果您正在寻找它,请告诉我:)
【解决方案4】:

花车和桌子太晚了 2000 年。使用今天的浏览器,我们可以使两个兄弟 DIV 的宽度相互匹配,无论哪个更大/更小。

这是适合 2016 年的 Flexbox 解决方案:

.wrapper {
  display: inline-block;
}

.parent {
  display: flex;
  flex-direction: column;
}

/* For visualization */
.child {
  border: 1px solid #0EA2E8;
  margin: 2px;
  padding: 1px 5px;
}
<div class="wrapper">
  <div class="parent">
    <div class="child">Child number one</div>
    <div class="child">Child #2</div>
  </div>
</div>

【讨论】:

  • 但是如果你不想让第二个孩子决定宽度(并且它比第一个孩子长),这将不起作用。第一个孩子将变得和第二个孩子一样宽。
  • @Skitterm 是的,但问题是:“我需要底部一个来取前一个兄弟的宽度”
  • @pilau 是的。正如skitterm 所说,如果底部孩子的内容比前一个兄弟姐妹大,这个解决方案将不起作用。你懂的。如果没有写Child #2。这可能是一种罕见的情况,但您知道,在现实世界的场景中,您不会将太多 Child#2 写入内容。我的意思是这不是很明显吗?
  • 小改进:如果在.parent中使用display: inline-flex而不是flex,则可以保存.wrapper div
【解决方案5】:

如果您愿意放弃几个&lt;div&gt;s,那么我有适合您的解决方案:

<div style=“display: inline-block;”>
  <table>
    <tr>
      <td>The table automatically makes its siblings the same width</td>
    </tr>
    <tr>
      <td>So this will be as wide</td>
    </tr>
  </table>
</div>

记得设置div display:inline-block;

【讨论】:

    【解决方案6】:

    这是另一个 Flexbox 解决方案,它允许将第二个孩子换行以匹配可变高度兄弟的宽度。

    .wrapper > div {
      border: 1px solid;
    }
    
    .child {
      display: flex;
    }
    
    .child div {
      flex-grow: 1;
      width: 0;
    }
    
    .wrapper {
      display: inline-block;
    }
    <div class="wrapper">
        <div>This div is dynamically sized based on its content</div>
        <div class="child"><div>This div will always be the same width as the preceding div, even if its content is longer (or shorter too).</div></div>
    </div>

    编辑:

    若要支持.child 下的多个divs,其中每个div 独占一行,请添加break-after: always; ...

    .child div {
      flex-grow: 1;
      width: 0;
      break-after: always;
    }
    

    【讨论】:

    • 不错的解决方案。我希望在较大的 div 周围不要有额外的 div(并使用纯 css 来完成),但我现在会解决这个问题。幸运的是,就我而言,我什至不需要父 .wrapper div。我没有调查具体原因,但认为值得一提。
    • 无法在 Edge V44.17763.771.0 上运行,奇怪的是,相同的解决方案在 IE 11.805 上运行良好
    • 嗨@Peter,如果 .child 下有多个 div,则子 div 会根据其内容进行拉伸,而不是具有兄弟的宽度。请检查此链接是否相同 - jsfiddle.net/eotfy6w8/1。请让我知道如何修复代码,以便所有子 div 的宽度与其兄弟的宽度相同。
    【解决方案7】:

    这里仍然是基于 flexbox 的方法。

    基本思想:在最外层的包装器中,需要等宽的元素被包装到另一个包装器中。

    .wrapper {
      display: inline-block;
    }
    
    .flex-wrapper {
      display: flex;
      flex-direction: column;
    }
    
    .demo-bar {
      height: 4px;
      background-color: deepskyblue;
    }
    <div class="wrapper">
      <div class="flex-wrapper">
        <div contenteditable>Some editable text.</div>
        <div class="demo-bar"></div>
      </div>
    </div>

    另一个实际示例:在媒体(视频或音频)元素下方具有相同宽度的自适应进度条。

    video.addEventListener("timeupdate", () =>
      progress.style.width = `${video.currentTime / video.duration * 100}%`
    )
    .wrapper {
      display: flex;
      flex-direction: column;
      position: relative;
      align-items: center;
    }
    
    video {
      display: block;
      max-width: 100%;
    }
    
    .progress-bar {
      height: 0.25rem;
      background: #555;
    }
    
    #progress {
      width: 0%;
      height: 100%;
      background-color: #595;
    }
    <div class="wrapper">
      <div data-css-role="wrapper">
        <video id="video" controls>
          <source src="https://raw.githubusercontent.com/mdn/interactive-examples/master/live-examples/media/cc0-videos/flower.webm">
        </video>
        <div class="progress-bar">
          <div id="progress"></div>
        </div>
      </div>
    </div>

    【讨论】:

      【解决方案8】:

      2021 保持简单...

      使用gridfractional 单元?然后,您可以根据需要拆分为多个相同大小的行或列:

      .container {
        display: grid;
        grid-template-columns: repeat(2, 1fr);
        grid-column-gap: 1em;
      }
      
      .container > div {
        border: 1px solid black;
        padding: 0.5em;
      }
      <div class="container">
        <div>I'm a part of a grid. I will be split up into equal parts with my other sibling(s) depending on how many columns the grid is given.</div>
        <div>I am a sibling element.</div>
      </div>

      【讨论】:

      • 这不会使底部 div 与顶部兄弟的宽度匹配,它只是为两个 div 提供相等的父容器空间。每个 div 将始终是父级的 50% 宽度。它们不会根据动态内容进行调整和匹配。
      猜你喜欢
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 2019-05-06
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多