html - 如何让一排 div 相互重叠
问题描述
我正在尝试创建一组如下图所示的 div。我可以让他们都紧挨着,但我不能让小一个在另一个之上。除非我为他们制作一个父 div,否则我更愿意看看是否有更好的方法。
这是代码:小提琴
div.boxes{
width:450px;
height:100px;
border:1px solid #fff;
background:#000;
float:left;
}
div.boxes > div{
background:#bf00bd;
border:1px solid #999;
}
div.boxes > div.item1{
width:50px;
height:50px;
float:left;
}
div.boxes > div.item2{
width:100px;
height:20px;
float:left;
}
div.boxes > div.item3{
width:100px;
height:20px;
float:left;
}
div.boxes > div.item4{
width:50px;
height:50px;
float:right;
}
div.boxes > div.item5{
width:50px;
height:50px;
float:right;
}
div.boxes > div.item6{
width:50px;
height:50px;
float:right;
}
<div class="boxes">
<div class="item1"></div>
<div class="item2"></div>
<div class="item3"></div>
<div class="item4"></div>
<div class="item5"></div>
<div class="item6"></div>
</div>
解决方案
如果您打算使用绝对单位(如您的示例)构建元素尺寸,而不是使用相对单位(as%
或em
),并且如果您真的(真的)不想在.boxes
元素内定义另一个容器,并且如果您需要针对旧浏览器,您可以使用绝对定位。
请注意,不建议使用这种定位,因为它很难(或不可能)正确使用响应式网页设计风格。
相对定位的元素保留在文档的正常流程中。相反,绝对定位的元素被从流中取出;因此,其他元素的位置就好像它不存在一样。绝对定位的元素是相对于其最近的定位祖先(即,最近的非静态祖先)定位的。
使用这种技术,您将能够精确定位您想要固定项目的位置(相对于祖先而不是之前的兄弟)。因此,使用top / bottom
和left / right
属性来固定来自已定位祖先的元素。例如,top: 5px
将从第一个定位祖先顶部的 5px 处固定元素(带有absolute or relative
)。您可以使用像素、百分比或您需要的所有其他单位来设置这些属性。
所以,为了回答你的问题,我在下面写的这个例子是为了提供一种实现你的目标的方法,但我不建议使用它......你绝对应该创建另一个 div 来包装你的项目想要一个高于另一个。
:root {
--boxes-width: 450px;
--boxes-height: 100px;
--item-padding: 10px;
--item-width: 50px;
}
.boxes {
position: relative;
width: var(--boxes-width);
height: var(--boxes-height);
border:1px solid #fff;
background:#000;
float:left;
}
.item {
position: absolute;
background:#bf00bd;
border:1px solid #999;
top: var(--item-padding);
}
.item:first-child {
width:var(--item-width);
height:calc(var(--boxes-height) - var(--item-padding) * 2);
left: var(--item-padding);
}
.item:nth-child(2),
.item:nth-child(3) {
width: calc(var(--item-width) * 2);
height:calc((var(--boxes-height) - var(--item-padding) * 2) / 2 - (var(--item-padding) / 2));
left: calc(var(--item-width) + (var(--item-padding) * 2));
}
.item:nth-child(3) {
top: calc(var(--boxes-height) / 2 + (var(--item-padding) / 2));
}
.item:nth-child(n+4) {
position: relative;
float: right;
width: var(--item-width);
height: calc(var(--boxes-height) - var(--item-padding) * 2);
margin-right: var(--item-padding);
}
<div class="boxes">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
实际上,即使在很多情况下不推荐这种技术,它也可以满足您的需求。有时,绝对定位是最好的选择。这取决于您的目标、代码为您提供的灵活性以及您想要定位的浏览器。做事与否没有标准的方法,因为使用绝对定位本身并没有错。尽管如此,还是有一些最常见的用法可以使您的代码更易于维护,并且针对不同用法的可访问性进行了更优化。
在您的情况下,我认为您可以将想要的项目一个一个包装在另一个之上由 parent div
。实际上,div
已经创建了元素以提供将某些代码合并到特殊布局中的可能性。在其他包装器中使用 adiv
作为容器并不是一个坏习惯。div
但是您应该避免在不需要时使用无用的包装器,因为它会减慢渲染、DOM、CSSOM 关系并使您的代码更难阅读(以及其他问题)。你是唯一可以判断是否有必要的人。简而言之,使用一个或两个包装器绝对不是一个坏习惯。
因此,根据您的目标浏览器,实现它的好方法可能是:
我更新了我的答案,为您提供更多提示,以便您了解您的选择。当您在示例中使用浮动系统时,我编写了一个也使用它的代码,该代码与许多(和旧)浏览器兼容。
以下代码可以根据您的需要进行优化,我在您编写代码时重用了您的代码。另外,我自愿使用float
系统而不是grid
系统flexbox
,以便尽可能针对大多数浏览器。请记住,网格系统是另一种(非常)好的和现代的减少代码的方法,但它目前不适用于每个浏览器。正如在另一个答案中编码的那样,grid
布局很强大,您应该考虑一下。特别是因为所有现代浏览器都可以使用它。
.boxes{
position: relative;
width: 100%;
max-width: 450px;
height: 100px;
border:1px solid #fff;
background:#000;
float:left;
padding: 10px;
box-sizing: border-box;
}
.box {
height: 100%;
}
.box--left{ float: left }
.box--left > .item { float: left; }
.box--right{ float: right }
.box--right .item:last-child { margin-right: 0; }
.box-vert {
width: 100px;
float: left;
}
.box-vert .item {
height: calc(50% - 5px);
width: 100%;
}
.item{
background:#bf00bd;
border:1px solid #999;
width: 50px;
height: 100%;
margin-right: 10px;
display: inline-block;
}
<div class="boxes">
<div class="box box--left">
<div class="item"></div>
<div class="box box-vert">
<div class="item"></div>
<div class="item"></div>
</div>
</div>
<div class="box box--right">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</div>
推荐阅读
- javascript - 为什么可以在不提供数据 arg 的情况下引用此函数?
- r - 如何从 R 中的 SAR 光学堆栈中提取反射率值
- php - 电报机器人键盘 PHP
- python - 着色背景 TKinter 框架
- java - 平面图嵌套集合
- db2 - 我正在使用 IBM DB2 并在加载本地主机时显示“无法连接到本地主机”,并且在事件查看器中出现此错误
- node.js - 带有 Mongoose 的 NodeJS - 实用地将 url 添加到使用 find() 检索到的图像中
- macos - 如何跨进程同步 MTLTexture 和 IOSurface?
- ios - 导航栏 + 搜索控制器 + 大标题:滚动时的细线
- c++ - 如何降低以下代码块的时间复杂度?