使用 CSS Flex 实现指定间距的九宫格

Jul 29, 2023 • 预计阅读时间 1 分钟

有这样的需求:在指定的宽度中,实现一个 9x9 的九宫格布局,item 之间的间距是固定的,比如 4px。item 的宽度等于容器宽度减去间距后平分,需要动态确定。

Flex 实现宫格布局很简单,只需要设置为 row 排列,然后指定 wrap 换行排列就行了:

*, ::after, ::before {
    box-sizing: border-box;
}
.grid {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
}
.item {
    display: flex;
    width: 33.333333%;
    aspect-ratio: 1;
}

每个 item 的宽度设置为父元素宽度的 1/3,就实现了一个九宫格。

现在 item 之间是没有间距的,把内容放在 item 里面,然后对 item 设置 padding,这样每个 item 之间就产生了间距:

.item {
    display: flex;
    width: 33.333333%;
    aspect-ratio: 1;
    padding: 2px;
}
.grid-img-item {
    display: flex;
    width: 100%;
    height: 100%;
    background: red;
}

如果设计稿的间距是 4px,那么这里的 padding 就设置为 2px = 4px * 0.5 。

但是现在整个九宫格产生了 2px 的 padding,需要使用负数的 margin 把多余的 padding 抵消掉:

.grid {
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    margin: -2px;
}

现在就自适应宽度,还能指定间距的九宫格布局就完成了。

完整的 demo:

<!DOCTYPE html>
<html>
    <head>
        <style>
            *, ::after, ::before {
                box-sizing: border-box;
            }
            .content {
                display: flex;
                flex-direction: column;
                margin: auto;
                background: orange;
                overflow: hidden;
                width: 85%;
            }
            .grid {
                display: flex;
                flex-direction: row;
                flex-wrap: wrap;
                background: green;
                margin: -2px;
            }
            .item {
                display: flex;
                width: 33.333333%;
                aspect-ratio: 1;
                padding: 2px;
            }
            .grid-img-item {
                display: flex;
                width: 100%;
                height: 100%;
                background: red;
            }
        </style>
    </head>
    <body>
        <div class="content">
            <div class="grid">
                <span class="item"><img class="grid-img-item"/></span>
                <span class="item"><img class="grid-img-item"/></span>
                <span class="item"><img class="grid-img-item"/></span>
                <span class="item"><img class="grid-img-item"/></span>
                <span class="item"><img class="grid-img-item"/></span>
                <span class="item"><img class="grid-img-item"/></span>
                <span class="item"><img class="grid-img-item"/></span>
                <span class="item"><img class="grid-img-item"/></span>
                <span class="item"><img class="grid-img-item"/></span>
            </div>
        </div>
    </body>
</html>
CSS
版权声明:如果转发请带上本文链接和注明来源。

lvv.me

iOS/macOS Developer

使用 pkgbuild 制作 pkg 安装文件

OpenWRT 22 配置 NAT66