使用 JavaScript 更改 :hover CSS 属性

IT技术 javascript html css dhtml
2021-02-02 14:14:36

JavaScript 如何更改 CSS:hover属性?

例如:

HTML

<table>
  <tr>
    <td>Hover 1</td>
    <td>Hover 2</td>
  </tr>
</table>

CSS

table td:hover {
background:#ff0000;
}

如何使用 JavaScripttd :hover属性修改为,例如,background:#00ff00我知道我可以使用 JavaScript 访问样式背景属性:

document.getElementsByTagName("td").style.background="#00ff00";

但我不知道的.styleJavaScript的等价物:hover

6个回答

伪类:hover永远不会引用元素,而是引用任何满足样式表规则条件的元素。您需要编辑样式表规则附加新规则或添加包含新:hover规则的新样式表

var css = 'table td:hover{ background-color: #00ff00 }';
var style = document.createElement('style');

if (style.styleSheet) {
    style.styleSheet.cssText = css;
} else {
    style.appendChild(document.createTextNode(css));
}

document.getElementsByTagName('head')[0].appendChild(style);
您将如何查找和编辑当前的样式表规则以更改它?这显示了添加一个新规则,但是如果已经有一个规则,并且只是一个值被更改了怎么办?
2021-03-14 14:14:36
为什么不知道新style元素是否已经有 styleSheet?
2021-03-20 14:14:36
:hover 是一个伪类,而不是伪元素。伪元素以双冒号开始,例如::after。/挑剔
2021-04-05 14:14:36
@Andi 不,因为stylekennebec 的答案中的变量是在代码中创建的新元素,并不指向<style>HTML 中的现有标记。
2021-04-09 14:14:36
如果您正在走这条路,这篇文章将来也可能会有所帮助。
2021-04-10 14:14:36

无法:hover通过 Javascript更改或更改实际选择器。但是,您可以使用mouseenter更改样式,然后恢复mouseleave(谢谢,@Bryan)。

我一直在过去的项目中使用它,甚至最近尝试了公认的答案,但是在使用带有彩色按钮的悬停/活动元素时,这个总是占上风。只想说感谢您将此作为选项发布。
2021-03-24 14:14:36
真的没有办法用 JavaScript 改变 :hover 选择器吗?
2021-03-25 14:14:36
请注意,您还需要绑定mouseleave才能反转效果。
2021-04-02 14:14:36

您可以做的是更改对象的类并定义两个具有不同悬停属性的类。例如:

.stategood_enabled:hover  { background-color:green}
.stategood_enabled        { background-color:black}
.stategood_disabled:hover { background-color:red}
.stategood_disabled       { background-color:black}

这是我在以下内容中发现的: 使用 JavaScript 更改元素的类

function changeClass(object,oldClass,newClass)
{
    // remove:
    //object.className = object.className.replace( /(?:^|\s)oldClass(?!\S)/g , '' );
    // replace:
    var regExp = new RegExp('(?:^|\\s)' + oldClass + '(?!\\S)', 'g');
    object.className = object.className.replace( regExp , newClass );
    // add
    //object.className += " "+newClass;
}

changeClass(myInput.submit,"stategood_disabled"," stategood_enabled");

很老的问题,所以我想我会添加一个更现代的答案。现在 CSS 变量得到了广泛的支持,它们可以用来实现这一点,而无需 JS 事件或!important.

以 OP 为例:

<table>
  <tr>
    <td>Hover 1</td>
    <td>Hover 2</td>
  </tr>
</table>

我们现在可以在 CSS 中做到这一点:

table td:hover {
  // fallback in case we need to support older/non-supported browsers (IE, Opera mini)
  background: #ff0000;
  background: var(--td-background-color);
}

并使用 javascript 添加悬停状态,如下所示:

const tds = document.querySelectorAll('td');
tds.forEach((td) => {
  td.style.setProperty('--td-background-color', '#00ff00');
});

这是一个工作示例https://codepen.io/ybentz/pen/RwPoeqb

很抱歉发现这个页面晚了 7 年,但这里有一个更简单的方法来解决这个问题(任意更改悬停样式):

HTML:

<button id=Button>Button Title</button>

CSS:

.HoverClass1:hover {color: blue !important; background-color: green !important;}
.HoverClass2:hover {color: red !important; background-color: yellow !important;}

JavaScript:

var Button=document.getElementById('Button');
/* Clear all previous hover classes */
Button.classList.remove('HoverClass1','HoverClass2');
/* Set the desired hover class */
Button.classList.add('HoverClass1');
JavaScript 提供了多种方法来处理多个操作,包括使用数组。
2021-03-28 14:14:36
这只是一个按钮吗?如果我想把这个效果添加到所有的按钮上怎么办
2021-04-01 14:14:36