保持项目中所有选择器的CSS专用性较低是一个值得追求的目标。 通常,这表明事物处于相对和谐状态。 您并不是在与自己作斗争,并且有足够的空间在需要时覆盖样式。 选择器的特异性会随着时间的流逝而逐渐增加,对此有一个严格的上限。 我敢肯定,我们所有人都感受到了!important标签和内联样式的痛苦。

那么,随着时间的流逝,我们如何保持低特异性呢?

给自己上课

也许您正在编写一个高专用选择器,因为您要覆盖一个已经存在的选择器。 也许您要选择的元素包含在多个页面中,因此您可以从较高级别的类中进行选择:

.section-header {/* normal styles */
}body.about-page .section-header {/* override with higher specificity */
}

无论您对此有何感受,都应认识到这里的特异性正在蔓延。 为避免这种情况,有没有办法改变您要直接设置样式的元素上的类名? 有时创建一些服务器端帮助函数或变量来发出类可能会有所帮助,以避免视图中的逻辑。

<header class="<%= header_class %>">Which could output one class, or both, as desired.
</header>
.section-header {/* normal styles */
}.about-section-header {/* override with same specificity *//* possibly extend the standard class */
}

考虑样式表的源顺序

沿着相同的尝试覆盖事物的脉络,也许您正在应用其他类名来为您处理样式覆盖。

<header class="section-header section-header-about"></header>

但是,使用.section-header-about编写覆盖样式的位置实际上已被现有类覆盖。 由于样式表中的选择器顺序,可能会发生这种情况。 两个选择器都具有完全相同的特异性,因此从宣布最后一个获胜者中选出的规则。

要解决此问题,仅需确保以后再写覆盖类。 也许组织您的样式表,例如:

@import "third-party-and-libs-and-stuff";@import "global-stuff";@import "section-stuff";@import "specific-things-and-potential-overrides";

降低您要覆盖的事物的特异性

您知道他们说的要比让他们发现更好的事情。 你应该那样做。

如果元素上有一个ID,而这正是它的样式,可以将其删除吗? 一定要在项目范围内搜索#that,然后再进行搜索。 它可能被用作JS钩子(完全可以),在这种情况下,您应该不理会它,或者添加一个类或将已经使用的类用于CSS。

不要回避上课的开始

我已经知道使用像这样的选择器:

.module > h2 {}

这样做会很好,直到他们今天想要该h2元素的特殊样式。 您可能会进入标记并像这样:

<div class="module"><h2 class="unique">Special Header</h2>
</div>

但可悲的是:

.module > h2 {/* normal styles */
}
.unique {/* I'm going to lose this specificity battle */
}
.module .unique {/* This will work, but specificity creep! */
}

由于原始选择器在咬我们,所以发生了特异性蠕变。 这就是几乎所有CSS方法学都建议采用扁平结构的原因:

<div class="module"><h2 class="module-header"></h2><div class="module-content"></div>
</div>

感觉起来像是更繁琐的前期工作,因为您可能不需要立即使用这些课程。 但是,通过避免这项工作(不要偷懒!),以后使用的钩子可以节省您的悲伤。

使用级联

随着项目的老化,改变具有特异性的选择器变得越来越危险,因为选择器可能会影响更多事物并产生意想不到的后果。

#im #just .gonna[do] .this .to .be #safe {/* cries (ಥ_ʖಥ) */
}

但是影响更多的事情是CSS的力量。 有了坚实的基础,就可以希望减少覆盖范围。 为此的策略可以是……

使用样式库和/或样式指南和/或原子设计

模式库( 类似这样的东西)可能意味着您有需要的东西。 需要一些标签吗? 在这里,这是执行此操作的既定方法。 而且它的构建方式很可能是特异性很轻,因此覆盖不会太困难。

原子设计 ( 书 )可以指导您构建网站(或模式库)的方式,因此,即使您没有所需的完整模式,也可以在其下方找到构建块。

