防止宽表拉伸flexbox项和容器,而使其(表而不是容器)可滚动

时间:2018-07-14 11:46:22

标签: html css html-table flexbox overflow

我的顶层布局是n列,所有列的宽度都是固定的(侧边栏),中间的(主栏)应该自动填充剩余的空间。

所以,我在主栏中有一张棘手的宽表。它具有一个带有overflow-x: auto的包装器,但是,它不希望触发包装器上的滚动,而是更倾向于将所有内容拉伸到顶级flex容器。可以通过在主栏中添加width: calc(100% - {sum of widths of other columns}px)来解决此问题,但是我正在寻找一种更灵活的解决方案,该解决方案将允许添加更多列并调整现有列的大小,而无需触及此calc规则。

有什么想法吗?有什么办法可以对弹性商品说:填满剩余空间,但不允许您的内容拉长您的力量

UPD :通过使用table-layout: fixed(代码为here)将主栏的内容包装在一个表中来做到这一点,但我对此感到很难过。有人知道更灵活的解决方案吗?还是可以吗?

// this JS generates placeholder text, ignore it
for (const el of document.querySelectorAll(".lorem")) {
    el.innerHTML = Array(Number(el.getAttribute("p")) || 1)
        .fill()
        .map(() => `<p>${chance.paragraph()}</p>`)
        .join("");
}
body {
    margin: 0;
}

.outer {
    display: flex;
}

.sidebar {
    flex: 0 0 300px;
    background: #eef;
}

.mainbar {
    background: #ffe;
    /* width: calc(100% - 500px); */
}

.rightbar {
    flex: 0 0 200px;
    background: #fef;
}

.table-wrapper {
    width: 100%;
    overflow-x: auto;
    background: pink;
}

.table-wrapper td {
    min-width: 400px;
}
<script src="https://unpkg.com/chance@1.0.16/chance.js"></script>
<div class="outer">
    <div class="sidebar">
        <div class="lorem" p="4"></div>
    </div>
    <div class="mainbar">
        <div class="table-wrapper">
            <table>
                <tr>
                    <td class="lorem"></td>
                    <td class="lorem"></td>
                    <td class="lorem"></td>
                    <td class="lorem"></td>
                </tr>
            </table>
        </div>
        <div class="lorem" p="10"></div>
    </div>
    <div class="rightbar">
        <div class="lorem" p="3"></div>
    </div>
</div>

1 个答案:

答案 0 :(得分:4)

如果我理解您的说法正确,请将flex: 1; min-width: 0;添加到您的.mainbar规则中,它应该会起作用。

flex: 1将使其占用可用空间,而min-width: 0将使flex项小于其内容,您可以在此处阅读更多内容:

堆栈片段

// this JS generates placeholder text, ignore it
for (const el of document.querySelectorAll(".lorem")) {
    el.innerHTML = Array(Number(el.getAttribute("p")) || 1)
        .fill()
        .map(() => `<p>${chance.paragraph()}</p>`)
        .join("");
}
body {
    margin: 0;
}

.outer {
    display: flex;
}

.sidebar {
    flex: 0 0 300px;
    background: #eef;
}

.mainbar {
    background: #ffe;
    flex: 1;
    min-width: 0;
    /* width: calc(100% - 500px); */
}

.rightbar {
    flex: 0 0 200px;
    background: #fef;
}

.table-wrapper {
    width: 100%;
    overflow-x: auto;
    background: pink;
}

.table-wrapper td {
    min-width: 400px;
}
<script src="https://unpkg.com/chance@1.0.16/chance.js"></script>
<div class="outer">
    <div class="sidebar">
        <div class="lorem" p="4"></div>
    </div>
    <div class="mainbar">
        <div class="table-wrapper">
            <table>
                <tr>
                    <td class="lorem"></td>
                    <td class="lorem"></td>
                    <td class="lorem"></td>
                    <td class="lorem"></td>
                </tr>
            </table>
        </div>
        <div class="lorem" p="10"></div>
    </div>
    <div class="rightbar">
        <div class="lorem" p="3"></div>
    </div>
</div>