我有以下fiddle。
编辑:应用行边框样式:
table,th,td
{
border:2px solid black;
border-collapse:collapse;
}
tr:hover td
{
background-color:grey;
border-top: 2px solid rgb(10, 0, 255);
border-bottom: 2px solid rgb(10, 0, 255);
}
td:hover
{
background-color:rgb(214,214,214) !important;
border:2px solid red !important;
border-top: 2px solid red;
border-bottom: 2px solid red;
}
我所追求的是突出显示ROW和CELL。最初曾经想过要做一些十字准线,但是列背景着色需要JavaScript,我暂时会避免使用它。
这就要求ROW:hover
背景颜色变暗,并强调边框。
td:hover
然后是不同的颜色,边界强调不同。
在Chrome中检查,未检查Firefox。
问题:需要使用!important
。
单元格边框 - 左边和顶部没有着色为红色?
那么有没有办法不使用important!
编写CSS,并在TD单元格上修正边框样式?
答案 0 :(得分:3)
你可以用CSS(没有Javascript)来做你原来的十字准线想法。使用::before
和::after
伪元素进行突出显示。 Firefox使用这种方法存在一些问题,所以我为它编写了一个修复程序。
border-collapse: collapse
使<tds>
上的边框以奇怪的方式表现。相反,请将您的边框放在<trs>
和<cols>
上。 border-collapse: collapse
也会切断边缘。要解决这个问题,您必须在所有外部<tds>
和<ths>
上获得创意并绘制额外的边框。更奇怪的是,它“吃掉”顶部的像素和底部的两个像素。因此,您需要在顶部3px
获取2px
边框,并在底部使用4px
以获得2px
边框。
table {
border-collapse: collapse;
overflow: hidden;
z-index: 1;
}
td, th, .row, .col, .ff-fix {
cursor: pointer;
padding: 10px;
position: relative;
}
tr:last-child td {
border-bottom: 4px solid black;
}
tr, col {
border: 2px solid black;
}
th {
border-top: 3px solid black;
}
th:last-child, td:nth-child(3n) {
border-right: 4px solid black;
}
td:first-child, th:first-child {
border-left: 3px solid black;
}
td:hover {
border: 2px solid red;
}
td:hover:first-child {
border-left: 3px solid red;
}
td:hover:nth-child(3n) {
border-right: 4px solid red;
}
tr:last-child td:hover {
border-bottom: 4px solid red;
}
td:hover::before,
.row:hover::before,
.ff-fix:hover::before {
background-color: #ffa;
content: '\00a0';
height: 100%;
left: -5000px;
position: absolute;
top: 0;
width: 10000px;
z-index: -1;
}
td:hover::after,
.col:hover::after,
.ff-fix:hover::after {
background-color: #ffa;
content: '\00a0';
height: 10000px;
left: 0;
position: absolute;
top: -5000px;
width: 100%;
z-index: -1;
}
HTML:
<table>
<col /><col /><col />
<tr>
<th class="col">First Name</th>
<th class="col">Middle Name</th>
<th class="col">Last Name</th>
</tr>
<tr>
<td>Peter</td>
<td>Jeffery</td>
<td>Griffin</td>
</tr>
<tr>
<td>Lois</td>
<td>Marie</td>
<td>Griffin</td>
</tr>
<tr>
<td>Margie</td>
<td>Ann</td>
<td>Thatcher</td>
</tr>
</table>
function firefoxFix() {
if ( /firefox/.test( window.navigator.userAgent.toLowerCase() ) ) {
var tds = document.getElementsByTagName( 'td' ),
ths = document.getElementsByTagName( 'th' );
for( var index = 0; index < tds.length; index++ ) {
tds[index].innerHTML = '<div class="ff-fix">' + tds[index].innerHTML + '</div>';
};
for( var index = 0; index < ths.length; index++ ) {
ths[index].innerHTML =
'<div class="' + ths[index].className + '">'
+ ths[index].innerHTML
+ '</div>';
ths[index].className = '';
};
var style = '<style>'
+ 'td, th { padding: 0 !important; }'
+ 'td:hover::before, td:hover::after { background-color: transparent !important; }'
+ '</style>';
document.head.insertAdjacentHTML( 'beforeEnd', style );
};
};
firefoxFix();
答案 1 :(得分:1)
您的示例工作正常,您无需使用!important
。移除border-collapse: collapse
,您会看到(jsfiddle)。
答案 2 :(得分:1)
以下是一个更简单的解决方案:将以下样式设置为所有table
,tr
和td
:
border: 2px inset black;
border-collapse: collapse;
border-spacing: 0;
制作border
inset
可以解决问题。 inset
很有用:
当父元素和子元素都有边框时,使用这种技术你不会得到两个边框(看起来很丑陋)。这是因为子元素在嵌入框阴影上渲染,而不是在嵌入框阴影内。
参考:http://makandracards.com/makandra/12019-css-emulate-borders-with-inset-box-shadows
工作示例:http://jsfiddle.net/TR8Zg/146/
它在Chrome上运行良好。但是在IE和FireFox上填充了插入效果。所以需要找到一些修正。