样式指南可能会救您,因为它可能会强制执行有关特定性的特定规则,以使您免于自己。

考虑选择排版

同时,您尝试使用级联并为许多元素设置智能默认值,有时您可能希望对某些智能默认值进行范围划分。 例如,列表元素通常用于导航和内容内。 它们的样式将完全不同。 因此,为什么不从头开始, 只在需要时应用文本样式。

/* reset styles globally */
ul, ol, li {list-style: none;margin: 0;padding: 0;
}/* scope text styles to text content */
.text-content {h1, h2, h3 {}p {}ul {}ol {}/* etc */
}

这的确增加了这些文本选择器的特异性,但这意味着专门针对文本的规则所产生的影响并没有超出它们所需要的范围,并且对替代的需求也越来越少。

超出您控制范围的问题

也许某些第三方代码期望或将某些HTML注入您的页面。 您必须使用它。 您仍然可以尝试使用尽可能低的特异性选择器。 您可以在代码中留下注释,以指示选择器为何如此。 您可以使用低特异性选择器,但可以使用!important覆盖。 您可以询问负责非理想代码的人员是否可以解决它。

仅轻轻地提高特异性,并注意

如果您需要进行专一性战斗,而不是去尝试像ID​​或!important这样的大锤,可以尝试一些更轻松的事情。

标签限定符是最低可能的特异性升级。

ul.override {/* I win */
}
.normal {
}

但是将选择器限制为特定标签是一个奇怪的限制因素。 明智的做法是只添加一个附加类。 如果另一个名称没有意义,则根据需要甚至可以使用相同的类。

.nav.override {
}
.override.override {
}
.nav {
}

仅仅因为嵌套很好,并不意味着必须提高特异性

有时不建议在预处理器中进行嵌套,因为这样可以轻松编写过多的选择器。 但是嵌套有时在样式表中看起来很漂亮,因为它可以将内容组合在一起,从而更易于阅读和消化。

Bohdan Kokotko最近提醒我,Sass中的&符实际上可以用于命名间隔,而不是复合选择器。

.what {color: red;&-so {color: green;&-ever {color: blue;}}
}
.what {color: red;
}
.what-so {color: green;
}
.what-so-ever {color: blue;
}

单类包装器

处理覆盖的一种相当有力的方法是在需要将样式覆盖应用于或添加新覆盖元素的区域上使用现有的包装元素。

<div class="override">... existing stuff ...</div>

现在,您只需在选择器中添加一个类即可覆盖其中的任何现有样式。 这是专一性,但试图将其保持在较低水平。

.override .existing {
}

只有一次

如果您要覆盖替代项,那么这是一个停止并重新考虑的好地方。

您可以只给自己一个类供您使用吗? 单个替代实际上可能是有效的,就像对模式进行变体而不是创建新模式一样。 超越会导致混乱和进一步战斗。

下次再做就更好

如果您一直被特异性问题所困扰,即使立即解决这些问题都不切实际,至少您现在已经知道这是有问题的,下次可以采取不同的方法。

翻译自: https://css-tricks.com/strategies-keeping-css-specificity-low/

