编写可维护性CSS之二,语义化

这是一个系列,谈论所有有关编写可维护性CSS。
翻译自:MaintainableCSS
完整版:maintainablecss-cn/chapters/semantics/

译者:
Owen Yang
Bang Wu

概述: 基于这 什么命名,而不是基于它 什么或 能做 什么命名。

长版本解释

语义化(semantic)的 HTML 不仅仅关乎我们所使用的元素——你当然知道一个链接应该使用 <a> 标签,表格数据应该使用 <table> 标签,段落使用 <p> 等等。

更重要的是,它和我们所添加的类名(class names)和IDs有关。而类名和IDs为 CSS 和 JavaScript提供额外的机制,让我们更容易去操作和增强 HTML 元素。

很容易出现不经过思考而随意添加类名的场景,但现实中命名却又特别重要。

“在计算机科学领域,有两大难题,如何让缓存失效(cache invalidation)和如何给各种东西命名。”

— <cite>Phil Karlton, 网景架构师</cite>

这是由于人只是擅长和人沟通,却不太能理解简短的,不具有语义化的抽象概念。

类名好坏对比

试着找出非语义化和语义化类名的区别...

  <!-- 不好 -->
  <div class="red pull-left">
  <div class="grid row">
  <div class="col-xs-4">

这里完全看不出这段 HTML 代码要表达 什么。你 可能 会说它 看起来 怎样(比如应该在小屏幕还是大屏幕上),但也就仅此而已。

  <!-- 好 -->
  <div class="header">
  <div class="basket">
  <div class="product">
  <div class="searchResults">

这段代码就正是我所推崇的。我很清楚地知道这段 HTML 代表着什么。虽然我不知道它看起来应该是怎样的,但我并不在乎,这是 CSS 存在的价值。而语义化的类名对 HTML 和 CSS 甚至 JS 都很有意义。

所以,为什么 我们应该使用语义化的类名呢?

因为更容易理解

若使用语义化类名,不论你是在修改 HTML 或者 CSS,你都清楚你将造成的影响。而使用视觉化类名(visual class names)的方式,你不得不在每一个元素上写很多类名,最终你可能只是对这些类名有一个模糊的理解,而不清楚它真正的意图是什么。而且,视觉化类名非常难以维护。

因为要构建响应式站点

一般说来,不同的视图(viewport)会有不同的样式。比如,你可能需要在大屏上浮动(float)一个元素,在小屏不浮动。如果你有一个叫 .clearfix 的类名来清理浮动,但在小屏上的效果却和类名不一样,这看起来会不会让人困惑呢?

使用语义化的类名,你就会基于 mediea queries 去编写样式,这会让 CSS 更易维护。

因为更容易查找

如果一个元素是基于其外在表像命名,比如 .red, .clearfix, 和 .pull-left 等,那么这些类名就会像垃圾一样散落在代码库的任何地方——当你搜索一段特定的 HTML 代码的时候,类名不会起任何作用。

换句话说,如果你的类名足够语义化,搜索特定代码片段是很简单的事。更常见的是,当你从头搜索你的 HTML(想像一下浏览器上的审查元素)去找类名的时候,查找唯一的 CSS 选择器肯定会快很多。

因为不想做无故的回归测试

如果你使用描述性的,非语义化的类名,那么当你修改其中一个类名的时候,样式的改变会影响每一个使用这个类名的元素。基于你使用 CSS 的经验,你能保证你的修改不会在其他地方产生不可预知的问题吗?

语义化的类名是唯一的,所以当你编辑其中一个的时候,你 自信地说,你的修改只会影响你想要改变的那个模块,维护起来更简单。

因为不用再恐惧更新代码

和前一个有关回归测试的那一点有关,当你对修改的代码不够自信的时候,你很有可能会造成 BUG 接着便会由于害怕出错而不再碰那些代码。更可怕的是会造成恶性循环,写很多冗余代码,最后变得越来越不具有可维护性。

因为有助于自动化测试

自动化功能测试需要定位特定的元素,与其进化交互(输入文本,点击按钮、链接等等),基于这些操作进行相关校验。

若你的 HTML 通篇都使用描述性的类名,那么你将不会有一个可靠方式去定位一个特定的元素,更惶论与其交互了。

因为为JavaScript提供了有意义的接口

就像和自动化测试一样,语义化的类名对JavaScript来说同样有意义。描述性的类名不具有可靠性,不可用于定位相应的模块或组件。

因为常规维护的担心

若你是基于该元素是什么而命名,你就不必再次修改 HTML 的类名。如,heading 始终是 heading, 你不用管它变成什么样子。

样式可能会改变,但你只需要改变你的 CSS。这在另一个方面来说,实际是上松耦合从而提高了可维护性。

因为非语义类名调试困难

当你调试(debug)一个元素的时候,会出现很多类似的 CSS 选择器,增加了调试的难度。

因为标准推荐使用

HTML5 的规范在 3.2.5.7 里有说,使用类名属性。

"[...] 更鼓励使用能描述内容本质的类名,而不是那些只是描述其外在表像的值。"

因为能带来性能的提升

这是一个 非常 小的优势,因为当你一个元素只有一个类名的时候,你的整个 HTML 代码体积都会更小。而使用描述性的类名,每个元素有无数个类名,结果自然与前者不一样。

因为和重用规则有关

如果你没有使用语义化类名,你有可能会是误解了重用(reuse)的概念,而误用重用。阅读下章,获得更多。

最后想想语义化

语义化的类名是 MaintainableCSS 的基石,没有它,一切都没意义。所以,基于是什么命名,其他所有都将受益。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,744评论 1 92
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,889评论 25 707
  • 近来屡次被人问及情感以及婚事问题。问者漫不经心、洋洋得意, 仿佛在倨傲指摘一幅古老绚烂山水画之败笔处;答者脸上故作...
    王晓贱阅读 385评论 1 6
  • 微博有这么一段话:“刚开始的时候,他什么都不介意,不介意你的过去,不介意你的坏脾气。然后有一天,他开始介意...他...
    保爱APP02阅读 311评论 0 0
  • 序言 绝望,破灭…你通往死亡的路上又近了一步。当我不曾拥,又为何迟迟不愿放手。你的死不能改变你的命运,却可以封...
    筑跖阅读 287评论 0 0