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

时间:2017-05-05 16:20:54

标签: html css css3 flexbox

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

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

性能不佳,所以今天我一直在迁移到基于弹性盒的解决方案,速度要快得多。

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

目标:

  1. 3栏
  2. 列宽不同以填充父
  3. 列之间的间距
  4. 高度在一行内均衡
  5. 如何安排容器尺寸得到尊重并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; 
                } 
    <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> 

1 个答案:

答案 0 :(得分:51)

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

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

要覆盖此行为,请使用min-width: 0overflow: hiddenMore details.

#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;
}
<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>