降低CSS特异性的策略相关推荐

  1. CSS 特异性看这篇就行了

    CSS 特异性 背景:在我每次画界面的时候,总会出现样式冲突.样式污染.一级很多样式改不掉的问题.所以总结一文来彻底搞懂css样式的特异性,方便你我他. 什么是css特异性? 如果有多个属性或者选择器 ...

  2. 什么是CSS特异性及其工作方式?

    使用CSS时,样式冲突可能会给您带来麻烦,尤其是当您不知道冲突的来源时. 本教程将使您对CSS的特性有深入的了解,这将有助于填补任何知识空白,从而最终不会使您摆脱沮丧. 注意 :也许您是经验丰富CSS ...

  3. (42)css特异性

    一.什么是特异性? 如果有两条或两条以上指向同一元素的冲突 CSS 规则,则浏览器将遵循一些原则来确定哪一条是最具体的,并因此胜出. 将特异性(specificity)视为得分/等级,能够确定最终将哪 ...

  4. CSS 特异性 specificity

    什么是特异性? 如果有两条或两条以上指向同一元素的冲突 CSS 规则,则浏览器将遵循一些原则来确定哪一条是最具体的,并因此胜出. 将特异性(specificity)视为得分/等级,能够确定最终将哪些样 ...

  5. css零到一中级教程025:CSS 特异性

    什么是特异性? 如果有两条或两条以上指向同一元素的冲突 CSS 规则,则浏览器将遵循一些原则来确定哪一条是最具体的,并因此胜出. 将特异性(specificity)视为得分/等级,能够确定最终将哪些样 ...

  6. 【译】CSS 自定义属性的策略指南

    原文地址: www.smashingmagazine.com/2018/05/css- 译文地址: github.com/yued-fe/y-t- 译者: 波波 校对者: ziven27. 小爷 关于 ...

  7. CSS特异性——优先级

    http://www.w3.org/TR/CSS2/cascade.html#specificity 特异性 选择器的特异性由 CSS2 规范定义如下: 如果声明来自于"style" ...

  8. 特异性敏感性的意义_敏感性特异性和有意义的分类

    特异性敏感性的意义 How do we evaluate how well a machine learning classifier or test model performs? How do w ...

  9. css后代选择器:nth_CSS选择器:特异性

    css后代选择器:nth The following is an extract from our book, CSS Master, written by Tiffany B. Brown. Cop ...

最新文章

  1. Maven实战:Maven生命周期
  2. ubuntu安装protobuf
  3. PyQt - 维基百科,自由的百科全书
  4. Vue中使用can-autoplay插件实现浏览器不支持自动播放音频时提示点击
  5. 学习Linux就业前景如何?五大就业岗位!
  6. 36 FI配置-财务会计-应收账款和应付账款-为供应商定义备选统驭科目
  7. 汇编语言ax=0c58ch,第4章89C5汇编语言程序设计.ppt
  8. Python求解啤酒问题(携程2016笔试题)
  9. 计算机关闭后剪切板的内容会消失,关闭计算机电源后剪贴板的信息为什么会丢失...
  10. html 图片旋转插件,jQuery插件expander实现图片翻转特效
  11. Proteus8.6软件安装教程
  12. python 爬取直播_Python爬取直播视频
  13. 编译原理(龙书第二版)--怎么求FOLLOW集
  14. Ralink SDK相关指令总结
  15. 5.登录注册找回密码
  16. 解决 OneNote 项目符号快捷键 Ctrl+. 在 Windows 10 下无效问题
  17. 《数独游戏的设计与实现》
  18. 中国自然地理分区数据集 (含农业区划、森林工程、生态保护区、九大流域等)
  19. 金融之期货软件搭建,股票平台搭建,融资融券平台搭建
  20. jquery点击图片放大,再点缩小(转)

热门文章

  1. 硬件设计——外围电路(电源电路)
  2. 堡垒机、运维堡垒机、开源堡垒机、云堡垒机全面解析
  3. 周大侠歌曲计算机,周大侠 周杰伦 周大侠歌曲,周大侠mp3在线试听 - 5nd音乐网
  4. 计算机如何取消自动关机,电脑怎么取消自动关机【处理形式】
  5. vue+js 从一个数组中删除在另一个数组中已存在对象;
  6. JAVA知识体系之分布式篇(七)——Redis
  7. node mocha_使用Mocha和Chai测试Node RESTful API
  8. linux系统安装报firstboot错,自动安装部署LINUX
  9. Vue--keep-alive--详解
  10. html手机点赞图标素材,微信点赞心形图标,微信点赞分享心形图标素材