防止子元素在flexbox中溢出其父元素

Chr*_*ris 26 html css css3 flexbox

我正在开发一个显示大量网卡的网络应用程序,其高度本身就是可变的.

为了美学,我们使用jQuery .matchHeight()来平衡每一行中卡片的高度.

它的性能不能很好地扩展,所以今天我一直在迁移到基于灵活盒的解决方案,这个解决方案要快得多.

但是,我丢失了一个行为 - 如果卡片标题不适合,则应使用省略号截断.

目标:

  1. 3列
  2. 列宽可以填充父级
  3. 列之间的间距恒定
  4. 高度在一排内均衡

如何安排得到尊重容器大小和text-overflow: ellipsis;white-space: nowrap;兑现?

(没有jQuery标签,因为我们正在远离那个)

我的解决方案是当前的形式,除了截断之外,它实现了我的所有目标:

https://codepen.io/anon/pen/QvqZYY

#container { 
                display: flex; 
                flex-direction: row; 
                flex-wrap: wrap; 
                
                justify-content: flex-start;    /* Bias cards to stack from left edge       */ 
                align-items: stretch;           /* Within a row, all cards the same height  */ 
                
                border: thin solid gray; 
            } 
            .card-wrapper { 
                width: 33.33%; 
                display: flex; 
                background: #e0e0ff; 
            } 
            .card { 
                flex-grow: 1; 
                margin: 7px; 
                display: flex; 
                flex-direction: column; 
                border: thin solid gray; 
                background: #e0ffff; 
            } 
            .card div { 
                border: thin solid gray; 
            } 
            .card div:nth-child(1) { 
                white-space: nowrap; 
                text-overflow: ellipsis; 
            } 
            .card div:nth-child(2) { 
                flex-grow: 2; 
            } 
Run Code Online (Sandbox Code Playgroud)
<div id="container"> 
            <div class="card-wrapper"> 
                <div class="card"> 
                    <div>Title</div> 
                    <div>Multiline<br/>Body</div> 
                    <div>Footer</div> 
                </div> 
            </div> 
            <div class="card-wrapper"><div class="card"><div>Really long rambling title that pushes beyond the bounds of the container, unless your screen is really, really wide</div><div>Body</div><div>Footer</div></div></div> 
            <div class="card-wrapper"><div class="card"><div>Title</div><div>Body</div><div>Footer</div></div></div> 
            <div class="card-wrapper"><div class="card"><div>Title</div><div>Body</div><div>Footer</div></div></div> 
            <div class="card-wrapper"><div class="card"><div>Title</div><div>Body</div><div>Footer</div></div></div> 
        </div> 
Run Code Online (Sandbox Code Playgroud)

Mic*_*l_B 71

弹性项目的初始设置是min-width: auto.这意味着默认情况下,弹性项目不能小于其内容的大小.

因此,text-overflow: ellipsis无法工作,因为flex项只会扩展,而不是允许溢出.(出于同样的原因,滚动条也不会渲染.)

要覆盖此行为,请使用min-width: 0overflow: hidden.更多细节.

#container {
  display: flex;
  flex-wrap: wrap;
  border: thin solid gray;
}

.card-wrapper {
  width: 33.33%;
  display: flex;
  background: #e0e0ff;
}

.card {
  flex-grow: 1;
  margin: 7px;
  display: flex;
  flex-direction: column;
  border: thin solid gray;
  background: #e0ffff;
  overflow: hidden;        /* NEW */
}

.card div {
  border: thin solid gray;
}

.card div:nth-child(1) {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;        /* NEW */
}

.card div:nth-child(2) {
  flex-grow: 2;
}
Run Code Online (Sandbox Code Playgroud)
<div id="container">
  <div class="card-wrapper">
    <div class="card">
      <div>Title</div>
      <div>Multiline<br/>Body</div>
      <div>Footer</div>
    </div>
  </div>
  <div class="card-wrapper">
    <div class="card">
      <div>Really long rambling title that pushes beyond the bounds of the container, unless your screen is really, really wide</div>
      <div>Body</div>
      <div>Footer</div>
    </div>
  </div>
  <div class="card-wrapper">
    <div class="card">
      <div>Title</div>
      <div>Body</div>
      <div>Footer</div>
    </div>
  </div>
  <div class="card-wrapper">
    <div class="card">
      <div>Title</div>
      <div>Body</div>
      <div>Footer</div>
    </div>
  </div>
  <div class="card-wrapper">
    <div class="card">
      <div>Title</div>
      <div>Body</div>
      <div>Footer</div>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • Flex 子项上的 `min-width: 0` 正是我所寻找的。使文本溢出完美发挥作用。谢谢! (5认同)
  • `min-width:0`解决了我的问题.我已经在我的容器上放置了`max-width:x`,因此文本溢出会起作用,但这会将其他项目从容器中推出响应.`min-width:0`阻止了:)谢谢! (4认同)
  • 这次真是万分感谢。被困了几个小时..:) (2认同)