谁能告诉我,如果有任何理由使用a {}
而不是(或接近) a:link, a:visited {}
在我的样式表? 我有跨浏览器,网站等不一致的结果测试这一点,所以我从来没有拿出一个满意的答复。 我是不是能够找到的谷歌的答案,无论是。
当然,这是假设永远不会有一个理由去使用的<a>
标签没有href
值。 也许这是一个错误的假设。
** 编辑 **
我知道这些选择做 。 我在寻找原因,我会用a
,而不是a:link
或a:visited
,因为a
总是有一个href
属性。 但随着克里斯布雷克和瑞恩P IN的答案说,也有<a name="top">
和JavaScript的使用,这两者都不需要的href
属性。
当然,这是假设永远不会有一个理由去使用的<a>
标签没有href
值。 也许这是一个错误的假设。
嗯,其实......并不是每个<a>
元素都需要有一个href
属性。 事实上,它仍然没有在HTML5 需要指定href
为每<a>
。 克里斯·布莱克与瑞恩P谈论命名锚的概念,我会补充说,虽然name
为属性<a>
已经过时作为HTML5的 ,命名锚仍然盛行,并会继续,只是由传统和传统。
这就是说, 展望未来 ,笔者建议用户使用id
属性,而不是命名锚指定文档锚片段。
此外, <a>
缺乏元素href
属性,但具有onclick
属性的JavaScript是一个烂摊子。 即使你坚持使用onclick
绑定事件,优雅降级的缘故,你应该至少使用指向它的地方 href
。
但是,为了使事情变得简单,让我们假设你会不会写<a>
没有元素href
属性。
考虑到这一点,要回CSS选择器,有两个重要的考虑点:
他们是一样的吗?
不,选择a
和a:link, a:visited
不完全等同。 我还要举一个以前的答案就这个话题我的:
选择a
应匹配任何<a>
元素,而a:link
仅匹配<a>
元素是未访问的超链接 (在HTML 4文档类型的超链接定义为<a>
与元件href
属性)。 无处它在任何规范,说明a
应自动转换为a:link
,反之亦然。
换句话说,在HTML中, a:link, a:visited
(在CSS1)是严格地等同于a[href]
与属性选择CSS2),而不是a
。 需要注意的是并不重要的属性是否具有值与否,只要它存在,因此[href]
另请注意,这是HTML的所有现行标准真的,我相信这包括HTML5,因为上面提到的href
是不是在任何现有的规范的必要属性。
只要记住,其他语言可以定义完全不同的语义:link
和:visited
-它只是恰巧,他们与HTML同样特定的选择,下面要提到一致...
特异性
这是一个巨大的疑难杂症: a
是比任何特定少a:link
或a:visited
,这是应用样式时,特别明显的特异性问题,一个很普通的源a
, a:link
和a:visited
分开。 这就导致了各类!important
黑客绕过缺乏特异性的理解。 1
幸运的是,属性选择是作为特定的伪类。 这意味着你可以使用a[href]
为指/任a:link
和/或a:visited
,并没有遇到特异性问题,因为他们具有同等的明确!
例如,考虑这个CSS:
/* All unvisited links should be red */
a:link {
color: red;
}
/* All visited links should be slightly darker */
a:visited {
color: maroon;
}
/* But no matter what, header links must be white at all times! */
body > header > a {
color: white;
}
预期这是不行的,因为a:link
和a:visited
比更具体的body > header > a
,所以标题链接实际上将永远是白色的:
/* 1 pseudo-class, 1 type -> specificity = (0, 1, 1) */
a:link, a:visited
/* 3 types -> specificity = (0, 0, 3) */
body > header > a
现在,想到大多数CSS编码的第一件事就是在扔!important
,完全胜过特异性:
body > header > a {
color: white !important;
}
但是,这可以让你各种坏名声的,对不对?
那么,如果你觉得不舒服使用!important
,你可以使用a[href]
如上所讨论的:
/* 1 attribute, 3 types -> specificity = (0, 1, 3) */
body > header > a[href] {
color: white;
}
或者做到这一点,其中有被冗长的问题,但友好的旧版浏览器 ,以及简单的是更直观:
/* 1 pseudo-class, 3 types -> specificity = (0, 1, 3) */
body > header > a:link, body > header > a:visited {
color: white;
}
因此,要使用的选择?
最终,这一切还在生气主观的,但我跟随拇指这些个人的规则:
适用于a
不依赖于链路的状态 (即,只要它是一个链接都行)的风格。
适用于a:link
和a:visited
风格在那里做一个链接不论是去过或没有。
考虑到上面提到的特异性问题,不要混合使用这两个之间的任何声明a
和a:link
/ a:visited
规则。 如果我需要将相同的属性适用于这两个州的某个地方,但我已经拥有它在单独a:link
,并a:visited
规则,写结合了伪类选择; 不要只用a
!
例如,这里有链接样式我在我的网站使用:
a {
text-decoration: none;
transition: text-shadow 0.1s linear;
}
a:link {
color: rgb(119, 255, 221);
}
a:visited {
color: rgb(68, 204, 170);
}
a:hover, a:active {
text-shadow: 0 0 0.5em currentColor;
outline: 0;
}
/* ... */
footer a:link, footer a:visited {
color: rgb(71, 173, 153);
}
该text-shadow
过渡所有定义的a
元素,不管它们是否被访问或没有,因为过渡才会生效时,其中一个位于鼠标上并点击(相当于a:hover, a:active
规则)。
现在,我想访问过的链接比未访问链接略暗的阴影,所以我把颜色不同的a:link
,并a:visited
规则。 然而,出于某种原因,我想页脚链接出现在同一颜色是否他们参观与否。
如果我使用footer a
,我会遇到上述问题的特殊性,所以我选择footer a:link, footer a:visited
代替。 我可以很容易地去footer a[href]
因为作品一样好,但我个人更喜欢同时指定伪类,因为它更直观,即使它使选择长一点。
1个 特异性和重复选择已构成这样一个巨大的问题,事实上,该工作组已经提出了一个建议一个:any-link
伪类在未来的规范废除不得不依靠href
在HTML属性,但将有看到曙光之前要等待很长的时间(谁知道它会被那才叫):
/* 1 pseudo-class, 3 types -> specificity = (0, 1, 3) */
body > header > a:any-link {
color: white;
}
该a:link
和a:visited
分别用于指定自定义 (比默认浏览器等),颜色正常,访问过的链接,而a {}
是用来覆盖所有风格,包括a:link
, a:visited
, a:active
。 例如下面都会有相同的颜色,不论链路是否是活动的,或者访问或没有在徘徊:
a { color:red; }
你能避免通过使用个人风格,例如a:pseudoClass
符号。
有两种情况下的a
可能没有href
属性。 第一种是定期锚(即<a name="someplace" />
),第二个是纯的Javascript交互(即<a onclick="doSomething( );" />
)。 这些都不是“链接”,不应该被称呼一样。
编辑:为了澄清, a:link
是非常相当于a[href]
我相信存在前者符号的属性选择是可利用的或标准化之前)。 因此,一个理由使用a
,而不是a:link
,如果你想所有的锚标签的风格相同的是。 在一些浏览器的默认样式显示两个不同-如下划线只适用于a:link
,而不是a
。
a:link
和a:visited
有特定的含义。 a
本身会影响到所有<a>
元件,而a:link
只会影响还没有被访问和链接a:visited
只会影响已经访问过的链接。
那么你可以有一个锚,这只是一个锚。 例如,
<a href="#top">Return to top</a>
<a name="top">Top</a>
这纠正你的错误的假设(尽管,不需要为“顶”锚,但它是最正确的哲学)。
另外,作为所述Sarfraz, a {}
覆盖其他的所有出现a:
如果风格样式属性(并假设a {}
是其他后a:
声明)。
文章来源: Is there a reason to use a instead of a:link or a:visited in my stylesheet?