我打算制作一个 JSFiddle,但结果并不正确。
我有一张桌子。当我想将鼠标悬停/鼠标悬停在表格单元格上时,我想更改表格单元格的颜色。我想通过改变背景颜色的不透明度来做到这一点,但这种方法在 IE8 中会产生一些奇怪的行为。我认为这可能是由于我偶尔听到的“hasLayout”问题,但我似乎什至无法设置hasLayout
属性(当我测试zoom:1
或position:relative
我仍然得到 undefined for 时hasLayout
)。
我正在使用 PHP 来制作这个表格,并且颜色是动态定义的,所以我想避免:hover
为每个不同颜色的单元格创建一个类。如果我可以在鼠标悬停时以相同的方式更改每个单元格(使颜色变亮),而不必为使用的每种颜色实际打印单独的样式,那就太好了。
所以 - 在 IE8 中,我的边框消失了。我尝试在不透明度休息后重置 CSS,但它不起作用。
有谁知道为什么会发生这种情况,我该如何解决它或产生相同结果的替代方法?
这适用于任何浏览器的悬停或鼠标悬停...
IE8 悬停/鼠标悬停后
在 IE8 中的整个表格上悬停/鼠标悬停后
这是在任何数量的悬停之前和之后表格在 Chrome 中的显示方式。
CSS:
td.colors {
border: 1px solid black;
height: 4px;
padding: 0px;
}
td.colors_middle_row {
border-top: 0px;
border-right: 2px solid #000000;
border-bottom: 0px;
border-left: 2px solid #000000;
}
td.colors_top_row {
border-top: 2px solid #000000;
border-right: 2px solid #000000;
border-bottom: 0px;
border-left: 2px solid #000000;
}
td.colors_bottom_row {
border-top: 0px;
border-right: 2px solid #000000;
border-bottom: 2px solid #000000;
border-left: 2px solid #000000;
}
JS/JQuery:
$('td.colors').on('mouseover hover', function() {
$(this).css('opacity','0.3');
$(this).css('filter','alpha(opacity=30)');
});
$('td.colors').on('mouseleave blur', function() {
$(this).css('opacity','1');
$(this).css('filter','alpha(opacity=100)');
/* --- just something I tried that didn't work ---
if ($(this).hasClass('colors_middle_row'))
{
$(this).css('border-top', '0px');
$(this).css('border-right', '2px solid #000000');
$(this).css('border-bottom', '0px');
$(this).css('border-left', '2px solid #000000');
}
else if ($(this).hasClass('colors_top_row'))
{
$(this).css('border-top', '2px solid #000000');
$(this).css('border-right', '2px solid #000000');
$(this).css('border-bottom', '0px');
$(this).css('border-left', '2px solid #000000');
}
else if ($(this).hasClass('colors_bottom_row'))
{
$(this).css('border-top', '0px');
$(this).css('border-right', '2px solid #000000');
$(this).css('border-bottom', '2px solid #000000');
$(this).css('border-left', '2px solid #000000');
}
*/
});
TD 的 HTML 如下所示:
<td style="width: 12.5%; background-color: rgb(132, 245, 118); opacity: 1;" class="colors colors_middle_row" title="WED @ 8:00"> </td>
我不会发布任何 PHP,因为我认为它根本不相关......但请记住,表格在 PHP 中构建的方式是我不想使用:hover
该类的原因,并且更喜欢一种方法将颜色更改为相同程度的悬停/鼠标悬停。我能想到的唯一选择可能是弄乱十六进制颜色代码,并为每个 RGB 或其他东西添加一个特定的数字......我不知道。我需要边界留下来。这里还有一些奇怪的东西——在 IE 中,边框消失后,如果你将鼠标悬停在同一个单元格上,边框会在鼠标悬停时出现,但在鼠标离开后会再次消失。
就像不透明度覆盖了边界,但我不知道如何纠正它。我尝试将其设置为 .99 / 99 而不是 1 / 100 (以及其他一些值),但它仍然没有达到我想要的效果......
这适用于 IE8 和 Chrome。 基本上......我使用下面提供的方法并决定将值存储在对象/数组中。我正在使用 2 个数组(让正常颜色悬停,然后悬停到正常颜色),因为在 IE8 中可靠地按值查找数组索引时遇到了一些问题。我对代码中的颜色变化做了一些假设。
var colors_array = new Object();
var shade_colors_array = new Object();
$('td.colors').on('mouseover hover', function() {
var color = $(this).css('background-color');
if (color.charAt(0) != '#') color = rgb2hex(color);
if (typeof colors_array == 'undefined' || typeof colors_array[color] == 'undefined' ) {
var sc = shadeColor(color, 15);
shade_colors_array[sc] = color;
colors_array[color] = sc;
}
var shade_color = colors_array[color];
$(this).css('background-color', shade_color);
});
$('td.colors').on('mouseleave blur', function() {
var shade_color = $(this).css('background-color');
if (shade_color.charAt(0) != '#') shade_color = rgb2hex(shade_color);
var color = shade_colors_array[shade_color];
$(this).css('background-color', color);
});
function shadeColor(color, percent) {
var num = parseInt(color.slice(1),16),
amt = Math.round(2.55 * percent),
R = (num >> 16) + amt,
B = (num >> 8 & 0x00FF) + amt,
G = (num & 0x0000FF) + amt;
return "#" + (0x1000000 + (R<255?R<1?0:R:255)*0x10000 + (B<255?B<1?0:B:255)*0x100 + (G<255?G<1?0:G:255)).toString(16).slice(1);
}
function rgb2hex(rgb) {
rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
function hex(x) {
// parseInt(x) was changed to parseInt(x,10) because
// i was occasionally getting unexepcted results in IE
return ("0" + parseInt(x,10).toString(16)).slice(-2);
}
return '#' + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}
我已经研究了足够长的时间,以至于“颜色”对我来说不再像是一个词