解决方案
我知道解决这个问题的方法可能是使用弹性盒......
那是对的。将项目的父级设置为弹性容器可以解决问题:
.grid {
display: flex; /* new */
flex-wrap: wrap; /* new */
margin-top: 100px;
font-size: 0;
border: 1px solid red;
}
修改后的小提琴 https://jsfiddle.net/67w721zq/2/
这里可能很关键的是每个项目都有 3 个子项目。我用position: absolute
其中两个,另一个保持默认位置。如果我使用position: absolute
对于所有的孩子来说,这个问题都已经解决了。
另外,正确。通过从文档的正常流程中删除第三个 div,问题就得到了解决。
解释
在涉及任何脚本和删除项目之前,网格中的每个项目都是人为定位的。
换句话说,在初始状态下,项目的内容(三个子 div)将每个项目移动到原本不会出现的位置。但是当脚本删除这些子 div 时,每个项目都会移动到它应该在的位置。
正如您所怀疑的,问题出在每个网格项的第三个子 div (.description
).
如果您只是申请visibility: hidden
到网格项 –不删除子 div– 布局不会被破坏。
但对于你的脚本,你不仅仅是添加visibility: hidden
,您还要删除子 div。
前两个 div (.cover
and .img-wrapper
)永远不会造成问题。它们是绝对定位的,因此它们已经从正常流程中移除。
然而,第三个 div (.description
) 是一个流入子代。
这个div包含两个p
儿童(“该项目 X 的说明”和“更多信息”)。当这些孩子中的任何一个被移除时,那就是布局中断的时候.
这是因为——出于我尚未确定的原因——这个 div 正在抑制vertical-align: baseline
在父级上,这是一个内联级元素,因此,明白了vertical-align默认设置 https://www.w3.org/TR/CSS22/visudet.html#line-height.
当脚本删除 div 时,基线对齐方式将恢复到父级,将其向上移动,从而创建间隙。
EDIT:
As @Kukkuz 提到了一个答案 https://stackoverflow.com/a/39794921/3597276,使用除baseline
for vertical-align
也解决了问题。