使用JS写CSS会取消样式表中定义的:hover属性

Using JS to write CSS will cancel :hover properties defined in stylesheet

我有两个 div。一个是另一个的parent。当我将鼠标悬停在 parent 上时,child 会获得不同的背景颜色和字体颜色。但是,当我 运行 函数 switch() 更改 child 元素的内联样式时,悬停属性被取消。换句话说:在使用 JS 应用 CSS 后,悬停时 child 背景不会改变。

document.querySelector('button').onclick = function() {
  document.querySelector('.foo').style.backgroundColor = 'green';
}
.container {
  background-color: lightgrey;
  margin: auto;
  width: 200px;
  display: flex;
  align-items: center;
  height: 50px;
}
.foo {
  width: 100px;
  margin: auto;
  text-align: center;
}
.container:hover > .foo {
  background-color: #c01919;
  color: yellow;
}
<div class="container">
  <div class="foo">Hey there!</div>
</div>

<button>.foo(backgroundColor) -> green</button>

真正的问题是如何防止内联样式取消 CSS :hover properties?

在函数影响了内联样式后,有没有办法在鼠标悬停时使背景颜色变为红色

The real question is how to prevent inline style from canceling CSS :hover properties?

如果不使用 !important(这很糟糕,所以不要),你不能。内联样式的要点在于它比任何选择器都更具体。

停止使用内联样式。在样式表中设置绿色,然后使用 JavaScript 更改元素所属的 类 来激活它。

document.querySelector('button').onclick = function() {
  document.querySelector('.foo').classList.add('bar');
}
.container {
  background-color: lightgrey;
  margin: auto;
  width: 200px;
  display: flex;
  align-items: center;
  height: 50px;
}
.foo {
  width: 100px;
  margin: auto;
  text-align: center;
}
.bar {
  background-color: green; 
}
.container:hover > .foo {
  background-color: #c01919;
  color: yellow;
}
<div class="container">
  <div class="foo">Hey there!</div>
</div>

<button>.foo(backgroundColor) -> green</button>

内联样式比样式表或 <style> 标记中定义的样式具有更高的权限,除非在规则定义中使用了 !important。您的用例看起来不是使用内联样式使按钮变绿,而是添加 class(也许 is-clicked)会更好。然后你会防止丑陋的内联样式,有一个语义 class 命名并且用 css.

覆盖那个样式没有问题
document.querySelector('.foo').classList.add('is-clicked');

注意:class(非常)旧的浏览器不支持列表。根据目标受众,我会说可以使用:http://caniuse.com/#search=classlist