先晒一下,使用标签的属性(Attribute)作为选择器,其 CSS 的写法如下:
[layout] { box-sizing: border-box; display: flex; } [layout="column"] { flex-direction: column; } [layout="row"] { flex-direction: row; }
上述这一段代码是摘自 Material Design 中关于布局的一段 CSS 写法。有人会说这样那得自定义标签了,对,使用方法如下:
<div layout="row"> <div>I'm left.</div> <div>I'm right.</div> </div> <div layout="column"> <div>I'm above.</div> <div>I'm below.</div> </div>
为什么要这样使用呢?
一、取之即来,利用率高
我们的 HTML 中,每一个标签,已经有很多的属性(Attribute)了,为什么我们还要再添一个属性叫 class 呢?直接使用标签中的属性作为样式选择器,可以提高 HTML 与 CSS 的结合利用率。
一段 HTML 如下:
<form> <input class="input-text" type="text" name="name" placeholder="name" /> <input class="input-text" type="text" name="email" placeholder="email" /> <input type="submit" name="submit" /> </form>
使用两种不同的选择器来写样式:
/* 使用 class */ .input-text { display: block; margin-bottom: 15px; padding: 10px; width: 250px; border: 2px solid steelblue; } /* 建议使用 Attribute */ input[type="text"] { display: block; margin-bottom: 15px; padding: 10px; width: 250px; border: 2px solid steelblue; }
二、独特语义
特定的标签有特定的属性(Attribute),我们可以利用起来。而一个 class 却可以在不同的标签上使用,一些时候会有"挂羊头卖狗肉"之嫌,不如特定的属性语义化更好。
例如我们的 A 标签中的属性:
<a href="yoursite.com/somepage.html" rel="external"> <a href="mypage.html" rel="internal">
样式的写法如下:
/* 使用 rel 属性来写样式 */ a[rel="external"] { color: green;} /* 而当我们写了一个样式 .external,却可以随便加在任何的标签上 */ .external { ... }
三、属性及属性值灵活结合
使用属性(Attribute),可以很灵活,因为支持属性、属性值、数值值的匹配等,详见下表:
选择器 | 常用标签 | 解释 | 权重 |
---|---|---|---|
[attribute] | [target] | 选择带有 target 属性所有元素。 | 2 |
[attribute=value] | [target=_blank] | 选择 target="_blank" 的所有元素。 | 2 |
[attribute~=value] | [title~=flower] | 选择 title 属性包含单词 "flower" 的所有元素。 | 2 |
[attributeΙ=value] | [langΙ=en] | 选择 lang 属性值以 "en" 开头的所有元素。 | 2 |
[attribute^=value] | a[src^="https"] | 选择其 src 属性值以 "https" 开头的每个 元素。 | 3 |
[attribute$=value] | a[src$=".pdf"] | 选择其 src 属性以 ".pdf" 结尾的所有 元素。 | 3 |
[attribute*=value] | a[src*="abc"] | 选择其 src 属性中包含 "abc" 子串的每个 元素。 | 3 |
四、避免污染,提高可扩展性
这个比较虚,却比较真实。因为在编写一个组件的时候,我们以 class 来为一个元素添加一个新的样式,较大几率会遇到样式冲突。使用属性可以保持某一个特定组件样式的唯一性(当然,被覆盖的可能性也存在),使用的一方则不需顾虑因 class 引起的样式问题。
好处虽多,但也有其约束性,权重、表达式等,欢迎探讨。