CSS 网格自动跨越可用空间

问题描述 投票:0回答:3

我正在尝试创建一个包含 2 个项目的基于 css 网格的布局,第一个项目将跨越宽度的 1/3,第二个项目将跨越宽度的 2/3,但是当宽度低于某个阈值时,第二个项目将跨越宽度跳到第二行,第一个项目应该填充第一行。

.grid {
  display:grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  grid-gap: 10px;
}

.span1 {
  background-color:green;
}

.span2 { 
  background-color:red;
  grid-column-end: span 2; 
}

我这里有一个例子:https://codepen.io/anon/pen/qopvQz

一切正常,但我希望当第二个项目(红色)向下跳到第二行时,第一个项目(绿色)自动扩展到全宽度。截至目前,第一项仅占第一行的一半。这可以通过 CSS 网格(或 Flexbox)实现吗?

html css flexbox css-grid
3个回答
2
投票

Flexbox 可以做到这一点,但它确实需要一些硬编码的最小宽度或

flex-shrink
设置为
0

.flex {
  display: flex;
  flex-wrap: wrap;
  margin: 1em auto;
}

.flex.narrow {
  width: 250px;
}

.span1 {
  background-color: green;
  flex: 1 0 100px;
  /* min-width: 100px; */
}

.span2 {
  background-color: red;
  flex: 2 0 200px;
   /* min-width: 200px; */
}
<div class="flex">

  <div class="span1">A</div>
  <div class="span2">B</div>

</div>

<div class="flex narrow">

  <div class="span1">A</div>
  <div class="span2">B</div>

</div>


0
投票

尝试使用 flex 而不是网格来达到此目的。 注意

flex-grow
能力。查看更多这里 结果你会得到这样的东西https://codepen.io/anon/pen/eMyoew


0
投票

您可以尝试容器查询

body {
                margin: 0;
                padding: 0;
            }
            * {
                box-sizing: border-box;
            }
            .grid {
                width: 100%;
                display: grid;
                grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
                grid-template-rows: auto;
                grid-auto-flow: dense;
                gap: 20px;
                padding: 20px;
                container: test / inline-size;
            }

            .cell {
                padding: 20px;
                text-align: center;
                grid-column: span 1;
                background: red;
            }

            .w-2 {
                grid-column: span 2;
                background: blue;
            }

            .w-3 {
                grid-column: span 3;
                background: green;
            }

            /* 750px + 2 * gap */
            @container test (inline-size < calc(790px)) {
                .w-3 {
                    grid-column: span 2;
                }
            }

            /* 500px + gap */
            @container test (inline-size < 520px) {
                .w-2 {
                    grid-column: span 1;
                }
                .w-3 {
                    grid-column: span 1;
                }
            }
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <div class="grid">
            <div class="cell">1</div>
            <div class="cell">2</div>
            <div class="cell">3</div>
            <div class="cell w-2">4</div>
            <div class="cell w-3">5</div>
            <div class="cell">6</div>
            <div class="cell">7</div>
            <div class="cell">8</div>
            <div class="cell">9</div>
        </div>
    </body>
</html>

© www.soinside.com 2019 - 2024. All rights reserved.