这是this question的发展,有一个关键的区别:要分布在两列中的元素的高度不相等。请不要将其视为重复项。
我要实现的目标:
鉴于未知数量的高度大致相似但高度不相同的元素,应实现以下条件:
在桌面布局上:
元素需要按以下方式分为两列:
1 2
3 4
5 6
等
top元素应与容器的顶部边框偏移,其距离应大于左列中的顶部元素,后者应产生如下内容:
在移动布局上:
问题:
display: inline-block
来解决此问题,浏览器将尝试将每对放在单独的行上;并且它们高度上的每个差异都会导致同一列的元素之间的间距不相等。示例:
function fillGrid() {
const container = document.querySelector('.container');
const times = [...new Array(10)];
times.forEach((garbage, index) => {
const element = document.createElement('div');
element.innerText = index + 1
element.classList.add('grid-element');
container.appendChild(element);
});
}
fillGrid()
* {
box-sizing: border-box;
}
.container {
width: 60%;
margin: auto;
background: papayawhip;
padding-bottom: 60px;
}
@media screen and (max-width: 600px) {
.container {
display: block;
}
.grid-element {
width: 100%;
}
}
.grid-element {
display: inline-block;
width: 48%;
height: 100px;
background: green;
vertical-align: middle;
margin-bottom: 20px;
}
.grid-element:nth-child(2) {
margin-top: 60px;
}
.grid-element:nth-child(odd) {
margin-right: 10px;
}
.grid-element:nth-child(even) {
grid-column: 2/3;
}
/* Just to add some disorder to grid element heights */
.grid-element:nth-child(6) {
height: 150px;
}
.grid-element:nth-child(7) {
height: 200px;
}
<div class="container"></div>
function fillGrid() {
const container = document.querySelector('.container');
const times = [...new Array(10)];
times.forEach((garbage, index) => {
const element = document.createElement('div');
element.innerText = index + 1
element.classList.add('grid-element');
container.appendChild(element);
});
}
fillGrid()
.container {
display: grid;
grid-template-column: 1fr 1fr;
width: 60%;
margin: auto;
background: papayawhip;
padding-bottom: 60px;
}
@media screen and (max-width: 600px) {
.container {
display: block;
}
.grid-element {
width: 100%;
}
.grid-element:nth-child(2) {
margin-top: 0;
}
}
.grid-element {
width: 90%;
height: 100px;
background: green;
margin-bottom: 20px;
font-size: 30px;
font-weight: bold;
}
.grid-element:nth-child(2) {
margin-top: 60px;
}
.grid-element:nth-child(odd) {
grid-column: 1/2;
}
.grid-element:nth-child(even) {
grid-column: 2/3;
}
/* Just to add some disorder to grid element heights */
.grid-element:nth-child(3) {
height: 150px;
}
.grid-element:nth-child(6) {
height: 150px;
}
.grid-element:nth-child(7) {
height: 150px;
}
<div class="container"></div>
当然可以通过将元素放入两个单独的容器中,然后将这两个容器相对放置来简单地解决此问题。这种方法的缺点在于,在移动布局中,这些容器将堆叠在一起,并且元素的顺序将发生变化(例如,1 2 3 4 5 6
会变成1 3 5 2 4 6
。当然,我可以在同一页面上绘制两个布局,并根据是桌面还是移动屏幕来隐藏其中的一个,但是我宁愿不这样做。
是否存在基于CSS的干净解决方案?
答案 0 :(得分:2)
我不认为仅使用CSS可以很好地解决此问题。您最好使用经过测试的Masonry之类的JavaScript库,以使其正常工作。它将处理您很好提到的响应式案例,因为所有项目都将放在一个容器中。
这里是一个演示,其布局与您描述的演示类似:https://tympanus.net/Development/GridLoadingEffects/index.html