長さが不明なアイテムのリストがあります(CMSから)。縦に2列に並べて表示したい。例えば.
1 4 2 5 3 6 etc ...
私はCSSグリッドでこれを達成しようとしていますが、行数を前もって設定しない限り、それは可能ではないようです。私が試してみました grid-auto-flow: column
ごとに https://gridbyexample.com/examples/example18/ ですが、これは最後に到達したときに列を追加するだけです。
私はこのように感じていますグリッドで可能ですべきですが、方法が見つかりません。誰かアイデアはありますか?
追伸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;
}
<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>
コンテナとフレックスアイテムがあるフレックスを使用できます。コンテナの高さを制限し、フレックスのコンテンツをラップして次の列に続けることができます:-
<body>
<div class="container">
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
<p>1</p>
</div>
</body>
CSS:
.container {
height: 300px;
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
HTMLが生成された場合の1つの解決策は、Math.ceil( NUM_ITEMS / NUM_COLUMNS )
を使用してコンテナー要素のgrid-template-rows
プロパティを計算することです。
反応中:
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>
)
}
基本CSS:
.container {
display: grid;
grid-auto-flow: column;
grid-template-columns: repeat(2, 1fr);
}
例:
// 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);
}
})
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;
}
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>6</span>
<span>7</span>
<span>8</span>