CSS专用性的最佳实践?

CSS专用性的最佳实践?,css,performance,conflict,css-specificity,Css,Performance,Conflict,Css Specificity,我正在创建,将包括在几个不同的网站 联系方式的风格和网站的风格都将包括在内,我不能很好地预测网站的风格。我希望联系人表单的样式很容易被网站的样式过度控制,但我不希望联系人表单的样式被意外过度控制 例如,如果站点开发人员想要更改submit按钮的颜色,那么不需要使用就可以轻松完成!重要的或某些过于特定的id#id元素。类#id元素。类选择器类型 但是,另一方面,如果站点开发人员使用诸如input{background:yellow;}或#site wrapper input{background:

我正在创建,将包括在几个不同的网站

联系方式的风格和网站的风格都将包括在内,我不能很好地预测网站的风格。我希望联系人表单的样式很容易被网站的样式过度控制,但我不希望联系人表单的样式被意外过度控制

例如,如果站点开发人员想要更改submit按钮的颜色,那么不需要使用
就可以轻松完成!重要的
或某些过于特定的id#id元素。类#id元素。类选择器类型

但是,另一方面,如果站点开发人员使用诸如
input{background:yellow;}
#site wrapper input{background:yellow;}
之类的选择器编写样式,我不希望它过度控制引用类的联系人表单样式


所以我的问题是,在这种情况下,最好的做法是什么?我想在我的表单上添加一个ID,并将其添加到每个选择器中,这样我的选择器就会变成
#contactform.contact_input{background:white;}
,我认为这可以避免冲突,但我想知道是否有更好的方法,因为这在页面呈现方面似乎有点不太有效。也许这没什么大不了的,但我只是想把它扔出去,看看人们怎么想。

你最好的办法是使用类似于以下内容的模式:

input.JSCF_formInput{
   color: white !important;
   ...
}
这样,您的样式是独特的{JSCF for Josiah Sprauge Contact Form}和特定的,并指定为重要的

#站点包装器输入{background:yellow;}
[…]我不希望它超过规则 我的联系人表单样式引用 类,
.contact_input{background:white;}

如果使用这些选择器,则基本上不能:
#id
s比
.class
es更具体,仅此而已。
我建议您删除第一条规则中的
#站点包装器
选择器位,因为它是通用的

这是一个非常困难的原因,选择器本身和它在工作表中的位置都很重要。而且,事实上,没有一种真正的CSS编写方法是没有帮助的

我想最好使用ID和标记选择器。另外,请使用属性选择器:

#contact-form input { ... }
#contact-form input[type=email] { ... }
#contact-form select { ... }
input  { ... }
select { ... }
但是,您应该提到,强烈建议将该表放在其他表的顶部,例如:

<link type="stylesheet" href="/styles/contact-form.css" />
<link type="stylesheet" href="/styles/main.css" />
这些选择器弱于
#联系表单输入
,因此它们不会覆盖任何内容。然而,有时有必要重写一些规则,以便开发人员使用
#contact form input
选择器,这在这种情况下非常自然


如果图纸已作为建议附加,则表示开发人员的样式将覆盖您的样式,尽管两者都具有完全相同强度的选择器。这就是为什么规则的位置很重要。

我想您应该采用某种“名称空间”模式

例如,使用
#ds#u contactform
开始所有样式,并尽可能使它们具体化,而不影响语义和方便地维护代码

我不认为使用特定的选择器(带有一个#id或几个id)是无效的


另外,我还推荐安迪·克拉克的精彩文章。

我想你已经回答了你自己的问题:

#contactform.contact_输入{背景:白色;}


CSS

如果您使用!重要的是,它将始终覆盖有关ID或类的样式。查看此链接的更多信息

你可以看看这个链接,以获得更多关于特异性的信息;

你可以考虑使用方法论,它有非常棒的类命名风格,它在很多方面解决了特殊性问题。

我使用独特的类,我想我的例子是坏的。实际上,我正在使用.ds\u contact\作为我的类的前缀。唯一的问题是,还有一些站点样式,比如#包装器输入{},会凌驾于此。我不是编写#站点包装器选择器的人。基本上有~4k的站点已经有了这样的选择器,我正试图避免与这些规则发生冲突。(一夜之间重写4k网站的样式表是不现实的。)谢谢。这是迄今为止最好的答案。我非常理解级联和特异性,但我相信这个解释会对一些人有所帮助。正如我前面提到的,我可能会选择像“联系人表单输入”这样的选择器,但我想看看其他人怎么说。不幸的是,我认为在这种情况下,我不太容易控制样式表的顺序,但这是我忘了考虑的一个很好的问题。不幸的是,谷歌PigSPEED将不同意这些选择器效率低下的观点。另外,当多个开发人员在同一个项目上工作时,让选择器“尽可能具体”通常是一个坏主意,因为这会变成一场特殊性之战,其中一个开发人员试图超越其他人的规则,很快你就会得到一堆杂乱无章、无法维护的样式表!重要的声明和低效的选择器。这就是我想要避免的。如果你合并了一个块,它应该是独立的,这并不是很糟糕。从你的问题中我了解到联系方式实际上是一个独立的模块。谢谢你的PageSpeed参考资料。我会仔细看的。好问题,我自己的样式表和边距有这个问题,我一直在用divIf中的一个样式元素来伪造它!重要的是,没有人可以推翻我的风格。在大多数情况下!重要信息只能作为最后手段使用,如果有的话。