- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定来自不同数据源的节点结构,其中一个节点依赖于0到n个其他节点,但单个节点只能依赖于一个源的节点
const nodes = [
{ dataSourceId: "a", id: "a-1", dependsOnDataSourceId: undefined, dependsOnNodes: [] },
{ dataSourceId: "a", id: "a-2", dependsOnDataSourceId: undefined, dependsOnNodes: [] },
{ dataSourceId: "a", id: "a-3", dependsOnDataSourceId: undefined, dependsOnNodes: [] },
{ dataSourceId: "b", id: "b-1", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1"] },
{ dataSourceId: "b", id: "b-2", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1"] },
{ dataSourceId: "b", id: "b-3", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1", "a-2"] },
{ dataSourceId: "c", id: "c-1", dependsOnDataSourceId: "b", dependsOnNodes: ["b-1"] },
{ dataSourceId: "c", id: "c-2", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "c", id: "c-3", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "c", id: "c-4", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "c", id: "c-5", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2", "b-3"] },
{ dataSourceId: "c", id: "c-6", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2", "b-3"] },
{ dataSourceId: "e", id: "e-1", dependsOnDataSourceId: "c", dependsOnNodes: ["c-1", "c-3"] },
{ dataSourceId: "e", id: "e-2", dependsOnDataSourceId: "c", dependsOnNodes: ["c-3"] },
{ dataSourceId: "self-reference", id: "a-1", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1"] },
{ dataSourceId: "d", id: "d-1", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "d", id: "d-2", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
];
nodes
未排序,顺序是随机的(并且应该无关紧要)。
我想使用行跨度将此结构表示为 HTML 表。我所知道的是列的顺序,其中每个数据源代表一列
const dataSourceIds = ["a", "b", "c", "d", "e", "self-reference"];
dataSourceIds
中的第一项( "a") 始终代表根节点组。
首先我尝试“绘制”预期结果
table, th, td {
border: 1px solid black;
}
<table>
<thead>
<tr>
<th>a</th>
<th>b</th>
<th>c</th>
<th>d</th>
<th>e</th>
<th>self-reference</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="9">a-1</td>
<td>b-1</td>
<td>c-1</td>
<td><!-- Empty for source d --></td>
<td>e-1</td>
<td>a-1</td>
</tr>
<tr>
<td style="display: none"><!-- Covered by a-1 rowspan --></td>
<td rowspan="6">b-2</td>
<td>c-2</td>
<td>d-1</td>
<td><!-- Empty for source e --></td>
<td><!-- Empty for source self-reference --></td>
</tr>
<tr>
<td style="display: none"><!-- Covered by a-1 rowspan --></td>
<td style="display: none"><!-- Covered by b-2 rowspan --></td>
<td rowspan="2">c-3</td>
<td>d-2</td>
<td>e-1</td>
<td><!-- Empty for source a-to-a --></td>
</tr>
<tr>
<td style="display: none"><!-- Covered by a-1 rowspan --></td>
<td style="display: none"><!-- Covered by b-2 rowspan --></td>
<td style="display: none"><!-- Covered by c-3 rowspan --></td>
<td><!-- Empty for source d --></td>
<td>e-2</td>
<td><!-- Empty for source self-reference --></td>
</tr>
<tr>
<td style="display: none"><!-- Covered by a-1 rowspan --></td>
<td style="display: none"><!-- Covered by b-2 rowspan --></td>
<td>c-4</td>
<td><!-- Empty for source d --></td>
<td><!-- Empty for source e --></td>
<td><!-- Empty for source self-reference --></td>
</tr>
<tr>
<td style="display: none"><!-- Covered by a-1 rowspan --></td>
<td style="display: none"><!-- Covered by b-2 rowspan --></td>
<td>c-5</td>
<td><!-- Empty for source d --></td>
<td><!-- Empty for source e --></td>
<td><!-- Empty for source self-reference --></td>
</tr>
<tr>
<td style="display: none"><!-- Covered by a-1 rowspan --></td>
<td style="display: none"><!-- Covered by b-2 rowspan --></td>
<td>c-6</td>
<td><!-- Empty for source d --></td>
<td><!-- Empty for source e --></td>
<td><!-- Empty for source self-reference --></td>
</tr>
<tr>
<td style="display: none"><!-- Covered by a-1 rowspan --></td>
<td rowspan="2">b-3</td>
<td>c-5</td>
<td><!-- Empty for source d --></td>
<td><!-- Empty for source e --></td>
<td><!-- Empty for source self-reference --></td>
</tr>
<tr>
<td style="display: none"><!-- Covered by a-1 rowspan --></td>
<td style="display: none"><!-- Covered by b-3 rowspan --></td>
<td>c-6</td>
<td><!-- Empty for source d --></td>
<td><!-- Empty for source e --></td>
<td><!-- Empty for source self-reference --></td>
</tr>
<tr>
<td rowspan="2">a-2</td>
<td rowspan="2">b-3</td>
<td>c-5</td>
<td><!-- Empty for source d --></td>
<td><!-- Empty for source e --></td>
<td><!-- Empty for source self-reference --></td>
</tr>
<tr>
<td style="display: none"><!-- Covered by a-2 rowspan --></td>
<td style="display: none"><!-- Covered by b-3 rowspan --></td>
<td>c-6</td>
<td><!-- Empty for source d --></td>
<td><!-- Empty for source e --></td>
<td><!-- Empty for source self-reference --></td>
</tr>
<tr>
<td>a-3</td>
<td><!-- Empty for source b --></td>
<td><!-- Empty for source c --></td>
<td><!-- Empty for source d --></td>
<td><!-- Empty for source e --></td>
<td><!-- Empty for source self-reference --></td>
</tr>
</tbody>
</table>
这是我迄今为止尝试过的
const nodes = [
{ dataSourceId: "a", id: "a-1", dependsOnDataSourceId: undefined, dependsOnNodes: [] },
{ dataSourceId: "a", id: "a-2", dependsOnDataSourceId: undefined, dependsOnNodes: [] },
{ dataSourceId: "a", id: "a-3", dependsOnDataSourceId: undefined, dependsOnNodes: [] },
{ dataSourceId: "b", id: "b-1", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1"] },
{ dataSourceId: "b", id: "b-2", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1"] },
{ dataSourceId: "b", id: "b-3", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1", "a-2"] },
{ dataSourceId: "c", id: "c-1", dependsOnDataSourceId: "b", dependsOnNodes: ["b-1"] },
{ dataSourceId: "c", id: "c-2", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "c", id: "c-3", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "c", id: "c-4", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "c", id: "c-5", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2", "b-3"] },
// breaks here because c-6 must also replace a-2 with a rowspan
// { dataSourceId: "c", id: "c-6", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2", "b-3"] },
{ dataSourceId: "e", id: "e-1", dependsOnDataSourceId: "c", dependsOnNodes: ["c-1", "c-3"] },
{ dataSourceId: "e", id: "e-2", dependsOnDataSourceId: "c", dependsOnNodes: ["c-3"] },
{ dataSourceId: "self-reference", id: "a-1", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1"] },
{ dataSourceId: "d", id: "d-1", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
// breaks here because b-2 must be added at c-3 but it tries to add it at c-2
// { dataSourceId: "d", id: "d-2", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
];
const dataSourceIds = ["a", "b", "c", "d", "e", "self-reference"];
// group the nodes by source so it's easier to inspect them
const groupedNodes = {};
for (const dataSourceId of dataSourceIds) {
groupedNodes[dataSourceId] = nodes.filter(node => node.dataSourceId === dataSourceId);
}
// extract the root node id so dataSourceIds only contains child sources
const rootNodeId = dataSourceIds.shift();
const rootNodes = groupedNodes[rootNodeId];
let rows = [];
// setup the initial rows with root nodes
for (const rootNode of rootNodes) {
const row = {
[rootNodeId]: rootNode
};
for (const dataSourceId of dataSourceIds) {
row[dataSourceId] = "empty";
}
rows.push(row);
}
// fill the rows with child nodes
for (let dataSourceIdIndex = 0; dataSourceIdIndex < dataSourceIds.length; dataSourceIdIndex++) {
const dataSourceId = dataSourceIds[dataSourceIdIndex];
const childNodes = groupedNodes[dataSourceId];
for (const childNode of childNodes) {
const { dependsOnDataSourceId, dependsOnNodes } = childNode;
for (const parentNodeId of dependsOnNodes) {
for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
const row = rows[rowIndex];
const parentNode = row[dependsOnDataSourceId];
// parent node must exist in this row
if (parentNode === "empty") {
continue;
}
// parent node id must match
if (parentNode.id !== parentNodeId) {
continue;
}
// what if parent is covered?
// simply add it if there is no value yet
if (row[dataSourceId] === "empty") {
row[dataSourceId] = childNode;
continue;
}
// this row already has a value for this data source so we have to duplicate it
const duplicatedRow = structuredClone(row);
// replace the parent node with a rowspan
duplicatedRow[dependsOnDataSourceId] = { coveredByRowIndex: rowIndex };
// replace the previous child node with the current one
duplicatedRow[dataSourceId] = childNode;
// set all data source values between dependsOnDataSourceId ( exclusive ) and dataSourceIdIndex ( exclusive ) to empty because they are siblings with no data
const dependsOnDataSourceIdIndex = dataSourceIds.findIndex(previousDataSourceId => previousDataSourceId === dependsOnDataSourceId);
for (let emptyDataSourceIndex = dependsOnDataSourceIdIndex + 1; emptyDataSourceIndex < dataSourceIdIndex; emptyDataSourceIndex++) {
const emptyDataSourceId = dataSourceIds[emptyDataSourceIndex];
duplicatedRow[emptyDataSourceId] = "empty";
}
// check if there already are any covered rows
const amountOfCoveredRows = rows.filter(rowToInspect => {
const dataSourceValue = rowToInspect[dependsOnDataSourceId];
if (dataSourceValue.coveredByRowIndex === undefined) {
return false;
}
return dataSourceValue.coveredByRowIndex === rowIndex;
}).length;
const insertDuplicatedRowIndex = rowIndex + amountOfCoveredRows + 1;
// insert the new row after the last covered row
const previousRows = rows.slice(0, insertDuplicatedRowIndex);
const nextRows = rows.slice(insertDuplicatedRowIndex, rows.length);
rows = [
...previousRows,
duplicatedRow,
...nextRows
];
// but don't inspect this one in the next run
rowIndex++;
}
}
}
}
console.log(rows);
哪里
"empty"
意味着 <td>
元素为空coveredByRowIndex
意味着它应该使用 style="display: none"
代码效率低下,但现在这不重要,我想稍后优化它。
如您所见 rows
尚未包含预期结果。有 2 个节点破坏了算法。我对如何手动完成的想法
- group nodes by dataSourceId
- for each a, create a new row with empty values ( except for a )
- fill b
- if there already is a b, duplicate the row and replace the a with a "covered" index
- repeat for c
- repeat for c-6 but c-6 depends on b-3 and b-3 depends on a-2 so you must set a rowspan for a-2
- repeat for d
- repeat for d-2 but d-2 depends on b-2. It must not duplicate the row because there is enough space in the c-3 row
- repeat for e-1
- repeat for e-2 but you must replace d-2 with an "empty" value ( set all sources between parent key and own key to "empty" )
- repeat for self-reference
你们有什么想法可以解决这个问题吗?我不认为我需要最终的代码,我只是不知道如何设置算法......所以任何伪代码/算法建议都将受到高度赞赏!
最佳答案
我不是 100% 确信我已经理解您正在使用的完全通用的数据集可能是什么样子,但下面的代码将执行以下操作:
目前假设:
代码中的做法是:
代码中有一些进一步的解释性注释。
如果您需要修复/更改任何内容,请告诉我。
const nodes = [
{ dataSourceId: "a", id: "a-1", dependsOnDataSourceId: undefined, dependsOnNodes: [] },
{ dataSourceId: "a", id: "a-2", dependsOnDataSourceId: undefined, dependsOnNodes: [] },
{ dataSourceId: "a", id: "a-3", dependsOnDataSourceId: undefined, dependsOnNodes: [] },
{ dataSourceId: "b", id: "b-1", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1"] },
{ dataSourceId: "b", id: "b-2", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1"] },
{ dataSourceId: "b", id: "b-3", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1", "a-2"] },
{ dataSourceId: "c", id: "c-1", dependsOnDataSourceId: "b", dependsOnNodes: ["b-1"] },
{ dataSourceId: "c", id: "c-2", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "c", id: "c-3", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "c", id: "c-4", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "c", id: "c-5", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2", "b-3"] },
{ dataSourceId: "c", id: "c-6", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2", "b-3"] },
{ dataSourceId: "e", id: "e-1", dependsOnDataSourceId: "c", dependsOnNodes: ["c-1", "c-3"] },
{ dataSourceId: "e", id: "e-2", dependsOnDataSourceId: "c", dependsOnNodes: ["c-3"] },
{ dataSourceId: "self-reference", id: "a-1", dependsOnDataSourceId: "a", dependsOnNodes: ["a-1"] },
{ dataSourceId: "d", id: "d-1", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "d", id: "d-2", dependsOnDataSourceId: "b", dependsOnNodes: ["b-2"] },
{ dataSourceId: "d", id: "d-3", dependsOnDataSourceId: "c", dependsOnNodes: ["c-3"] }
];
// Build a list of structured nodes
dataSourceIds = [];
list = [];
selfRefs = [];
for ( var i = 0; i < nodes.length; i++ ) {
if ( nodes[i].dataSourceId == "self-reference" ) {
selfRefs.push(nodes[i].id);
} else {
if ( ! dataSourceIds.includes(nodes[i].dataSourceId) ) dataSourceIds.push(nodes[i].dataSourceId);
list.push([ nodes[i].id, nodes[i].dataSourceId, [], nodes[i].dependsOnNodes, undefined ]);
}
}
dataSourceIds.sort()
// A utility, given a node id return the structured node
function getListNode(id) {
for ( var i = 0; i < list.length; i++ ) {
if ( list[i][0] == id ) return list[i];
}
return undefined;
}
// Populate structured nodes with their structured parents
for ( var i = 0; i < list.length; i++ ) {
var parents = [];
for ( var j = 0; j < list[i][3].length; j++ ) {
parents.push(getListNode(list[i][3][j]));
}
list[i][3] = parents;
}
// Populate structured nodes with their structured children
for ( var i = 0; i < list.length; i++ ) {
for ( var j = 0; j < list[i][3].length; j++ ) {
list[i][3][j][2].push(list[i]);
}
}
// Get the structured nodes with no parents
treeRoots = [];
for ( var i = 0; i < list.length; i++ ) {
if ( list[i][3].length == 0 ) treeRoots.push(list[i]);
}
function spanner(node) {
// Calculate the row span required for a node, by recursively walking the tree for the node
var span;
if ( node[2].length == 0 ) {
span = 1
node[4] = span;
} else {
var span = 0;
for ( var i = 0; i < node[2].length; i++ ) {
span += spanner(node[2][i]);
}
node[4] = span
}
return span
}
// Utility to print a tree root
function printTR(treeRoots) {
var text = "";
for ( var i = 0; i < treeRoots.length; i++ ) {
text += printNT(treeRoots[i], 0);
}
return text;
}
// Utility to space out fields, indent, etc.
function spacer(n) {
var N = n * 4;
var text = "";
for ( var i = 0; i < N; i++ ) {
text += " "
}
return text;
}
// Utility to print a node tree
function printNT(node, depth) {
var text = "";
text += '<br>' + spacer(depth) + node[0] + spacer(1) + node[4] + spacer(1) + node[1];
for ( var j = 0; j < node[2].length; j++ ) {
text += printNT(node[2][j], depth + 1);
}
return text;
}
function tableTR(treeRoots) {
// Convert a root tree into a set of rows
var text = "";
for ( var i = 0; i < treeRoots.length; i++ ) {
var textRoot = '<tr>' + tableNT(treeRoots[i], "").replaceAll("</tr>", "<td></td></tr>");
// Add in a self reference
if ( selfRefs.indexOf(treeRoots[i][0]) != -1 ) {
ndx = textRoot.indexOf("</td></tr>");
text += textRoot.slice(0,ndx) + treeRoots[i][0] + textRoot.slice(ndx);
} else {
text += textRoot;
}
}
return text;
}
function sourcePadding(parent, child) {
// Generate empty table cells when child source is more than one source away from parent source.
// $ is to end of row of sources.
var text = "";
if ( child == "$" ) {
for ( var i = 1; i < dataSourceIds.length - dataSourceIds.indexOf(parent); i++ ) {
text += '<td>' + '</td>';
}
} else if ( parent != child && parent != "" ) {
for ( var i = 1; i < dataSourceIds.indexOf(child) - dataSourceIds.indexOf(parent); i++ ) {
text += '<td>' + '</td>';
}
}
return text;
}
function tableNT(node, parentSource) {
// Convert a node tree into table rows
var text = "";
if ( node[4] == 1 ) {
if ( node[2].length == 1 ) {
text += sourcePadding(parentSource, node[1]) + '<td>' + node[0] + '</td>' + tableNTfr(node[2][0], node[1]);
} else {
text += sourcePadding(parentSource, node[1]) + '<td>' + node[0] + '</td>' + sourcePadding(node[1], "$") + '</tr>';
}
} else {
text += sourcePadding(parentSource, node[1]) + '<td rowspan="' + node[4] + '">' + node[0] + '</td>' + tableNTfr(node[2][0], node[1]);
text += tableNTor(node[2][0], [ [ node[1], node[2][0][1] ] ]);
for ( var i = 1; i < node[2].length; i++ ) {
text += '<tr>' + tableNT(node[2][i], node[1])
}
}
return text;
}
function tableNTfr(node, parentSource) {
// The first row in a row span
var text = "";
if ( node[4] == 1 ) {
if ( node[2].length == 1 ) {
text += sourcePadding(parentSource, node[1]) + '<td>' + node[0] + '</td>' + tableNTfr(node[2][0], node[1]);
} else {
text += sourcePadding(parentSource, node[1]) + '<td>' + node[0] + '</td>' + sourcePadding(node[1], "$") + '</tr>';
}
} else {
text += sourcePadding(parentSource, node[1]) + '<td rowspan="' + node[4] + '">' + node[0] + '</td>' + tableNTfr(node[2][0], node[1]);
}
return text;
}
function tableNTor(node, skips) {
// The other rows in a row span
var text = "";
var skipped = [ ...skips ];
if ( node[2].length != 0 ) {
if ( node[4] > 1 ) {
skipped.push([ node[1], node[2][0][1] ]);
text += tableNTor(node[2][0], skipped)
for ( var i = 1; i < node[2].length; i++ ) {
text += '<tr>'
for ( var j = 0; j < skipped.length - 1; j++ ) {
text += sourcePadding(skipped[j][0], skipped[j][1], 0);
}
text += tableNT(node[2][i], node[1])
}
}
}
return text;
}
function tableHead(dataSourceIds) {
text = "";
for ( var i = 0; i < dataSourceIds.length; i++ ) {
text += '<th>' + dataSourceIds[i] + '</th>';
}
text += '<th>' + 'self-reference' + '</th>';
return '<tr>' + text + '</tr>';
}
function doStuff() {
for ( var i = 0; i < treeRoots.length; i++ ) {
spanner( treeRoots[i] );
}
var printerOne = document.getElementById("printerOne");
printerOne.innerHTML = printTR( treeRoots );
var treeTable = document.getElementById("treeTable");
treeTable.innerHTML = tableHead(dataSourceIds) + tableTR(treeRoots);
}
table {
border: 1px solid black;
}
th,
td {
border: 1px solid black;
}
<body onload="doStuff()">
<div>
Parsed nodes with calculated row spans and source:
<div id="printerOne">
</div>
</div>
<br>
<div>
Tree converted to table rows:<br>
<div>
<table id="treeTable">
</table>
</div>
</body>
关于javascript - 如何使用 rowspans 将树状结构转换为纯 HTML 表格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73897599/
我正在编写一个动态创建 HTML 表格的 PHP 脚本。 有两件东西丢失了,找不到相关信息。 我想减少 rowspan 单元格的“填充”,它在水平方向上太大了。您可以使用什么来修改内部字符串和单元格末
我有 HTML 表格。我正在遍历表并遍历其第三个单元格具有 rowspan 属性的每一行。我如何检查是否找到 rowspan 然后检查它的第一个单元格是否有文本。如果是,则分配给 javascript
我将通过一个示例向您展示我的问题,这里我使用带有 rowspan 的列: Familie Jill Smith 50 Eve Jackson 94 不知何故,当
see fiddle 首先,我是 jquery 的新手。 我只需要选择一个单元格#tableAppointment tbody tr td:nth-child(2)文本框值应转到选择开始的下一个单元格
我不明白为什么我的列不会跨越我创建的顶部和底部行。它应该看起来像“今天”栏的顶部和底部比其他栏高。 这是很多代码,我不确定在不变形或添加新变量(它需要流体高度)的情况下我应该削减什么。JSFiddle
我有一个简单的 table 和 rowspan 。我需要那个单元格 1、单元格 2 和单元格 6 的大小相同。请问我怎样才能做到这一点 number1 number3
我只是想问一下我是否可以把在顶部,因为我在 上使用了一个 rowspan .请参阅下面的示例。 这是我的代码: Month Savings Savings for h
请注意,“倒置”表示 现在代表一列。 我使用这个 CSS 代码(我在互联网上找到的)反转了一个 HTML 表格: table { border-collapse: collapse; } tr {
我用 html 制作了一个表格,但是当我尝试增加表格单元格的高度时,它并没有增加。 这是 index.html 文件: Title Card
我正在尝试创建一个表格,其中第 1 行中的单元格 1 和单元格 2 都跨越 2 行以获得更大的标题,同时仍位于它们自己的单独单元格中。看起来像这段代码的东西 Quarter
我试图让最后一行跨越前一行的 3 行。但是由于某种原因,这不起作用,我已经用几种不同的方式多次重写了代码,但似乎无法让它起作用: CSS: .div_walkthroughs_wrapper {
我一直在尝试实现一些非常简单的事情,如下所示,在我的代码中,您可以看到,在 td 中,我设置了 rowspan="2" 并放置了一个 输入“id=图像”。我正在尝试将图像放在 input 字段下方。
我应该有一些非常简单的 html,但由于某种原因,我无法使 rowspan 工作。它不会填充整个左侧列,而是只占据其底部的一个单元格。我想要这样的东西: +----------+-----------
如何在这种结构中制作一个 html 表格? +--------------+-----+--------------+ | | | | |
我想我正在尝试做的这个模式比问题本身更具描述性。 +------------------------+-----------------------+ |
我有一个类似 this 的表格: Items Type Values Date
我见过一些类似的问题,但没有任何答案可以回答这个特定问题。考虑下表: one two three four
aaaaaaaaaaaa aaaaaaaaaaaa aaaaaaaaaaaa aaaaaaaaaaaa table td { padding: 3px
我有一张 table (2 x 2)。如果我在行跨度为 2 的第一个单元格中添加一个短语作为单元格,它就可以工作。但如果我使用图像作为单元格,行跨度永远不会适用。 float[] rowwid
我希望一周的学生和事件以日历格式显示。我有如下数组。每个学生有 7 个数组,从星期一到星期天,每个数组的内部都有当天的事件 $array = [ 'Alex' => [ [
我是一名优秀的程序员,十分优秀!