【问题标题】:Is there a way to specify the entire first and last columns in auto-fit CSS grid?有没有办法在自动适应 CSS 网格中指定整个第一列和最后一列?
【发布时间】:2021-08-09 19:02:03
【问题描述】:

我想要一个看起来像这样的 CSS 网格:

┌─────────┬─────────┬─────────┬─────────┬─────────┐
│         │         │         │         │         │
│         │  item   │  item   │  item   │         │
│         │         │         │         │         │
│         ├─────────┼─────────┼─────────┤         │
│         │         │         │         │         │
│firstcol │  item   │  item   │  item   │ lastcol │
│         │         │         │         │         │
│         ├─────────┼─────────┼─────────┤         │
│         │         │         │         │         │
│         │  item   │  item   │  item   │         │
│         │         │         │         │         │
└─────────┴─────────┴─────────┴─────────┴─────────┘

可以响应调整大小:

┌─────────┬─────────┬─────────┬─────────┐
│         │         │         │         │
│         │  item   │  item   │         │
│         │         │         │         │
│         ├─────────┼─────────┤         │
│         │         │         │         │
│         │  item   │  item   │         │
│         │         │         │         │
│         ├─────────┼─────────┤         │
│         │         │         │         │
│firstcol │  item   │  item   │ lastcol │
│         │         │         │         │
│         ├─────────┼─────────┤         │
│         │         │         │         │
│         │  item   │  item   │         │
│         │         │         │         │
│         ├─────────┼─────────┤         │
│         │         │         │         │
│         │  item   │         │         │
│         │         │         │         │
└─────────┴─────────┘         └─────────┘

或更窄或更宽,等等。

对于包含的 DIV,我尝试了重复...

.container {
  display: grid;
  grid-template-columns: 100px repeat( auto-fit, minmax(250px, 1fr) ) 100px;
  grid-auto-flow: row; /* or column really ;-) - either is ok */
}

...我已经尝试过媒体查询:

.container {
  display: grid;
  grid-template-columns: 100px 1fr 100px;
  grid-auto-flow: column;
}

@media (min-width: 600px) {
  .container {
    grid-template-columns: 100px 1fr 1fr 100px;
  }
}

@media (min-width: 800px) {
  .container {
    grid-template-columns: 100px 1fr 1fr 1fr 100px;
  }
}

@media (min-width: 1200px) {
  .container {
    grid-template-columns: 100px 1fr 1fr 1fr 1fr 100px;
  }
}

对于容器,我试过了:

.firstcol {
  grid-column: 1 / span 1 ;
  grid-row: 1 / -1;
}

.lastcol {
  grid-column: -2 / -1 ;
  grid-row: 1 / -1;
}

...以及地区的变化。我似乎无法动态指定第一列和最后一列区域。

我错了吗? grid-row: 1 / -1; 不是是指第一行到最后一行,还是?

【问题讨论】:

  • 可以通过3个divs的混合来完成。中间的应该是flex box

标签: css css-grid


【解决方案1】:

您可以尝试使用网格区域:

.container {
  display: grid;
  align-items: center;
  justify-items: center;
  text-align: center;
}

.col {
  border: 1px solid black;
  padding: 50px;
}



@media (min-width: 600px) {
  .container {
    grid-template-columns: 100px repeat(2, 1fr) 100px;
  }
  
  .firstcol {
     grid-area: 1 / 1 / 6 / 2;
  }
  
  .lastcol {
     grid-area: 1 / 4 / 6 / 5;
  }
}

@media (min-width: 800px) {
  .container {
    grid-template-columns: 100px repeat(3, 1fr) 100px;
  }
  .firstcol { 
    grid-area: 1 / 1 / 4 / 2; 
  }
  .lastcol { 
    grid-area: 1 / 5 / 4 / 6; 
  } 
}

@media (min-width: 1200px) {
  .container {
    grid-template-columns: 100px repeat(4, 1fr) 100px;
  }
  .firstcol { 
    grid-area: 1 / 1 / 4 / 2; 
  }

  .lastcol { 
    grid-area: 1 / 6 / 4 / 7; 
  }
}
<div class="container">
  <div class="firstcol col">1</div>
  <div class="col">2</div>
  <div class="col">3</div>
  <div class="col">4</div>
  <div class="col">5</div>
  <div class="col">6</div>
  <div class="col">7</div>
  <div class="col">8</div>
  <div class="col">9</div>
  <div class="col">10</div>
  <div class="lastcol col">11</div>
