【问题标题】:How to create horizontal scrollable container contains multiple rows如何创建水平滚动容器包含多行
【发布时间】:2023-03-29 14:28:02
【问题描述】:

我试图制作一个数据网格,其中 粘性导航栏可以水平滚动到其下方的内容。然而,行为在两个场景中发生了变化。

  • 当最外层框太窄时,主区域可以水平滚动,但是navrows的宽度被限制为父框的宽度,导致不希望的行为 背景颜色。
    • 这可以通过将navrows的宽度都设置为fit-content来解决
  • 当最外面的框太宽时,因为宽度已设置为fit-content,所有行都收缩到左侧而不是填满整行。
    • 这可以通过将navrows的宽度都设置为100%来解决

那么我应该怎么做才能让它们在这两种情况下都能正常运行。

我尝试过的其他解决方案:

  • 使用flex-rowwarp,但是,当内容的宽度太小时,导航栏和行将在同一行
  • nav中使用inline-block,在rows中使用inline-flex,行为同上。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .grid {
            height: 60px;
            width: 200px;
            overflow: auto;
        }
        .subgrid {

        }
        .nav {
            position: sticky;
            top: 0;
            background: #da1039;
        }
        .rows {
            display: flex;
            flex-direction: column;
            flex-wrap: nowrap;
            background: #00b89c;
        }
        .row {
            display: flex;
            flex-direction: row;
            flex-wrap: nowrap;
            justify-content: space-evenly;
        }
        .rowitem {
            border: 1px solid;
            min-width: 20px;
        }
    </style>
</head>
<body>
    <div class="grid">
        <div class="subgrid">
        <div class="nav">
            <div class="row">
                <div class="rowitem">HHH</div>
                <div class="rowitem">HHH</div>
                <div class="rowitem">HHH</div>
                <div class="rowitem">HHH</div>
                <div class="rowitem">HHH</div>
            </div>
        </div>
        <div class="rows">
            <div class="row">
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
            </div>
            <div class="row">
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
            </div>
            <div class="row">
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
            </div>
            <div class="row">
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
            </div>
        </div>
        </div>
    </div>
</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .grid {
            height: 60px;
            width: 50px;
            overflow: auto;
        }
        .subgrid {

        }
        .nav {
            position: sticky;
            top: 0;
            background: #da1039;
        }
        .rows {
            display: flex;
            flex-direction: column;
            flex-wrap: nowrap;
            background: #00b89c;
        }
        .row {
            display: flex;
            flex-direction: row;
            flex-wrap: nowrap;
            justify-content: space-evenly;
        }
        .rowitem {
            border: 1px solid;
            min-width: 20px;
        }
    </style>
</head>
<body>
    <div class="grid">
        <div class="subgrid">
        <div class="nav">
            <div class="row">
                <div class="rowitem">HHH</div>
                <div class="rowitem">HHH</div>
                <div class="rowitem">HHH</div>
                <div class="rowitem">HHH</div>
                <div class="rowitem">HHH</div>
            </div>
        </div>
        <div class="rows">
            <div class="row">
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
            </div>
            <div class="row">
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
            </div>
            <div class="row">
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
            </div>
            <div class="row">
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
                <div class="rowitem">AAA</div>
            </div>
        </div>
        </div>
    </div>
</body>
</html>

【问题讨论】:

    标签: javascript html css flexbox


    【解决方案1】:

    您实际上可以将两者结合起来。

    例如:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .grid-1 {
                height: 60px;
                width: 200px;
                overflow: auto;
            }
    
            .grid-2 {
                height: 60px;
                width: 900px;
                overflow: auto;
            }
            /* here */
            .nav {
                min-width: fit-content;
                max-width: 100%;
                position: sticky;
                top: 0;
                background: #da1039;
            }
            .rows {
                min-width: fit-content;
                max-width: 100%;
                display: flex;
                flex-direction: column;
                flex-wrap: nowrap;
                background: #00b89c;
            }
            .row {
                display: flex;
                flex-direction: row;
                flex-wrap: nowrap;
                justify-content: space-evenly;
            }
            .rowitem {
                border: 1px solid;
                min-width: 20px;
            }
        </style>
    </head>
    <body>
        <div class="grid-1">
            <div class="nav">
                <div class="row">
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                </div>
            </div>
            <div class="rows">
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
            </div>
            </div>
        </div>
        <div style="height: 20px"></div>
        <div class="grid-2">
            <div class="nav">
                <div class="row">
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                    <div class="rowitem">HHH</div>
                </div>
            </div>
            <div class="rows">
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
                <div class="row">
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                    <div class="rowitem">AAA</div>
                </div>
            </div>
        </div>
    </body>
    </html>

    【讨论】:

    • 这就像魔术一样,谢谢。对了,我看到mdn说min-width override max-width,那么max-width是什么意思。
    • 如果sub-grid div 是必需的?
    • max-width 是块可以占用的最大宽度。
    • 我的意思是如果它真的在 min-width 的存在下工作。
    • 是的,min-width 覆盖 max-width 只是意味着:如果两者之间存在冲突 - min-width 优先。至于subgrid:我不知道。我以为你打算把它用于其他目的。我只是把它放在那里,如果您要复制粘贴,它将很有用。它在您的原始代码示例中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2017-01-26
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多