具有无限行的CSS网格垂直列

mat*_*eta 7 css css3 css-grid

我有一个未知长度的项目列表(来自CMS).我想在2个垂直列中向下显示它们.例如

1 4
2 5
3 6

etc...

我试图用CSS网格实现这一点,但是,除非你预先设置行数,否则它似乎不可能.我已经grid-auto-flow: column按照https://gridbyexample.com/examples/example18/进行了尝试,但这只会在结束时添加其他列.

我觉得这应该可以用网格,但我找不到办法.有人有主意吗?

PS 不要建议CSS文本列.

chr*_*ona 8

如果不知道确切的项目数量,单独使用CSS网格是不可能的.

解决此限制的唯一方法是在项目的后半部分添加一个类.

body {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-flow: row dense;
  
  /* extra styles */
  grid-gap: 0.5rem;
}

span {
  grid-column-start: 1;
  
  /* extra styles */
  background-color: #def;
  padding: 0.5rem;
}

.second-half {
  grid-column-start: 2;
  
  /* extra styles */
  background-color: #abc;
}
Run Code Online (Sandbox Code Playgroud)
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span class="second-half">5</span>
<span class="second-half">6</span>
<span class="second-half">7</span>
Run Code Online (Sandbox Code Playgroud)


Geo*_*sis 6

例子:

// This is just to simulate infinite scrolling

var counter = 9;
document.addEventListener('scroll', function(e) {
  if (document.body.scrollTop > 50 || document.documentElement.scrollTop > 50) {
    var span = document.createElement('span');
    span.innerHTML = ++counter;
    document.body.appendChild(span);
  }
})
Run Code Online (Sandbox Code Playgroud)
body {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-auto-rows: 200px;
  /* how much height must each element occupy! change that! */
  grid-gap: 0.5rem;
}

span {
  background: #3A3A3A;
  text-align: center;
  color: #FFFFFF;
  line-height: 200px;
  font-size: xx-large;
}
Run Code Online (Sandbox Code Playgroud)
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>6</span>
<span>7</span>
<span>8</span>
Run Code Online (Sandbox Code Playgroud)

  • OP要求垂直流动,而不是水平流动。 (2认同)

小智 5

一种解决方案是,如果生成了 HTML,您可以grid-template-rows使用以下命令计算容器元素的属性Math.ceil( NUM_ITEMS / NUM_COLUMNS )

在反应中:

function VerticalColumns(props) {
    // props.numColumns matches `grid-template-columns` on `.container` element
    const numRows = Math.ceil(props.items.length / props.numColumns);

    const style = {
        gridTemplateRows: `repeat(${numRows}, 1fr)`,
    };

    return (
        <ul className='container' style={ style }>
            { props.items.map((item, index) => (
                <li key={index}>{ item }</li>
            )) }
        </ul>
    )
}
Run Code Online (Sandbox Code Playgroud)

基础CSS:

.container {
    display: grid;
    grid-auto-flow: column;
    grid-template-columns: repeat(2, 1fr);
}
Run Code Online (Sandbox Code Playgroud)