最近看了国内某位前端工程师今年出版的新书,其中讨论CSS的部分提出了一些观点,罗列如下:
1. 用class命名表现从属关系,如.myList-lastItem(表示.myList列表中的最后一项);
2. 团队开发中用工程师名字作为前缀区分是谁写的样式,如.hax-list(表示是hax写的一个样式规则);
3. 前两者结合可能产生较长的class名,如hax-subNav-item-select,但作者认为利大于弊;
4. 推荐挂多个class,特别是挂若干个“通用原子类”(即通常只包含单个样式规则的class,如对应font-size:12px的.f12),比如<div class="f12 red box">;
5. 为了避免margin-top/margin-bottom可能的紧凑处理,建议不写margin,而是在标签里附加设置margin的原子类(如.mt10、.mb20),并且不要混用;
6. 为保证样式容易覆盖,CSS选择器要specifity尽量低,所以就需要有多个单class选择器的样式规则定义,然后元素上绑定多个class。
很遗憾,这些围绕class产生的实践,都是我称之为“Anti-Pattern”的东西。
我们必须时刻牢记class属性的作用。它的最佳用途是对标签语义的细化。凡是违反这一条的,都是不推荐的用法。HTML5规范这样说:
...authors are encouraged to use values that describe the nature of the content, rather than values that describe the desired presentation of the content.
在上述所有这些“问题实践”中,最根本的源头其实就是所谓“通用原子类”,也就是类似我之前
批评过的MetaCSS的做法。显然,“通用原子类”正好是HTML5规范里所说的描述呈现效果而不是描述内容的性质。这个问题这里不再赘述,可看我之前的
评论。
这里要剖析的是另外几条。
首先说第6条。为什么希望specifity低呢?其实这里的因果关系被悄悄的倒置了。并非是因为要specifity低所以要多class,而是倒过来——因为第4条——希望在一个元素上绑定多个“通用原子类”,所以才要specifity低!
正如我以前指出过的,<li class="f12 red">实际的意图是<li style="font-size: 12px; color: red;">,也就是f12和red是inline样式的缩写,所以不希望被其他样式(比如.myList li里的规则)所覆盖。问题是.f12和.red的实际specifity相当低,很容易就可被覆盖。结果就出了这样削足适履的一条,要求specifity低。并且实际上就是鼓励退化为只用单一的class selector。这样一个是不鼓励写出.myList li这样的规则,此外因为都是简单的单class规则,那么一个元素最终的样式就非常一目了然,因而很容易倒过来确保“通用原子类”不会被覆盖。
实际上回过头来想想,抽象的要求“样式容易被覆盖”本来就是很奇怪的。CSS之所以叫CSS,其独特之处就是cascade机制。退化到都是平级的单class规则定义,实际上就丧失了CSS的的power。
再说第1条。之所以要在class里表现从属关系,表面上是为了避免团队合作中的冲突——比如认为有人会直接更改.lastItem的样式,而影响.myList .lastItem的样式,但实际上这个原因是很牵强的。为什么有人会直接去改.lastItem的样式,而不是写.otherList .lastItem的规则?作者的原话是“如果多人合作,工程师B可能习惯直接使用.lastItem”。但是这是什么“习惯”呢?作者就没说。其实你知道了,还是因为“通用原子类”,及由此导致的第6条。大量使用“通用原子类”的后果其实就是
习惯于退化到都是平级的单class规则定义,也就是classitis(多class症)。
注:其实就算用“通用原子类”或MetaCSS,让其回归为inline style的缩写形式这样一种本源,本来是有更好的方式来避免specifity问题的。你想到没有?
然后说一下第5条。margin是一个有用的特性,当然前提是使用者了解文本排版中margin的意义。这里作者却只是视其为麻烦。这其实只说明了一点,那就是作者不知道margin的用途,或者认为margin的用途是无聊的——比如只关心最终样式的呈现,而不管设计意图。
所以这里一个需要考虑的问题是,CSS的可维护性从哪里来的?如果所有HTML和CSS每次都是全部推倒重来(许多公司的改版大概就是这样的),那么去关心和维护设计意图确实是没用的。这里根本不存在“维护”。否则,如果我们认为设计会逐步演化和发展(并且与文档内容和结构具有一定的独立性),那么显然真正反映设计意图的CSS会更具有“可维护性”。
最后,剩下2条,关于开发者名字作为class前缀的做法,请读者自行考虑。
分享到:
相关推荐
标题中的“css样式表兼容总结,兼容火狐,ie6,ie7,FF”指的是在网页设计中,CSS样式表需要处理不同浏览器之间的...同时,尽量遵循Web标准和最佳实践,减少对特定浏览器的依赖,有助于创建更跨平台和跨浏览器的网页设计。
标题中的“css_hack_testing”指的是一个专门用于测试和研究CSS Hack的项目,这通常是为了应对不同浏览器对CSS样式解析的...同时,也提醒我们始终关注最佳实践,尽量避免过度依赖hack,保持代码的可维护性和可读性。
- **持续学习与跟进**:Web技术不断更新迭代,保持学习,关注最新的标准和最佳实践,有助于更有效地解决浏览器兼容性问题。 总之,解决浏览器兼容性问题需要开发者具备扎实的HTML、CSS基础,了解各浏览器的特性,...
#### 解决方案与最佳实践 - **标准化CSS代码**:使用如`Normalize.css`这样的工具来重置浏览器默认样式,减少不同浏览器间的样式差异。 - **条件注释与特征检测**:通过条件注释(例如`<!--[if lt IE 9]>`)来为...
浏览器兼容性问题一直是Web开发中的一个棘手挑战。随着W3C推动标准的实施,Firefox、Chrome、Safari...通过不断学习和实践,开发者可以掌握应对各种兼容性挑战的策略,让自己的网页在所有浏览器中都能展现出最佳效果。
然而,这种方法并不总是最佳实践,因为它可能会导致代码的可读性和维护性降低。随着浏览器更新和新标准的采纳,现代的开发实践中更倾向于使用条件注释、前缀或者使用特性检测库(如Modernizr)来解决浏览器兼容性...
根据给出的文件信息,我们可以了解到以下几个关键知识点: ...在实际应用这些特效脚本时,开发者需要注意兼容性和现代网页开发的最佳实践,以确保脚本在当前的网页环境中正常工作并具有良好的用户体验。
10. **性能优化**:为了避免上述问题,开发者通常会采用一些最佳实践,如使用事件委托减少DOM操作次数,避免阻塞UI线程,合理设置定时器间隔,及时释放资源等。 总的来说,"浏览器毁灭者"这个例子提醒我们,虽然...
为了提升用户体验,你可以学习并应用一些前端开发的最佳实践,如使用 Immediately Invoked Function Expression (IIFE) 避免全局变量污染,或者引入Linting工具(如ESLint)来检查代码质量。 最后,了解如何使用...
如果"供应2"涉及这些库或框架,那么开发者需要熟悉它们的API和最佳实践。 在实际项目中,"供应2"可能还包括了模块化和打包工具的使用,比如Webpack或Parcel。这些工具能够帮助组织代码、处理依赖、优化资源,使得...
在Web开发中,HTML通常与CSS(Cascading Style Sheets)和JavaScript一起使用,形成所谓的"前端三剑客"。CSS负责样式和布局,JavaScript则处理交互性和动态功能。如果QuestRale.VirtueOne.gaxHx8V是一个Web应用,...
6. **安全最佳实践**:在项目中,如果因为某些原因不使用Git,可能需要寻找替代方案,如SVN或其他版本控制系统。同时,应当遵循安全最佳实践,比如使用HTTPS而不是HTTP来保护数据传输,定期更新依赖,以及对敏感信息...
7. 最佳实践:在设计Web界面时,为确保最佳的用户体验和视觉效果,可以优先使用Web安全色,尤其是在面向需要兼容老旧设备的项目时。同时,使用现代工具设计时,还应考虑色盲用户的需求,确保颜色搭配的可访问性。 ...
控制台中显示的任何linting错误(如ESLint)或警告都是为了帮助开发者遵循最佳实践和避免潜在问题。此外,应用会在浏览器中打开,让用户可以直接交互,体验实际的用户界面。 结合【标签】"JavaScript",我们可以...
### 将样式表放在页面顶部的重要性 在网页开发过程中,为了优化浏览器的渲染性能,一个重要的实践就是将样式表(CSS文件或者内联样式)放置...开发者应该遵循相关的最佳实践和标准,合理组织和管理页面中的样式信息。