表格行边框 - 一半,一半

时间:2015-07-19 18:19:38

标签: html css

我正在尝试使用我认为可以实现的相当简单的风格来设置表格,但是遇到了一个小问题。

该表格将在每行的左侧显示一个彩色指示符,因此我使用border-left: 5px solid red;添加它。然而,虽然边界适用 - 其中一半在行内,一半在外。我尝试添加border-collapse: collapse无效,我也使用box-sizing: border-box,但仍然遇到同样的问题。

最后,我还尝试将边框添加到第一个子单元格(td),但出现了同样的问题。

我已经建立了一个正在发生的事情的例子 - 我已经加入了一个超大的边框来强调这个问题:

http://www.cssdesk.com/TVa67

之前是否有人遇到此问题或有任何解决方案?

body {
  background: blue;
}
table {
  border-collapse: collapse;
  box-sizing: border-box;
  table-layout: fixed;
  width: 100%;
}
th,
td {
  background-color: #fff;
  padding: 10px 15px 8px;
}
th {
  border-bottom: 1px solid blue;
  font-weight: normal;
  text-align: left;
}
td {
  border-bottom: 1px solid gray;
}
tr.low {
  border-left: 25px solid red;
}
<table style="
    border-collapse: collapse;
">
  <tbody>
    <tr>
      <th>#</th>
      <th>Status</th>
      <th>Title</th>
      <th>Project</th>
      <th>Assigned To</th>
      <th>Age</th>
    </tr>

    <tr class="low">
      <td>1</td>
      <td>New</td>
      <td>This is an example ticket</td>
      <td>Something</td>
      <td>Something</td>
      <td>2 days ago</td>
    </tr>
  </tbody>
</table>

1 个答案:

答案 0 :(得分:4)

  

然而,尽管边界适用 - 其中一半在行内   一半在外面

此行为是预期的,并且符合规范。请参阅:http://www.w3.org/TR/CSS2/tables.html#collapsing-borders,其中包含:

  

边框以细胞之间的网格线为中心......

它还说明了带有description的图表。

  

之前是否有人遇到此问题或有任何解决方案?

是的,它可以很容易地在 小提琴:http://jsfiddle.net/abhitalks/xs7L9wn1/1/ 和下面的 代码段

&#13;
&#13;
* { box-sizing: border-box; }
table {
    border-collapse: collapse;
    border: 1px solid gray;
    table-layout: fixed; width: 70%; 
    margin: 0 auto;
}
th, td {
    border: 1px solid gray;
    padding: 6px;
    text-align: center;
}
tbody > tr:nth-child(1) > td:first-child { border-left: 16px solid red; }
tbody > tr:nth-child(2) > td:first-child { border-left: 8px solid green; }
tbody > tr:nth-child(3) > td:first-child { border-left: 24px solid blue; }

tbody > tr:nth-child(1) > td:last-child { border-left: 16px solid red; }
tbody > tr:nth-child(2) > td:last-child { border-left: 8px solid green; }
tbody > tr:nth-child(3) > td:last-child { border-left: 24px solid blue; }
&#13;
<table>
    <thead>
        <tr>
            <th>#</th>
            <th>Header 1</th>
            <th>Header 2</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <td>Caption</td>
            <td>Description</td>
        </tr>
        <tr>
            <td>2</td>
            <td>Caption</td>
            <td>Description</td>
        </tr>
        <tr>
            <td>3</td>
            <td>Caption</td>
            <td>Description</td>
        </tr>
    </tbody>
</table>
&#13;
&#13;
&#13;

解决方案:

只需向所有行添加相同宽度的透明边框即可。这样边框宽度将是相同的,它将整齐地对齐。 (更新:在第一列添加了白色border-left,以隐藏突出显示的单元格上的悬挂边框。正如您的评论所指出的那样。

th, td { border-left: 15px solid transparent; }
tr > td:first-child, tr > th:first-child { border-left: 5px solid #fff; }
tr.low > td:first-child { border-left: 5px solid red; }

示例小提琴:https://jsfiddle.net/abhitalks/s9taanz7/5/

<强>

&#13;
&#13;
* { box-sizing: border-box; }
body { background-color: blue; }
table {
    border-collapse: collapse;
    table-layout: fixed; width: 100%;
}
th, td {
    background-color: #fff;
    padding: 10px 15px 8px 8px;
    border-left: 5px solid transparent;
    border-bottom: 1px solid gray;  
}
th {
    border-bottom: 1px solid blue;
    font-weight: normal; text-align: left;
}
tr > td:first-child, tr > th:first-child { border-left: 10px solid #fff; }
tr.low > td:first-child { border-left: 10px solid red; }
&#13;
<table>
	<thead>
		<tr>
			<th>#</th>
			<th>Status</th>
			<th>Title</th>
			<th>Project</th>
			<th>Assigned To</th>
			<th>Age</th>
		</tr>
	</thead>
	<tbody>
		<tr class="">
			<td>1</td>
			<td>New</td>
			<td>This is an example ticket</td>
			<td>Something</td>
			<td>Something</td>
			<td>2 days ago</td>
		</tr>
		<tr class="low">
			<td>2</td>
			<td>New</td>
			<td>This is an example ticket</td>
			<td>Something</td>
			<td>Something</td>
			<td>2 days ago</td>
		</tr>
		<tr class="">
			<td>3</td>
			<td>New</td>
			<td>This is an example ticket</td>
			<td>Something</td>
			<td>Something</td>
			<td>2 days ago</td>
		</tr>
	</tbody>
</table>
&#13;
&#13;
&#13;

但是,此方法会产生隐藏border-bottom的副作用,因为border-left与其重叠。

解决方案2:

你可以在左边有一个额外的单元格作为指标。然后,您可以使用colgroup来控制此操作。这种方法比上面更整洁,并且还要求你在css中只指定一次宽度。

示例小提琴2:http://jsfiddle.net/abhitalks/z7u1nhwt/1/

Snippet 2

&#13;
&#13;
* { box-sizing: border-box; }
body { background-color: blue; }
table {
    border-collapse: collapse;
    table-layout: fixed; width: 100%;
}
th, td {
    background-color: #fff;
    padding: 10px 15px 8px 8px;
    border-bottom: 1px solid gray;  
}
th {
    border-bottom: 1px solid blue;
    font-weight: normal; text-align: left;
}
.col1 { width: 10px; }
tr.low > td:first-child {
    background-color: #f00;
}
&#13;
<table>
	<colgroup>
        <col class="col1" />
        <col class="coln" span="6" />
	</colgroup>
	<thead>
		<tr>
			<th></th>
			<th>#</th>
			<th>Status</th>
			<th>Title</th>
			<th>Project</th>
			<th>Assigned To</th>
			<th>Age</th>
		</tr>
	</thead>
	<tbody>
		<tr class="">
			<td></td>
			<td>1</td>
			<td>New</td>
			<td>This is an example ticket</td>
			<td>Something</td>
			<td>Something</td>
			<td>2 days ago</td>
		</tr>
		<tr class="low">
			<td></td>
			<td>2</td>
			<td>New</td>
			<td>This is an example ticket</td>
			<td>Something</td>
			<td>Something</td>
			<td>2 days ago</td>
		</tr>
		<tr class="">
			<td></td>
			<td>3</td>
			<td>New</td>
			<td>This is an example ticket</td>
			<td>Something</td>
			<td>Something</td>
			<td>2 days ago</td>
		</tr>
	</tbody>
</table>
&#13;
&#13;
&#13;

当然,您也可以尝试使用@misterManSam提出的伪元素的方法,具体取决于您的实施方式。