因为我是uniapp写的移动端项目,可能会多个地方用。所以需要兼容,我网上没看到什么好用的表格能完成我们的需求,就自己手写了一个。是用view布局,然后加点边框之类的来模拟的。这样h5,小程序,app什么的都能用。但是问题就是这种的写法,合并单元格这个功能如何实现呢,没有思路。有没有写过这种的,讲解一下,或者提供一下解决思路呢。
该回答引用ChatGPT
合并单元格通常在表格的数据量很大时用于提高可读性和美观性,但是用 view 布局手写表格时,合并单元格需要额外的处理。以下是两种常见的实现方式:
1、使用 CSS Grid 布局
CSS Grid 布局是一个二维布局系统,可以用来创建复杂的网格布局。你可以使用 grid-template-areas 属性来指定每个单元格的位置,然后使用 grid-row-start、grid-row-end、grid-column-start 和 grid-column-end 属性来合并单元格。具体实现可以参考以下示例:
<div class="table">
<div class="row">
<div class="cell" style="grid-area: 1 / 1 / 2 / 2;">A1</div>
<div class="cell" style="grid-area: 1 / 2 / 2 / 3;">B1</div>
<div class="cell" style="grid-area: 1 / 3 / 3 / 4;">C1</div>
</div>
<div class="row">
<div class="cell" style="grid-area: 2 / 1 / 3 / 2;">A2</div>
<div class="cell" style="grid-area: 2 / 2 / 3 / 3;">B2</div>
<div class="cell" style="grid-area: 2 / 3 / 3 / 4;">C2</div>
</div>
</div>
<style>
.table {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
}
.row {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.cell {
border: 1px solid black;
padding: 5px;
}
</style>
使用 JavaScript 实现合并单元格的关键是要找到需要合并的单元格,并修改它们的行列跨度(rowspan 和 colspan)。可以通过遍历表格中的单元格,根据单元格的位置和内容来确定需要合并的单元格。
以下是一个基本的示例:
<div class="table">
<div class="row">
<div class="cell">A1</div>
<div class="cell">B1</div>
<div class="cell">C1</div>
</div>
<div class="row">
<div class="cell">A2</div>
<div class="cell">B2</div>
<div class="cell">C2</div>
</div>
<div class="row">
<div class="cell">A3</div>
<div class="cell">B3</div>
<div class="cell">C3</div>
</div>
</div>
<script>
const table = document.querySelector('.table');
const cells = table.querySelectorAll('.cell');
const rows = table.querySelectorAll('.row');
// 遍历每一行
for (let i = 0; i < rows.length; i++) {
const row = rows[i];
const cellsInRow = row.querySelectorAll('.cell');
// 遍历每一列
for (let j = 0; j < cellsInRow.length; j++) {
const cell = cellsInRow[j];
// 判断单元格是否需要合并
if (cell.innerHTML === 'B1' || cell.innerHTML === 'B2') {
cell.setAttribute('rowspan', '2');
cell.classList.add('merge');
}
if (cell.innerHTML === 'B3') {
cell.setAttribute('colspan', '2');
cell.classList.add('merge');
}
}
}
</script>
<style>
.table {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
}
.row {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.cell {
border: 1px solid black;
padding: 5px;
}
.merge {
position: relative;
}
.merge:before {
content: "";
position: absolute;
top: -1px;
left: -1px;
width: 100%;
height: 100%;
z-index: -1;
border: 1px solid black;
}
.merge[rowspan]:before {
border-top: none;
border-bottom: none;
}
.merge[colspan]:before {
border-left: none;
border-right: none;
}
</style>
在这个示例中,我们遍历了每一个单元格,判断单元格的内容是否为需要合并的单元格,如果是,则设置它的 rowspan 或 colspan 属性,并添加 merge 类来为合并后的单元格添加样式。最后,我们使用 CSS 为合并后的单元格添加边框。
标签上写