我正在尝试设计一些HTML / CSS,它可以在表格中的特定行周围放置边框。是的,我知道我不是真的应该使用表格进行布局,但我还不知道足够的CSS来完全替换它。
无论如何,我有一个包含多行和多列的表,有些与rowspan和colspan合并,我想在表的各个部分放置一个简单的边框。目前,我正在使用4个单独的CSS类(顶部,底部,左侧,右侧),我分别附加到表的顶部,底部,左侧和右侧的<td>
单元格。
.top {
border-top: thin solid;
border-color: black;
}
.bottom {
border-bottom: thin solid;
border-color: black;
}
.left {
border-left: thin solid;
border-color: black;
}
.right {
border-right: thin solid;
border-color: black;
}
<html>
<body>
<table cellspacing="0">
<tr>
<td>no border</td>
<td>no border here either</td>
</tr>
<tr>
<td class="top left">one</td>
<td class="top right">two</td>
</tr>
<tr>
<td class="bottom left">three</td>
<td class="bottom right">four</td>
</tr>
<tr>
<td colspan="2">once again no borders</td>
</tr>
<tr>
<td class="top bottom left right" colspan="2">hello</td>
</tr>
<tr>
<td colspan="2">world</td>
</tr>
</table>
</html>
有没有更简单的方法来做我想要的?我尝试将顶部和底部应用于<tr>
,但它不起作用。 (p.s.我是CSS的新手,因此我可能错过了一个非常基本的解决方案。)
注意:我确实需要有多个有边框的部分。基本思想是拥有多个边界集群,每个集群包含多行。
答案 0 :(得分:111)
tr {outline: thin solid black;}
怎么样?适用于tr或tbody元素,appears可与大多数浏览器兼容,包括IE 8+,但之前不兼容。
答案 1 :(得分:51)
感谢所有回复的人!我已经尝试了这里提出的所有解决方案,并且我已经在互联网上搜索了更多其他可能的解决方案,我想我已经找到了一个有希望的解决方案:
tr.top td {
border-top: thin solid black;
}
tr.bottom td {
border-bottom: thin solid black;
}
tr.row td:first-child {
border-left: thin solid black;
}
tr.row td:last-child {
border-right: thin solid black;
}
<html>
<head>
</head>
<body>
<table cellspacing="0">
<tr>
<td>no border</td>
<td>no border here either</td>
</tr>
<tr class="top row">
<td>one</td>
<td>two</td>
</tr>
<tr class="bottom row">
<td>three</td>
<td>four</td>
</tr>
<tr>
<td colspan="2">once again no borders</td>
</tr>
<tr class="top bottom row">
<td colspan="2">hello</td>
</tr>
<tr>
<td colspan="2">world</td>
</tr>
</table>
</body>
</html>
<强>输出:强>
我不需要将top
,bottom
,left
和right
类添加到每个<td>
,而是我要做的就是添加{ {1}}到顶部top row
,<tr>
到底部bottom row
,<tr>
到row
之间的每个<tr>
。这个解决方案有什么问题吗?我应该注意哪些跨平台问题?
答案 2 :(得分:35)
如果您在父表上将border-collapse
样式设置为collapse
,则应该能够设置tr
的样式:
(样式是内联的演示)
<table style="border-collapse: collapse;">
<tr>
<td>No Border</td>
</tr>
<tr style="border:2px solid #f00;">
<td>Border</td>
</tr>
<tr>
<td>No Border</td>
</tr>
</table>
<强>输出:强>
答案 3 :(得分:8)
我也只是在玩这个,这对我来说似乎是最好的选择:
<style>
tr {
display: table; /* this makes borders/margins work */
border: 1px solid black;
margin: 5px;
}
</style>
请注意,这将阻止使用流体/自动列宽,因为单元格将不再与其他行中的对齐,但边框/颜色格式仍然可以正常工作。解决方案是给TR和TD指定宽度(px或%)。
当然,如果您只想将选择器应用于某些行,则可以创建选择器tr.myClass
。显然display: table
不能用于IE 6/7,但是可能还有其他黑客(hasLayout?)可能适用于那些。 : - (
答案 4 :(得分:3)
这是一种使用tbody元素的方法,可以这样做。您不能在tbody上设置边框(与tr上的设置不同),但您可以设置背景颜色。如果你想要实现的效果可以通过行组而不是边框上的背景颜色获得,那么这将起作用。
<table cellspacing="0">
<tbody>
<tr>
<td>no border</td>
<td>no border here either</td>
</tr>
<tbody bgcolor="gray">
<tr>
<td>one</td>
<td>two</td>
</tr>
<tr>
<td>three</td>
<td>four</td>
</tr>
<tbody>
<tr>
<td colspan="2">once again no borders</td>
</tr>
<tbody bgcolor="gray">
<tr>
<td colspan="2">hello</td>
</tr>
<tbody>
<tr>
<td colspan="2">world</td>
</tr>
</table>
答案 5 :(得分:2)
使用<tbody>
标记将行组合在一起,然后应用样式。
<table>
<tr><td>No Style here</td></tr>
<tbody class="red-outline">
<tr><td>Style me</td></tr>
<tr><td>And me</td></tr>
</tbody>
<tr><td>No Style here</td></tr>
</table>
和style.css中的css
.red-outline {
outline: 1px solid red;
}
答案 6 :(得分:1)
根据您的要求,您希望在任意MxN单元块周围放置边框,实际上没有使用Javascript的方法更容易。如果你的细胞是固定的,你可以使用浮子,但由于其他原因这是有问题的。你正在做的事情可能很乏味,但没关系。
好的,如果您对Javascript解决方案感兴趣,使用jQuery(我的首选方法),您最终会得到这段相当可怕的代码:
<html>
<head>
<style type="text/css">
td.top { border-top: thin solid black; }
td.bottom { border-bottom: thin solid black; }
td.left { border-left: thin solid black; }
td.right { border-right: thin solid black; }
</style>
<script type="text/javascript" src="jquery-1.3.1.js"></script>
<script type="text/javascript">
$(function() {
box(2, 1, 2, 2);
});
function box(row, col, height, width) {
if (typeof height == 'undefined') {
height = 1;
}
if (typeof width == 'undefined') {
width = 1;
}
$("table").each(function() {
$("tr:nth-child(" + row + ")", this).children().slice(col - 1, col + width - 1).addClass("top");
$("tr:nth-child(" + (row + height - 1) + ")", this).children().slice(col - 1, col + width - 1).addClass("bottom");
$("tr", this).slice(row - 1, row + height - 1).each(function() {
$(":nth-child(" + col + ")", this).addClass("left");
$(":nth-child(" + (col + width - 1) + ")", this).addClass("right");
});
});
}
</script>
</head>
<body>
<table cellspacing="0">
<tr>
<td>no border</td>
<td>no border here either</td>
</tr>
<tr>
<td>one</td>
<td>two</td>
</tr>
<tr>
<td>three</td>
<td>four</td>
</tr>
<tr>
<td colspan="2">once again no borders</td>
</tr>
</tfoot>
</table>
</html>
我很乐意接受有关更简单方法的建议......
答案 7 :(得分:1)
我能想到的另一种方法是在嵌套表中包含您需要边框的每一行。这将使边框更容易,但可能会产生其他布局问题,您必须手动设置表格单元格的宽度等。
根据您的其他布局要求,您的方法可能是最好的方法,此处建议的方法只是一种可能的选择。
<table cellspacing="0">
<tr>
<td>no border</td>
<td>no border here either</td>
</tr>
<tr>
<td>
<table style="border: thin solid black">
<tr>
<td>one</td>
<td>two</td>
</tr>
<tr>
<td>three</td>
<td>four</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2">once again no borders</td>
</tr>
<tr>
<td>
<table style="border: thin solid black">
<tr>
<td>hello</td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2">world</td>
</tr>
</table>
答案 8 :(得分:0)
诀窍是outline property,感谢enigment's answer稍加修改
使用此课程
.row-border{
outline: thin solid black;
outline-offset: -1px;
}
然后在HTML
中<tr>....</tr>
<tr class="row-border">
<td>...</td>
<td>...</td>
</tr>
答案 9 :(得分:-4)
更简单的方法是使表成为服务器端控件。你可以使用类似的东西:
Dim x As Integer
table1.Border = "1"
'Change the first 10 rows to have a black border
For x = 1 To 10
table1.Rows(x).BorderColor = "Black"
Next
'Change the rest of the rows to white
For x = 11 To 22
table1.Rows(x).BorderColor = "White"
Next