【问题标题】:Flexbox child is growing outside its parentFlexbox 孩子在其父母之外成长
【发布时间】:2016-02-11 21:36:28
【问题描述】:

我一直都在使用 flexbox,但由于某种原因,这让我有好几天摸不着头脑。

我正在寻找的是青色区域,可在 XY 方向滚动 (.scrollable),周围有洋红色 (.tab-content) 填充。

似乎将它们放在一起的最低项目是蓝色 (.panels) div,它知道它应该是窗口宽度和 200 像素高。然后 flex 子 .body 就从屏幕上长出来了。

问题似乎在于 .body 无法确定父 .panels 的宽度。我从来没有遇到过这样的问题,我很确定它围绕着无法将文本包装在青色表中,但我必须将它们作为单独的行。

Chrome 48(强制版本):

* {
  box-sizing: border-box;
}
.detail {} .panels {
  background-color: blue;
  display: flex;
  max-height: 200px;
}
.header {
  background-color: red;
  margin-right: 1rem;
  flex-shrink: 0;
}
.body {
  background-color: green;
  display: flex;
  flex-direction: column;
  flex: 1;
}
.tabs {
  flex-shrink: 0;
}
.tab-content {
  flex: 1;
  background-color: magenta;
  padding: 1rem;
}
.scrollable {
  overflow: auto;
  background-color: cyan;
}
.formatted-text {
  white-space: pre;
}
<div class="detail">
  <div class="panels">
    <div class="header">
      <table>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
      </table>
    </div>
    <div class="body">
      <div class="tabs">Tabs</div>
      <div class="tab-content">
        <div class="scrollable">
          <table>
            <tbody>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
    </div>
  </div>
</div>

在这里编写代码: http://codepen.io/anon/pen/BjvWzR

【问题讨论】:

  • 将父容器上的溢出设置为滚动或自动或隐藏。
  • @Blunderfest 使洋红色区域可垂直滚动,并且不影响它从屏幕一侧生长
  • 您需要为每个容器指定溢出,如果我只是在您的 .panels 类上放置溢出隐藏,所有溢出都会被剪裁。把它放在下层的每一层上是一个不错的选择。
  • 你的 html 结构对我来说很难阅读。但这就像你需要的东西:codepen.io/anon/pen/dGwWMR
  • @Blunderfest 同样,您滚动的是洋红色区域而不是青色区域

标签: html css flexbox


【解决方案1】:

你需要用position: absolute解决这个问题,像这样

.scrollable {
  background-color: cyan;
  position: absolute;
  left: 1rem;
  top:1rem; 
  right: 1rem;
  bottom: 1rem;
  overflow: auto;  
}

示例 sn-p

* {
  box-sizing: border-box;
}

.detail {}

.panels {
  background-color: blue;
  display: flex;
  max-height: 200px;
}

.header {
  background-color: red;
  margin-right: 1rem;
  flex-shrink: 0;
}

.body {
  background-color: green;
  display: flex;
  flex-direction: column;
  flex: 1;
}

.tabs {
  flex-shrink: 0;
}

.tab-content {
  flex: 1;
  background-color: magenta;
  padding: 1rem;
  position: relative;
}

.scrollable {
  background-color: cyan;
  position: absolute;
  left: 1rem;
  top:1rem; 
  right: 1rem;
  bottom: 1rem;
  overflow: auto;  
}

.formatted-text {
  white-space: pre;
}
<div class="detail">
  <div class="panels">
    <div class="header">
      <table>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
        <tr>
          <td>Field</td>
          <td>Value</td>
        </tr>
      </table>
    </div>
    <div class="body">
      <div class="tabs">Tabs</div>
      <div class="tab-content">
        <div class="scrollable">
          <table>
            <tbody>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
              <tr>
                <td>01</td>
                <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
    </div>
  </div>
</div>

【讨论】:

  • 这正是我想要的!我尝试过使用绝对/相对定位,但我认为我将它应用于链上太高的元素。谢谢!
【解决方案2】:

我将您的代码复制到一个 .html 文件中并对其进行了测试,它可以按您的预期工作。我的猜测是您的问题是由页面上某些父组件传递的其他 css 引起的。

这是我为获得成功结果而运行的上面你的 css 和 html 的组合:

<html>
<head>
    <style type="text/css">
        * {
          box-sizing: border-box;
        }
        .detail {} .panels {
          background-color: blue;
          display: flex;
          max-height: 200px;
        }
        .header {
          background-color: red;
          margin-right: 1rem;
          flex-shrink: 0;
        }
        .body {
          background-color: green;
          display: flex;
          flex-direction: column;
          flex: 1;
        }
        .tabs {
          flex-shrink: 0;
        }
        .tab-content {
          flex: 1;
          background-color: magenta;
          padding: 1rem;
        }
        .scrollable {
          overflow: auto;
          background-color: cyan;
        }
        .formatted-text {
          white-space: pre;
        }
    </style>
</head>
<body>
    <div class="detail">
      <div class="panels">
        <div class="header">
          <table>
            <tr>
              <td>Field</td>
              <td>Value</td>
            </tr>
            <tr>
              <td>Field</td>
              <td>Value</td>
            </tr>
            <tr>
              <td>Field</td>
              <td>Value</td>
            </tr>
            <tr>
              <td>Field</td>
              <td>Value</td>
            </tr>
          </table>
        </div>
        <div class="body">
          <div class="tabs">Tabs</div>
          <div class="tab-content">
            <div class="scrollable">
              <table>
                <tbody>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                  <tr>
                    <td>01</td>
                    <td class="formatted-text">THIS IS SOME REALLY, REALLY LONG TEXT THAT REPRESENTS FIXED-WIDTH FILE OUTPUT, SO IT WILL BE IN A MONO FONT AND CANNOT BREAK PER LINE. EACH LINE IS 300 BYTES LONG.</td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
        </div>
      </div>
    </div>
</body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多