我有一个未知长度的项目列表(来自CMS).我想在2个垂直列中向下显示它们.例如
1 4 2 5 3 6 etc...
我试图用CSS网格实现这一点,但是,除非你预先设置行数,否则它似乎不可能.我已经grid-auto-flow: column按照https://gridbyexample.com/examples/example18/进行了尝试,但这只会在结束时添加其他列.
我觉得这应该可以用网格,但我找不到办法.有人有主意吗?
PS 请不要建议CSS文本列.
如果不知道确切的项目数量,单独使用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)
例子:
// 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)
小智 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)