如何阻止用户代理样式表覆盖我的CSS

B T*_*B T 38 css firefox google-chrome

我正在尝试将光标:指针设置在dom元素上,但是输入没有接受它(当我将鼠标悬停在复选框上时,我没有看到指针光标).在chrome中,我看到"用户代理样式表"覆盖了我的CSS.跆拳道?

<!doctype html>
<body>
    <div class='a'>
        <input type='checkbox'>
    </div>

    <style>
        .a {
            cursor: pointer;
        }
    </style>
</body>
Run Code Online (Sandbox Code Playgroud)

我已经看到了这个问题:为什么用户代理样式表会覆盖我的样式?但我的问题似乎不是doctype,这是推荐的doctype.

!important在这里使用是不可接受的,也没有直接为输入节点设置样式 - 我不必担心奇怪的浏览器useragent样式.这是怎么回事?

为了澄清,我的问题是关于为什么用户代理样式表是压倒一切的CSS以及如何使停止.我的问题不是我如何破解这种行为.如果我没弄错的话,css的正确行为是游标样式应该由子节点继承.

这是css的预期行为吗?

Bet*_*aba 20

"问题"这里原来有没有input在作者样式表样式(见规范获取更多信息),因此该风格用于在用户代理样式表中定义.

(相关)用户代理规则(在chrome上)是:

input, input[type="password"], input[type="search"] {
   cursor: auto;
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下几种方式实现您的目标:

  1. 例如,创建一个直接选择输入的css类
    • 使用另一个css类,或
    • 在已经定义的类中选择输入,
    • 等等
  2. 在所有输入上显式设置游标样式的继承行为

对于(1):

<style>
  .a, .a input {
      cursor: pointer;
  }
</style>
Run Code Online (Sandbox Code Playgroud)

对于(2):

<style>
  input {
      cursor: inherit;
  }
  .a {
      cursor: pointer;
  }
</style>
Run Code Online (Sandbox Code Playgroud)

  • 我理解这是可行的,但在我的问题中,我明确声明这不是我想要的答案类型。您是否暗示这就是用户代理样式表*应该*工作的方式?规范中这些样式表的优先级似乎意味着不应覆盖它:http://stackoverflow.com/questions/13638038/style-sheets-priority-order (2认同)
  • @BT 这就是 CSS 的工作原理,这是您将得到的唯一答案。如果您的规则与用户代理的特定级别相同,则您的自定义 css 将比用户代理具有更高的优先级。如果没有,最具体的总是“赢” (2认同)
  • 啊我明白了。这就是我一直在寻找的那种答案。非常不幸的是,用户代理样式表规则可能会像这样弄乱您自己的样式。介意编辑您的答案以将其作为主要回复吗? (2认同)
  • @BT编辑。实际上,这是IMO的理想行为。如果在主体上设置边框,则我不希望其中的每个元素也都具有边框。 (2认同)
  • 所以实际上,“border”默认没有继承行为,而光标有。这里的问题实际上不是特异性水平。事实上,作者样式表根本没有“输入”样式,因此用户代理样式就是“输入”的全部。那就是问题所在。如果您不介意,我想编辑您的答案以更清楚地说明问题,并纳入我想到的解决方法,以便我可以接受这个答案。 (2认同)

B T*_*B T 6

看起来这可能只是 css 是 css,这是不幸的。我能想到的最通用的解决方法是定义这个 css:

<style>
  input {
    cursor: inherit;    
  }
</style>
Run Code Online (Sandbox Code Playgroud)

这允许我最初预期在用户代理会导致样式无法继承的所有情况下发生的行为。这比直接使用“cursor:pointer”设置输入样式更好,因为您只需要设置一次这种样式,并且任何包含输入的“cursor:pointer”样式的 domNodes 都会自动让输入具有指针光标。


Kes*_*hav 6

一般来说,通过详细阐述解释来回答这个问题,我想说,根据这篇文章,css属性的最终值是四步计算(即规范、计算、使用和实际)。

在规范中,级联优先于继承

由于 ,您没有任何输入的 css 属性,因此应用于输入的用户代理样式表优先于从类 a 继承的值。为了使用继承的值,您应该使用 @B T 建议的代码进行覆盖。即。

<style>
  input {
    cursor: inherit;    
  }
</style>
Run Code Online (Sandbox Code Playgroud)

级联解释:

简要说明
详细说明

我在这里引用详细解释 -
控制 CSS 声明应用顺序的三个主要概念:

  1. 重要性
  2. 特异性
  3. 来源订单

CSS 声明的重要性取决于它的指定位置。冲突的声明将按以下顺序应用;后面的将覆盖前面的:

  1. 用户代理样式表
  2. 用户样式表中的普通声明
  3. 作者样式表中的普通声明
  4. 作者样式表中的重要声明
  5. 用户样式表中的重要声明

特异性和来源顺序与这个问题无关,您可以参考上面的参考文献以获取相同的解释

在上面的代码中,由于您只有直接与元素绑定的用户代理样式表,因此优先。

简而言之,继承<级联<重要性<用户代理样式表是您的情况的优先顺序。