【问题标题】:grid items should flow across rows, not columns网格项目应该跨行而不是列
【发布时间】:2017-11-10 19:14:42
【问题描述】:

我有一个包含 7 个动态大小的 div 的网格,由 2 个块包围,这些块应与 7 个动态 div 网格的第二行对齐。

我让它大部分工作,除了网格被定位为列并且我希望它是行。看小提琴,1-7应该越过顶部 https://jsfiddle.net/juzkxo20/5/

<div class='content'>
  <div class='left'></div>
  <div class='column-with-dynamic-content'>
    <div class='dynamic'>1</div>
    <div class='dynamic'></div>
    <div class='dynamic'></div>    
  </div>
  <div class='column-with-dynamic-content'>
    <div class='dynamic'>2</div>
    <div class='dynamic'></div>
  </div>
    <div class='column-with-dynamic-content'>
    <div class='dynamic'>3</div>
    <div class='dynamic'></div>
    <div class='dynamic'></div>    
  </div>
  <div class='column-with-dynamic-content'>
    <div class='dynamic'>4</div>
    <div class='dynamic'></div>
  </div>
    <div class='column-with-dynamic-content'>
    <div class='dynamic'>5</div>
    <div class='dynamic'></div>
    <div class='dynamic'></div>    
  </div>
  <div class='column-with-dynamic-content'>
    <div class='dynamic'>6</div>
    <div class='dynamic'></div>
  </div>
    <div class='column-with-dynamic-content'>
    <div class='dynamic'>7</div>
    <div class='dynamic'></div>
  </div>
  <div class='right'></div>
</div>

.content {
  display: grid;
  grid-template-columns: 1fr 7fr 1fr;
  grid-auto-rows: 50px;  
  grid-gap: 10px;
grid-auto-flow: column;
}

.column-with-dynamic-content {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  grid-auto-rows: 50px;
  grid-gap: 10px;
  grid-column: 2 / 3;
}

.left {
  grid-column-start: 1;
  grid-row: 2 / 3 ;
}

.right {
  grid-column-end: -1;
  grid-row: 2 / 3 ;
}

/* just demo styles */
.left, .right { border: 2px solid red; }
.dynamic { background-color: lightgray;  border: 1px solid gray; }

【问题讨论】:

    标签: html css css-grid


    【解决方案1】:

    这是解决您问题的一种方法,我刚刚学习 css 网格,但是我认为大部分都是正确的。

    您正在使用 .column-with-dynamic-content 创建一个包含 7 列的模板,但是,您在此容器内只有 3 个子 div,它正在寻找 7 个。您需要此类包含所有 7 个父 div包含动态div。我在下面创建了一个类来向您展示。

    .content {
      display: grid;
      grid-template-columns: 1fr 7fr 1fr;
      grid-auto-rows: 50px;
      grid-gap: 10px;
      grid-auto-flow: column;
    }
    
    .column-with-dynamic-content {
      display: grid;
      grid-auto-rows: 50px;
      grid-gap: 10px;
    }
    
    .seven-children-column {
      display: grid;
      grid-template-columns: repeat(7, 1fr);
      grid-auto-rows: 50px;
      grid-gap: 10px;
      grid-column: 2 / 3;
    }
    
    .left {
      grid-column-start: 1;
      grid-row: 2 / 3;
    }
    
    .right {
      grid-column-end: -1;
      grid-row: 2 / 3;
    }
    
    
    /* just demo styles */
    
    .left,
    .right {
      border: 2px solid red;
    }
    
    .dynamic {
      background-color: lightgray;
      border: 1px solid gray;
    }
    <div class='content'>
      <div class='left'></div>
      <div class='seven-children-column'>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>1</div>
          <div class='dynamic'></div>
          <div class='dynamic'></div>
        </div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>2</div>
          <div class='dynamic'></div>
        </div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>3</div>
          <div class='dynamic'></div>
          <div class='dynamic'></div>
        </div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>4</div>
          <div class='dynamic'></div>
        </div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>5</div>
          <div class='dynamic'></div>
          <div class='dynamic'></div>
        </div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>6</div>
          <div class='dynamic'></div>
        </div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>7</div>
          <div class='dynamic'></div>
        </div>
      </div>
      <div class='right'></div>
    </div>

    【讨论】:

      【解决方案2】:

      Grid 提供line-based placement,允许您定义网格项的大小和位置。

      .content, 
      .column-with-dynamic-content {
        display: grid;
        grid-auto-rows: 50px;  
        grid-gap: 10px;
      }
      
      .content > div:nth-child(1) { grid-column: 1 / 2;  grid-row: 2 / 3; }
      .content > div:nth-child(2) { grid-column: 2 / 3; }
      .content > div:nth-child(3) { grid-column: 3 / 4; }
      .content > div:nth-child(4) { grid-column: 4 / 5; }
      .content > div:nth-child(5) { grid-column: 5 / 6; }
      .content > div:nth-child(6) { grid-column: 6 / 7; }
      .content > div:nth-child(7) { grid-column: 7 / 8; }
      .content > div:nth-child(8) { grid-column: 8 / 9; }
      .content > div:nth-child(9) { grid-column: 9 / 10; grid-row: 2 / 3; }
      
      /* just demo styles */
      .left, .right { border: 2px solid red; }
      .dynamic { background-color: lightgray;  border: 1px solid gray; }
      <div class='content'>
        <div class='left'></div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>1</div>
          <div class='dynamic'></div>
          <div class='dynamic'></div>    
        </div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>2</div>
          <div class='dynamic'></div>
        </div>
          <div class='column-with-dynamic-content'>
          <div class='dynamic'>3</div>
          <div class='dynamic'></div>
          <div class='dynamic'></div>    
        </div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>4</div>
          <div class='dynamic'></div>
        </div>
          <div class='column-with-dynamic-content'>
          <div class='dynamic'>5</div>
          <div class='dynamic'></div>
          <div class='dynamic'></div>    
        </div>
        <div class='column-with-dynamic-content'>
          <div class='dynamic'>6</div>
          <div class='dynamic'></div>
        </div>
          <div class='column-with-dynamic-content'>
          <div class='dynamic'>7</div>
          <div class='dynamic'></div>
        </div>
        <div class='right'></div>
      </div>

      jsFiddle demo

      【讨论】:

      • 这很接近,但由于某种原因,.content div 仅与第二行(110px)一样高,因此看不到下面的任何内容。容器 div 仅扩展到第二行...有意义吗?
      • 是的,因为容器设置为内容高度。你想要视口高度吗? jsfiddle.net/juzkxo20/17
      • 我还以为它会长到动态div的高度
      • 我需要了解更多关于您要完成的工作的详细信息,以便进一步修改解决方案。但实际情况如下:主容器 (.content) 创建了两行。第一个自然行。第二个是通过在第二行放置边缘框来创建的。
      • 嵌套容器 (.column-with-dynamic-content) 仅存在于主容器的第一行和第二行。一旦嵌套容器有两个以上的项目,它就会溢出主容器。这就是这个答案的设置方式。再一次,有了更多关于您的总体目标的详细信息,也许可以使用不同的解决方案。
      猜你喜欢
      • 2019-10-03
      • 1970-01-01
      • 2017-12-09
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2018-10-17
      • 1970-01-01
      相关资源
      最近更新 更多