我有一个响应式网格,其中每个项目都有自己的详细信息部分,默认情况下是隐藏的。单击项目会在详细信息部分添加一个类以显示它。
HTML/CSS看起来像这样:
<div class="grid">
<div class="item">Item 1</div>
<div class="details">Item 1 Details</div>
<!-- ... -->
<div class="item">Item n</div>
<div class="details">Item n Details</div>
</div>
.grid {
display: grid;
grid-auto-flow: dense;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
}
.item {
/* nothing relevant */
}
.details {
grid-column: 1 / -1;
max-height: 0;
padding: 0;
opacity: 0;
overflow: hidden;
}
.details.selected {
max-height: unset;
padding: 1rem 2rem;
opacity: 1;
}
详细信息跨越整行,密集的自动流允许其他项目填充空白。
这个效果很好,有足够的物品看起来很棒。
然而,让我们假设宽度为1000px
,这意味着5个项目可以彼此相邻。如果只有1个或2个项目,则它们右侧的空白空间太多。我想将这些项目居中,但使用当前的CSS,网格填充了空单元格。这似乎是由grid-column: 1/ -1
引起的。
这是它目前的样子,只有两个项目:
这是我希望它看起来的样子:
在这两种情况下,如果有5个以上的项目,它看起来会像这样,这很好。我也可以将底行居中,以防有灵活的解决方案。
我怎样才能实现这种行为呢?它不需要是网格。也可以是flex,或者任何其他解决方案,如果dense
行为可以用它来实现的话。
有点相关的问题,不是我现在的重点,但很高兴有:
我想在细节中添加一个渐变效果,这就是为什么它使用padding
,max-height
和opacity
而不是仅仅将其设置为display: none
。如果选择了一个项目,而我选择了同一行中的另一个项目,则在过渡期间会显示两个细节容器,这会导致网格布局出现奇怪的变化。
JS解决方案就可以了。它不需要是纯CSS。
2条答案
按热度按时间7kqas0il1#
我不太明白你的目的...
这个片段给你提供了最少的布局,让我知道,如果这不是一个好的…
7z5jn7bk2#
我怎样才能实现这种行为呢?它不需要是网格,也可以是Flex,或者其他任何解决方案
一行上有两个项目的图像类似于具有以下属性设置的弹性框布局:
根据浏览器视口的宽度,当两个元素单独 Package 到一行时,布局将类似于您希望在布局中实现的效果:
x一个一个一个一个x一个一个二个x
要获得可展开/可折叠的
.details
元素,请将每个.item
元素 Package 在 Package 器中,并在该 Package 器中包含.details
元素。.details
元素的position
被设置为absolute
。它的位置将相对于网格元素而不是其父元素.item-wrapper
,以便在网格的宽度上拉伸.details
。下面引用的
.max-height
技术(或.details
高度的手动设置)可用于展开/折叠.details
元素。我想为细节添加一个渐变效果,这就是为什么它使用填充,最大高度和不透明度,而不仅仅是设置它来显示:none。如果选中一个项目,而我在同一行中选择了另一个项目,则在过渡期间会显示两个细节容器,这会导致网格布局出现奇怪的变化。JS解决方案也可以。它不需要是纯CSS。
我已经使用基于堆栈溢出post的
max-height
来展开/折叠我的项目。它作为一个纯CSS的解决方案工作得很好。正如你所说的,它在一个响应式网格布局中工作得不好,导致“奇怪的变化”。为了获得更平滑的展开/折叠过渡,下面的代码片段 * 手动 * 计算
.details
元素中内容的height
,当内容高度不相同时。max-height
仅限CSS的解决方案适用于.details
内容,该内容与CSS样式规则中设置的值相同。这个代码片段使用了
.scrollHeight
,但是和其他返回元素维度的属性一样,它将使用force layout/reflow。CSS animation“让浏览器优化性能和效率”,而不是代码片段中使用的多个CSS转换。
该解决方案依赖于CSS变量来共享JavaScript和CSS样式规则之间的值--这些值会影响内容高度。