</div>

【讨论】:

  • 问题是我事先不知道项目的数量......所以我不能使用'grid-area:1 / 4 / 6 / 5',因为我不知道最后一行......和 ​​-1 似乎不起作用。
【解决方案2】:

这不是你想要的,但可以以某种方式证明它......

请以全屏模式运行 sn-p。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        html,
        body {
            width: 100%;
            height: 100%;
        }

        #parent {
            display: grid;
            grid-template-columns: 100px auto 100px;
        }

        #firstcol {
            width: 100px;
            background-color: aquamarine;
        }

        #centercol {
            display: flex;
            background-color: bisque;
            flex-direction: column;
            flex-wrap: wrap;
            align-content: flex-start;
            animation-name: anim;
            animation-timing-function: linear;
            animation-duration: 10s;
            animation-iteration-count: infinite;
            animation-direction: alternate-reverse;
        }

        #lastcol {
            width: 100px;
            background-color: aquamarine;
        }

        .item {
            background-color: chocolate;
            display: inline;
            width: 100px;
            height: 100px;
        }

        @keyframes anim {
            from {
                height: 100px;
            }
            to {
                height: 800px;
            }
        }
    </style>

    <body>
        <div id="parent">
            <div id="firstcol">FIRST</div>
            <div id="centercol">
                <div class="item">1</div>
                <div class="item">2</div>
                <div class="item">3</div>
                <div class="item">4</div>
                <div class="item">5</div>
                <div class="item">6</div>
                <div class="item">7</div>
                <div class="item">8</div>
                <div class="item">9</div>
                <div class="item">10</div>
            </div>
            <div id="lastcol">LAST</div>
        </div>
    </body>
</html>

【讨论】:

    【解决方案3】:

    这就是我所采用的,对 MMD 关于弹性盒子的想法的 apols。

    关键是:

    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));

    minmax(150px, 1fr) 用最小尺寸的元素填充行,但让它们拉伸以填充行。

    .entry {
      display: grid;
      grid-template-columns: 100px auto 100px;
    }
    
    .stats {
      display: grid;
      grid-gap: 5px;
      grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
      background-color: #fff;
      color: #444;
    }
    
    .item {
      display: grid;
      grid-template-columns: 1fr 1fr;
      padding: 0;
      margin: 0;
      font-size: 0.8em;
      margin: 5px;
      border: 1px solid gray;
    }
    
    .firstcol {
      margin: 5px;
      border: 1px solid lightsalmon;
    }
    
    .lastcol {
      margin: 0 padding: 0;
      margin: 5px;
      border: 1px solid lightblue;
    }
    <div class="entry">
      <div class="firstcol">Row #1</div>
      <div class="stats">
        <div class="item">A</div>
        <div class="item">B</div>
        <div class="item">C</div>
        <div class="item">D</div>
        <div class="item">E</div>
        <div class="item">F</div>
        <div class="item">G</div>
        <div class="item">H</div>
        <div class="item">I</div>
      </div>
      <div class="lastcol">
        <button>Action</button>
      </div>
    </div>
    <div class="entry">
      <div class="firstcol">Row #2</div>
      <div class="stats">
        <div class="item">A</div>
        <div class="item">B</div>
        <div class="item">C</div>
        <div class="item">D</div>
        <div class="item">E</div>
        <div class="item">F</div>
        <div class="item">G</div>
        <div class="item">H</div>
        <div class="item">I</div>
      </div>
      <div class="lastcol">
        <button>Action</button>
      </div>
    </div>
    <div class="entry">
      <div class="firstcol">Row #3</div>
      <div class="stats">
        <div class="item">A</div>
        <div class="item">B</div>
        <div class="item">C</div>
        <div class="item">D</div>
        <div class="item">E</div>
        <div class="item">F</div>
        <div class="item">G</div>
        <div class="item">H</div>
        <div class="item">I</div>
      </div>
      <div class="lastcol">
        <button>Action</button>
      </div>
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 2022-12-13
      • 2020-02-27
      相关资源
      最近更新 更多