a 标签有 linkvisitedhoveractive 这几个常用的伪类用于定义不同状态. 这些伪类意思明确, 使用简单, 看起来不会存在什么问题, 而实际上他们的使用顺序, 是否应该使用都需要考虑清楚.

a 标签在网页中无所不在, 而且样式复用性很高. 一般来说, 一个网站上的链接形式是比较统一的, 所以作为 reset 或者基本的 a 标签 CSS 定义十分重要.

 

a 标签伪类的 lvha 顺序

为了解决伪类状态覆盖的问题, 网上建议开发者书写 a 标签样式如下:

a:link {color:#FF0000;} /* 没访问过的链接样式 */
a:visited {color:#00FF00;} /* 访问过的链接样式 */
a:hover {color:#FF00FF;} /* 鼠标进入链接区域的链接样式 */
a:active {color:#0000FF;} /* 点击链接时的链接样式 */

相信很多开发者都看了这段称为 lvha (love & hate) 的书写顺序建议, 我看了很多网站在全站通用的 CSS 里已经也是这么写的. 除了样式上有特殊需要, 我不建议这样来定义 a 链接的样式, 尤其是在通用样式中.

a 标签 lvha 存在的问题

lvha 的写法从逻辑上没有问题, 而事实上这种写法是过度设计, 为代码维护带来很多额外的维护成本.

假设全局通用 CSS 中已经按 lvha 定义样式, 而页面中一些链接即便被访问过, 要求跟没访问过的样式一致, 开发便需要重写 visited 样式; 如果某些链接颜色跟通用样式不一样, 基本上要重写所有链接伪类的样式, 代码量大, 也相当麻烦.

下面是一段过度设计的示例代码摘要.

a:link{color:#06C;text-decoration:none;}
a:visited{color:#969;text-decotation:none;}
a:hover{color:#F90;text-decoration:underline;}
 
.normal a:link,
.normal a:visited{color:#666;}
.normal a:hover{color:#000;}

有什么问题相信大家看看就知道了, 几乎所有对链接的重新定义, 都需要将 a 链接对应的个伪类的样式重写一遍.

a 标签样式规划建议

为什么会出现上述的写法? 我猜这是因为设计库中存在一套对文本和链接的完整的设计规范, 编写代码的人认为可以通过通用的样式一劳永逸, 而这可能弄巧反拙. 下面是 Alibaba DPL 的一个片段, 一看便知.

a 标签设计

link 和 hover 状态的链接样式通用性很高, 但 visited 样式仅在搜索页面的商品标题, 帮助中心的问题链接等少部分列表的主要链接上才会使用. 所以完全有理由将它们分开处理.

在通用 CSS 中只定义 a 和 a:hover 样式, 需要使用 a:visited 样式时再做定义. 则前面那段 CSS 可以定义如下:

a{color:#06C;text-decoration:none;}
a:hover{color:#F90;text-decoration:underline;}
 
.normal a{color:#666;}
.normal a:hover{color:#000;}
 
.list a:visied{color:#969;}

从代码可以看到, 一般的链接样式修改, 只需要顾及到 a 和 a:hover, 而其他状态仅在使用的时候进行定义. 因为前者常有, 后者少用, 所以维护量是非常小的.

后话

过度设计无所不在, 三年前我刚入职写过一段商品价格的 CSS 定义, 对货币, 价钱, 单位以及各种场景都做了看起来完美的定义, 但现在看来这是我做的最错误的一件事情, 因为强定义导致样式覆盖的代码量大. 而随着网站的发展, 这些修改和重写必将越来越多.

当我们希望有一套 CSS 架构解决掉所有页面外观需求, 甚至出现如: size-35margin-left-10 这样的 class, 过度设计就开始了...

 posted on 2013-06-04 13:16  摇摆的大叔  阅读(411)  评论(0编辑  收藏  举报