网格项目扩展以跟随列之间的偏移
Grid items expand to follow offset between columns
我正在尝试制作一个 html/css 卡片系统,它会自动将自己放置在 css 网格上。此 css 网格被 div 分为两列。在左列中,一个 div 为该列的其余部分添加一个偏移量,并且没有固定大小。我想在两列之间保留此偏移量。
问题是左边的第一张卡片(2 号)增长以补偿偏移量,但所有卡片的大小必须相同。如何在不固定每张卡片的大小的情况下解决这个问题?
我想做的事情:
我目前拥有的:
一个简单的代码重现示例:
.grid {
display: grid;
background-color: #eee;
grid-gap: 5px 5px;
grid-template-columns: repeat(2, 1fr);
grid-auto-flow: dense;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 60px;
font-size: 150%;
}
.grid__1 {
background-color: #ccc;
grid-column: 1 / 2;
padding: 5px;
font-size: 1rem;
}
.grid__item {
grid-column: span 1;
grid-row: span 2;
}
<div class="grid">
<div class="box grid__1">head</div>
<div class="box grid__item">1</div>
<div class="box grid__item">2</div>
<div class="box grid__item">3</div>
<div class="box grid__item">4</div>
<div class="box grid__item">5</div>
<div class="box grid__item">6</div>
</div>
我在这里做了一个活生生的例子:https://jsfiddle.net/rLpqt75d/3/
为 属性 grid-auto-rows 定义一对行,这将设置正确的大小:
.grid {
display: grid;
background-color: #eee;
grid-gap: 5px 5px;
grid-template-columns: repeat(2, 1fr);
grid-auto-flow: dense;
grid-auto-rows: 40px 200px; /* added */
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 60px;
font-size: 150%;
}
.grid__1 {
background-color: #ccc;
grid-column: 1 / 2;
padding: 5px;
font-size: 1rem;
}
.grid__item {
grid-column: span 1;
grid-row: span 2;
}
<div class="grid">
<div class="box grid__1">head</div>
<div class="box grid__item">1</div>
<div class="box grid__item">2</div>
<div class="box grid__item">3</div>
<div class="box grid__item">4</div>
<div class="box grid__item">5</div>
<div class="box grid__item">6</div>
</div>
/* height is your var */
.grid {
display: grid;
background-color: #eee;
grid-gap: 5px 5px;
grid-template-columns: repeat(2, 1fr);
grid-auto-rows: 40px 1fr;
height: 100vh;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 60px;
font-size: 150%;
}
.grid__head {
background-color: #ccc;
grid-column: 1 / 2;
padding: 15px;
font-size: 1rem;
}
.grid__item {
grid-column: span 1;
grid-row: span 2;
}
<div class="grid">
<div class="box grid__head">head</div>
<div class="box grid__item">1</div>
<div class="box grid__item">2</div>
<div class="box grid__item">3</div>
<div class="box grid__item">4</div>
<div class="box grid__item">5</div>
<div class="box grid__item">6</div>
</div>
在 .grid__item
上从 grid-row: span 2
切换到 span 3
(或 4)。
.grid {
display: grid;
background-color: #eee;
grid-gap: 5px 5px;
grid-template-columns: repeat(2, 1fr);
grid-auto-flow: dense;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 60px;
font-size: 150%;
}
.grid__1 {
background-color: #ccc;
grid-column: 1 / 2;
padding: 5px;
font-size: 1rem;
}
.grid__item {
grid-column: span 1;
grid-row: span 3; /* ADJUSTMENT */
}
<div class="grid">
<div class="box grid__1">head</div>
<div class="box grid__item">1</div>
<div class="box grid__item">2</div>
<div class="box grid__item">3</div>
<div class="box grid__item">4</div>
<div class="box grid__item">5</div>
<div class="box grid__item">6</div>
</div>
The problem is that the first card on the left (number 2) grows to compensate for the offset, but all cards must have the same size.
如果您将项目从两行 (grid-row: span 2
) 切换为三行 (grid-row: span 3
) 或四行,项目可以更好地吸收偏移高度。
2 行(原始布局)——注意行的布局方式
3 行(修改后的布局)
这也可能是替代方案:CSS-only masonry layout
我做了一些研究,看起来您正在尝试复制 mansonry-layout。
如果你不知道它是什么,它就是 pintarest 使用的布局。
经过一段时间的谷歌搜索后,我发现了一篇您可以查看的好文章:
https://kulturbanause.de/blog/responsive-masonry-layout-mit-css/
我将尝试总结:
以后我们会得到一个css属性:grid-template-rows: masonry;
但在那之前我们将不得不坚持使用 flex-box。
我将博客 post 的示例复制到 fiddle 并对其进行了一些修改,以便更好地了解:
https://jsfiddle.net/8k1nyg39/41/
希望我能帮到别人(:
编辑:
所以我对它进行了一些试验,看起来你的容器需要一个预定的高度......
如果您需要容器动态改变高度,我所知道的唯一剩余解决方法是像 Magic Grid ...
这样的 js 库
我正在尝试制作一个 html/css 卡片系统,它会自动将自己放置在 css 网格上。此 css 网格被 div 分为两列。在左列中,一个 div 为该列的其余部分添加一个偏移量,并且没有固定大小。我想在两列之间保留此偏移量。
问题是左边的第一张卡片(2 号)增长以补偿偏移量,但所有卡片的大小必须相同。如何在不固定每张卡片的大小的情况下解决这个问题?
我想做的事情:
我目前拥有的:
一个简单的代码重现示例:
.grid {
display: grid;
background-color: #eee;
grid-gap: 5px 5px;
grid-template-columns: repeat(2, 1fr);
grid-auto-flow: dense;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 60px;
font-size: 150%;
}
.grid__1 {
background-color: #ccc;
grid-column: 1 / 2;
padding: 5px;
font-size: 1rem;
}
.grid__item {
grid-column: span 1;
grid-row: span 2;
}
<div class="grid">
<div class="box grid__1">head</div>
<div class="box grid__item">1</div>
<div class="box grid__item">2</div>
<div class="box grid__item">3</div>
<div class="box grid__item">4</div>
<div class="box grid__item">5</div>
<div class="box grid__item">6</div>
</div>
我在这里做了一个活生生的例子:https://jsfiddle.net/rLpqt75d/3/
为 属性 grid-auto-rows 定义一对行,这将设置正确的大小:
.grid {
display: grid;
background-color: #eee;
grid-gap: 5px 5px;
grid-template-columns: repeat(2, 1fr);
grid-auto-flow: dense;
grid-auto-rows: 40px 200px; /* added */
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 60px;
font-size: 150%;
}
.grid__1 {
background-color: #ccc;
grid-column: 1 / 2;
padding: 5px;
font-size: 1rem;
}
.grid__item {
grid-column: span 1;
grid-row: span 2;
}
<div class="grid">
<div class="box grid__1">head</div>
<div class="box grid__item">1</div>
<div class="box grid__item">2</div>
<div class="box grid__item">3</div>
<div class="box grid__item">4</div>
<div class="box grid__item">5</div>
<div class="box grid__item">6</div>
</div>
/* height is your var */
.grid {
display: grid;
background-color: #eee;
grid-gap: 5px 5px;
grid-template-columns: repeat(2, 1fr);
grid-auto-rows: 40px 1fr;
height: 100vh;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 60px;
font-size: 150%;
}
.grid__head {
background-color: #ccc;
grid-column: 1 / 2;
padding: 15px;
font-size: 1rem;
}
.grid__item {
grid-column: span 1;
grid-row: span 2;
}
<div class="grid">
<div class="box grid__head">head</div>
<div class="box grid__item">1</div>
<div class="box grid__item">2</div>
<div class="box grid__item">3</div>
<div class="box grid__item">4</div>
<div class="box grid__item">5</div>
<div class="box grid__item">6</div>
</div>
在 .grid__item
上从 grid-row: span 2
切换到 span 3
(或 4)。
.grid {
display: grid;
background-color: #eee;
grid-gap: 5px 5px;
grid-template-columns: repeat(2, 1fr);
grid-auto-flow: dense;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 60px;
font-size: 150%;
}
.grid__1 {
background-color: #ccc;
grid-column: 1 / 2;
padding: 5px;
font-size: 1rem;
}
.grid__item {
grid-column: span 1;
grid-row: span 3; /* ADJUSTMENT */
}
<div class="grid">
<div class="box grid__1">head</div>
<div class="box grid__item">1</div>
<div class="box grid__item">2</div>
<div class="box grid__item">3</div>
<div class="box grid__item">4</div>
<div class="box grid__item">5</div>
<div class="box grid__item">6</div>
</div>
The problem is that the first card on the left (number 2) grows to compensate for the offset, but all cards must have the same size.
如果您将项目从两行 (grid-row: span 2
) 切换为三行 (grid-row: span 3
) 或四行,项目可以更好地吸收偏移高度。
2 行(原始布局)——注意行的布局方式
3 行(修改后的布局)
这也可能是替代方案:CSS-only masonry layout
我做了一些研究,看起来您正在尝试复制 mansonry-layout。
如果你不知道它是什么,它就是 pintarest 使用的布局。
经过一段时间的谷歌搜索后,我发现了一篇您可以查看的好文章:
https://kulturbanause.de/blog/responsive-masonry-layout-mit-css/
我将尝试总结:
以后我们会得到一个css属性:grid-template-rows: masonry;
但在那之前我们将不得不坚持使用 flex-box。
我将博客 post 的示例复制到 fiddle 并对其进行了一些修改,以便更好地了解:
https://jsfiddle.net/8k1nyg39/41/
希望我能帮到别人(:
编辑: 所以我对它进行了一些试验,看起来你的容器需要一个预定的高度......
如果您需要容器动态改变高度,我所知道的唯一剩余解决方法是像 Magic Grid ...
这样的 js 库