javascript - 在不同的 div 之间对齐内部 div 项
问题描述
我想对齐属于一起但位于不同 div 容器中的项目。我不确定这是否可能,但我的问题是我无法更改我拥有的 html 模板的结构。
我目前的状态是这张图片的顶部。我想要达到的结果是底部。没有边框的左侧项目是我的行标题。我想对齐属于一起的项目,以便每个主要项目(G1,G2)都有一行,正如您在底部添加 CSS 中的边距所看到的那样。所以结果应该是两条泳道。我的问题是单元格中的项目数量是动态加载的,并且可以随时间变化。
主要问题是我不能对 html 模板进行太多更改,因此我必须使用单元结构。这可能与动态数量的项目相关吗?
我在 Angular 应用程序中使用它。所以应该可以使用任何Javascript。
我已经创建了这个 codepen 作为示例。 Codepen 示例或Angular Stackblitz
html
<div class="outer">
<div class="groups">
<div class="groupItem">> G1</div>
<div class="groupItem">> G2</div>
</div>
<div class="container">
<div class="cell">
<div class="group1">G1</div>
<div class="group1">G1</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group1">G1</div>
<div class="group1">G2</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group2">G2</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group2">G2</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group2">G2</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group2">G2</div>
</div>
<div class="cell">
<div class="group2">G2</div>
</div>
</div>
CSS
.outer {
display: flex;
}
.groups {
padding-top: 20px;
margin-right: 1px;
}
.container {
display: flex;
}
.cell {
padding: 20px;
border: 1px solid #000;
}
解决方案
这是一个解决方案。要点基本上是找到任何单元格可能具有的最大 group1 元素数。然后根据最大值减去每个单元格中 group1 元素的数量来调整第一个 group2 元素的填充顶部。请参阅下面的代码片段。
const cells = document.getElementsByClassName("cell")
// Find the max number of group1 elements
let maxGroup1 = 0
for (let cell of cells) {
const group1 = cell.getElementsByClassName("group1")
maxGroup1 = Math.max(maxGroup1, group1.length)
}
// For each cell, adjust group2 padding top accordingly
for (let cell of cells) {
const group1Length = cell.getElementsByClassName("group1").length
const group2PaddingTop = (maxGroup1 - group1Length) * 20
const group2 = cell.getElementsByClassName("group2")
if (group2.length > 0) {
group2[0].style.paddingTop = group2PaddingTop + "px"
}
}
// Adjust the groups label
const labels = document.getElementsByClassName("groupItem")
const groupLabelPaddingTop = (maxGroup1 - 1) * 20
labels[1].style.paddingTop = groupLabelPaddingTop + "px"
.outer {
display: flex;
}
.groups {
padding-top: 20px;
margin-right: 1px;
}
.container {
display: flex;
}
.cell {
padding: 20px;
border: 1px solid #000;
}
.cell div, .groups div {
height: 20px;
}
<div class="outer">
<div class="groups">
<div class="groupItem">> G1</div>
<div class="groupItem">> G2</div>
</div>
<div class="container">
<div class="cell">
<div class="group1">G1</div>
<div class="group1">G1</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group1">G1</div>
<div class="group2">G2</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group2">G2</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group2">G2</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group2">G2</div>
</div>
<div class="cell">
<div class="group1">G1</div>
<div class="group2">G2</div>
</div>
<div class="cell">
<div class="group2">G2</div>
</div>
</div>
推荐阅读
- sql-server - 报表生成器 - 截至第二个日期参数的字段数据不是第一个
- python - 如何从python中的.b64文件转换base64?
- reactjs - 如何重载材料切换组件css
- java - 使用 Socket 时服务器返回的不明符号
- regex - 正则表达式语法仅匹配第一段
- flutter - BlocBuilder 没有更新状态变化
- javascript - 无法在 Node JS 中设置 Cookie - React
- angular - Angular 8 Jasmine 间谍和不同类型的 returnValue
- javafx - RichTextFX,部分文档内容只读
- python - 一次更改所有子图的线型