【问题标题】:CSS selector priority from different stylesheet files来自不同样式表文件的 CSS 选择器优先级
【发布时间】:2016-10-25 01:02:35
【问题描述】:

我有一个带有 input 和 textarea 元素的表单的页面。我正在使用引导程序和我自己的 site.css。 site.css 在标记中的 boostrap.css 之前。我在站点 css 中有一个 css 规则,如下所示:

.formcontainer input, textarea {
    background-color: lightgray;
}

表单元素还应用了来自引导程序的表单控制类。问题是输入元素优先考虑我的站点 css 中的规则并正确应用背景颜色。但是,对于 textarea 元素,引导类优先于我的 site.css 中的规则。所有表单元素都包装在相同的 div 容器中,并应用了相同的类。我无法理解为什么元素以不同的方式获得规则的优先级。

这是一个标记示例,其中输入获取背景颜色但文本区域没有:

<div id="formpart2" class="formcontainer">
    <div class="form-group">
        <label class="control-label visible-ie8 visible-ie9">Email</label>
        <div class="input-group">
            <input type="text" class="form-control invalid" fieldrequired>
        </div>
    </div>
    <div class="form-group">
        <label class="control-label visible-ie8 visible-ie9">Contact Instructions</label>
        <div class="input-group">
            <textarea type="text" class="form-control" rows="10" cols="15" fieldrequired></textarea>
        </div>
    </div>
</div>

【问题讨论】:

  • 我在使用 Bootstrap 时遇到过一些类似的事情。它来自 CSS 属性 '!important'。这可以添加到级联列表中的样式中,并且在向下工作时不会被覆盖。 Bootstrap 有一些被标记为重要的东西,因此具有优先权。尝试添加您自己的 !important。这是一个小提琴的例子。 jsfiddle.net/0fqsm8jq
  • @Dean You 不要使用!important。你的建议真的很糟糕,我的意思是 really 。确实存在使用!important 合法的情况。我敢打赌你从来没有遇到过他们中的任何一个。建议使用 !important 解决 CSS 加载优先级问题是您可能给 OP 的最糟糕的建议。
  • @HisDivineShadow 你可能想要这个选择器而不是.formcontainer input, .formcontainer textarea { ... }。否则,您的规则针对任何input 元素,它是类.formcontainer 的元素和元素的后代,除此之外,任何文本区域(此处不需要具有特定类的父级)。另请注意,这会使 textarea 的规则不太具体。
  • 我考虑过使用 !important 但决定不使用它。这真的是一种懒惰的黑客/最后的手段。
  • @connexo 你说对了,我的语法错了。您应该将其作为答案提交。

标签: css twitter-bootstrap


【解决方案1】:

site.css 在标记中的 boostrap.css 之前。

你的问题。 CSS 的工作方式是,稍后出现的规则(在一张纸内或包含多张纸)将覆盖出现在它们之前的规则。切换您的标记,使您的自定义样式排在最后 - 即,包括 bootstrap.css before site.css

(另外,请记住 textarea 是一个非常通用的选择器。您的意思是 .formcontainer textarea 吗?)

【讨论】:

  • 这并没有解释为什么它为输入元素选择我的(即 site.css)规则,但不为 textarea 元素选择。另外,从我的规则中可以看出,我使用的是.formcontainer textarea
  • 我想我现在明白了(因为@connexo 的评论)你所说的关于 textarea 选择器的内容。
【解决方案2】:

css 引擎总是优先于.class#id 而不是tag-name。您的样式的问题是,您正在使用标签名称textarea,它有一个类form-control 来设置样式。因此,css 引擎将优先考虑.form-control 而不是tag-name。请参阅以下示例。

行不通

.formcontainer input,
textarea {
  background-color: lightgray;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<div id="formpart2" class="formcontainer">
  <div class="form-group">
    <label class="control-label visible-ie8 visible-ie9">Email</label>
    <div class="input-group">
      <input type="text" class="form-control invalid" fieldrequired>
    </div>
  </div>
  <div class="form-group">
    <label class="control-label visible-ie8 visible-ie9">Contact Instructions</label>
    <div class="input-group">
      <textarea type="text" class="form-control" rows="10" cols="15" fieldrequired></textarea>
    </div>
  </div>
</div>

会起作用

input.form-control,
textarea.form-control {
  background-color: lightgray;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<div id="formpart2" class="formcontainer">
  <div class="form-group">
    <label class="control-label visible-ie8 visible-ie9">Email</label>
    <div class="input-group">
      <input type="text" class="form-control invalid" fieldrequired>
    </div>
  </div>
  <div class="form-group">
    <label class="control-label visible-ie8 visible-ie9">Contact Instructions</label>
    <div class="input-group">
      <textarea type="text" class="form-control" rows="10" cols="15" fieldrequired></textarea>
    </div>
  </div>
</div>

希望这会有所帮助!

【讨论】:

  • 感谢 Pranesh,这也是一个很好的答案,并提供了一个很好的替代解决方案。
【解决方案3】:

在 Bootstrap 中,您可能会发现一条以这样开头的规则:

.formcontainer input, 
.formcontainer textarea {
    /* whatever */
}

在您尝试覆盖时,您忘记了 textarea 的上下文:

.formcontainer input, 
textarea {
    background-color: lightgray;
}

这使您的 textarea 规则不如 Bootstrap 的规则具体,因此即使您以正确的顺序加载 css 文件,您的 textarea 样式也不会覆盖 Bootstrap 的 textarea 样式(假设您在 .formcontainer 上下文中)。

我强烈建议您了解有关CSS specificity 的更多信息。 非常如果你想使用 CSS 的话。

【讨论】:

  • Bootstrap 定义了 form-control 类,它覆盖了我的规则,因为我没有正确格式化我的规则选择器(它需要采用您的第一个规则的格式定义)。再次感谢。
猜你喜欢
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 2010-12-10
  • 1970-01-01
  • 2011-11-01
相关资源
最近更新 更多