我正在尝试用HTML制作组织结构图。代码相当简单,但我在Chrome / Safari和Opera中渲染时遇到了一些问题。
结果应如下所示,因为它适用于Firefox和IE:
以下是Chrome和Safari
这是在Opera:
问题来自CSS中的border-collapse: collapse
属性。如果我使用旧的编码样式cellspacing="0" cellpadding="0"
,它或多或少会起作用,但在HTML5中无效。
我创建了一个jsFiddle来显示问题:http://jsfiddle.net/aGVp4/7/
我的HTML:
<table cellspacing="0" cellpadding="0">
<tr>
<td colspan="3"></td>
<td colspan="2" class="case"></td>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3"></td>
<td colspan="2" class="case"></td>
<td colspan="3"></td>
</tr>
<tr>
<td></td>
<td colspan="3" class="right bottom"></td>
<td colspan="3" class="bottom"></td>
<td></td>
</tr>
<tr> <!-- No colspan here, to make the layout symmetrical -->
<td class="right"></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td class="right"></td>
<td></td>
</tr>
<tr>
<td colspan="2" class="case"></td>
<td colspan="4"></td>
<td colspan="2" class="case"></td>
</tr>
</table>
我的CSS:
.orgchart {
border-spacing: 0;
border-collapse: collapse;
}
td {
width: 3em;
height: 1em;
}
td.case {
border: 1px solid black;
}
td.right {
border-right: 1px solid black;
}
td.bottom {
border-bottom: 1px solid black;
}
td.top {
border-top: 1px solid black;
}
答案 0 :(得分:4)
这些问题似乎是由浏览器中折叠边框模型的不同解释引起的。 border conflict resolution是根据单元格而不是插槽定义的,当您使用colspan=3
时,一个单元格跨越3个插槽。
第2行的第2个单元格具有实心的底部边框,第3行的第2个单元格没有顶部边框。当边界崩溃时,固体不会赢。但是细胞只是部分相邻,因为它们跨越不同的列。浏览器以不同的方式处理。 Chrome使边框跨越上部单元格的所有列,而Firefox使边框只跨越一列,即单元格共享的列 - 这更合理,但CSS 2.1似乎使问题保持开放。
我尝试使用border: hidden
,这对Chrome有帮助,但会导致Opera出现新问题。
似乎有两种选择。如果他们完成这项工作,您可以使用HTML属性。虽然在HTML5 CR中被宣布为过时和禁止,但同一文档也需要在浏览器中继续支持它们。
但更清洁,也许更强大的方法是通过添加更多空单元来避免这个问题。这意味着将两个第三行单元划分为两个单元,以便它们中只有一个与第二行的单元共享边界。这使得表格更像网格,但基本上不复杂:
<table class="orgchart">
<tr>
<td colspan="3"></td>
<td colspan="2" class="case"></td>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3"></td>
<td colspan="2" class="case" ></td>
<td colspan="3"></td>
</tr>
<tr>
<td></td>
<td colspan="2" class="bottom"></td>
<td class="right bottom"></td>
<td class="bottom" ></td>
<td colspan="2" class="bottom" ></td>
<td></td>
</tr>
<tr> <!-- No colspan here, to make the layout symmetrical -->
<td class="right"></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td class="right"></td>
<td></td>
</tr>
<tr>
<td colspan="2" class="case"></td>
<td colspan="4"></td>
<td colspan="2" class="case"></td>
</tr>
</table>
答案 1 :(得分:0)
我和你的jsfiddle一起玩,并找到了解决Chrome和Safari问题的黑客攻击。
也适用于FF和IE,但没有在Opera上测试。
试试这个(jsfiddle):
td.bottom {
border-top: 1px solid white; // this is the hack
border-bottom: 1px solid black;
}
td.right.bottom {
border-top: none; // fix for IE
}
由于这是一个黑客,它可能无法正常工作,因为你的图表变得复杂,但希望这有助于短期。
答案 2 :(得分:0)
在colspan下添加一个新的空行<tr></tr>
将解决此问题(不是一个漂亮的解决方案,但有效)。