问题描述
在下面的代码片段中,我试图让第三个 div 元素(绿色的)占据它上面的可用空间。我正在寻找最抽象的解决方案。我的意思是我不是在寻找一个只有三个内部 div 和两列场景的解决方案。更重要的是,我不想使用引导程序或任何其他插件。
.outer {
background-color: yellow;
width: 500px;
height: 500px;
}
.inner-1 {
float: left;
background-color: red;
align-self: start;
}
.inner-2 {
float:left;
background-color: lightblue;
align-self:start;
}
.inner-3 {
float:left;
background-color:green;
align-self:start;
}
.p-1 {
width:200px;
height:200px;
}
.p-2 {
width:200px;
height:250px;
}
.p-3 {
width:200px;
height:200px;
}
.inner-1::after{
content: " ";
visibility: hidden;
display: block;
height: 0;
clear: both;
}
.inner-2::after{
content: " ";
visibility: hidden;
display: block;
height: 0;
clear: both;
}
.inner-3::after{
content: " ";
visibility: hidden;
display: block;
height: 0;
clear: both;
}
<div class="outer">
<div class="inner-1">
<div class="p-1">one</div>
</div>
<div class="inner-2">
<div class="p-2">two</div>
</div>
<div class="inner-3">
<div class="p-3">three</div>
</div>
</div>
解决方法
这通常称为砌体布局。对于一般情况,目前没有完美的方法可以使用纯 CSS 来做到这一点。尽管有多种技术可以针对特定场景实现这一点。
例如,如果您不希望块顺序严格,则可以使用垂直列。
.outer {
background-color: yellow;
width: 500px;
height: 500px;
display: flex;
flex-wrap: wrap;
flex-direction: column;
align-content: flex-start;
}
.inner-1 {
float: left;
background-color: red;
align-self: start;
}
.inner-2 {
float:left;
background-color: lightblue;
align-self:start;
}
.inner-3 {
float:left;
background-color:green;
align-self:start;
}
.p-1 {
width:200px;
height:200px;
}
.p-2 {
width:200px;
height:250px;
}
.p-3 {
width:200px;
height:220px;
}
.inner-1::after{
content: " ";
visibility: hidden;
display: block;
height: 0;
clear: both;
}
.inner-2::after{
content: " ";
visibility: hidden;
display: block;
height: 0;
clear: both;
}
.inner-3::after{
content: " ";
visibility: hidden;
display: block;
height: 0;
clear: both;
}
<div class="outer">
<div class="inner-1">
<div class="p-1">one</div>
</div>
<div class="inner-2">
<div class="p-2">two</div>
</div>
<div class="inner-3">
<div class="p-3">three</div>
</div>
</div>
CSS-tricks 上有一篇关于这个主题的好文章:https://css-tricks.com/piecing-together-approaches-for-a-css-masonry-layout/
,你总是可以很好地使用 Flexbox 我创建了一个例子给你看看。
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.outer {
width: 100%;
height: 200px; /* You can change it later */
display: flex;
padding: 1.25rem; /* just to show background-color "yellow" */
background-color: yellow;
}
.inner {
width: 100%;
height: 100%:
}
#inner__one {
background-color: red;
}
#inner__two {
background-color: green;
}
#inner__three {
background-color: lightblue;
}
<div class="outer">
<!-- You can sepeare them by giving it ID -->
<div class="inner" id="inner__one"></div>
<div class="inner" id="inner__two"></div>
<div class="inner" id="inner__three"></div>
</div>