有人可以告诉我,是否有任何理由在我的样式表中使用a {}
代替a:link, a:visited {}
(或毗邻)<a>
?我在浏览器,网站等方面测试结果不一致,所以我从来没有得到满意的答案。我也无法在Google上找到答案。
这当然是假设从不是使用href
标记而没有a
值的理由。也许这是一个错误的假设。
** 编辑 **
我知道这些选择器做什么。我正在寻找使用a:link
代替a:visited
或a
的原因,因为href
始终具有<a name="top">
属性。但正如Chris Blake和Ryan P在答案中所说,还有href
和javascript用法,这两者都不需要{{1}}属性。
答案 0 :(得分:18)
这当然是假设从不是使用
<a>
标记而没有href
值的理由。也许这是一个错误的假设。
嗯,实际上......并非每个<a>
元素都需要href
属性。实际上,HTML5中仍然没有必需为每个href
指定<a>
。 Chris Blake和Ryan P讨论了命名锚点的概念,我将在name
的{{1}}属性为made obsolete as of HTML5时添加,命名为previous answer锚点仍然普遍存在,并将继续存在,仅仅是传统和传统。
也就是说,前进,建议作者使用<a>
属性而不是命名锚来指定文档锚片段。
此外,id
元素缺少<a>
属性但具有href
属性的JavaScript是一团糟。即使您坚持使用onclick
绑定事件,为了优雅降级,您至少应该使用onclick
将其指向某处。
但为了简单起见,我们假设您不会在没有href
属性的情况下编写<a>
个元素。
考虑到这一点,回到CSS选择器,有两个要点需要考虑:
不,选择器href
和a
不是严格等同的。我将在这个主题上引用我的friendlier to older browsers:
选择器
a:link, a:visited
应匹配任何a
元素,而<a>
仅匹配未访问的超链接的a:link
元素(HTML 4文档) type将超链接定义为具有<a>
属性的<a>
元素。它在任何一个规范中都没有说明href
应该自动转换为a
,反之亦然。
换句话说,在HTML中,a:link
(在CSS1中)严格等同于a:link, a:visited
(在带有属性选择器的CSS2中),而不是a[href]
。请注意,只要属性存在,属性是否具有值并不重要,因此a
。另请注意,对于所有当前的HTML标准都是如此,我认为这包括HTML5,因为如上所述[href]
不是任何现有规范中的必需属性。
请记住,其他语言可能会为href
和:link
定义完全不同的语义 - 它恰好与HTML中同样特定的选择器重合,接下来将介绍它们。
这是一个巨大的问题::visited
没有a
或a:link
那么具体,这是一个非常常见的特殊问题来源,在将样式应用于{{{ 1}},a:visited
和a
分开。这会导致各种a:link
黑客无法理解特异性。 1
幸运的是,属性选择器与伪类一样具体。这意味着您可以使用a:visited
表示/ !important
和/或a[href]
,并且不会遇到特殊问题,因为它们具有同等特异性!
例如,考虑一下这个CSS:
a:link
这不会按预期工作,因为a:visited
和/* 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
现在大多数CSS编码器首先想到的是投入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
但这会给你带来各种不好的代表,对吗?
如果您使用!important
感到不舒服,可以使用body > header > a {
color: white !important;
}
,如上所述:
!important
或者这样做,其问题是冗长,但:any-link
pseudo-class只是更直观:
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);
}
元素定义的,无论它们是否被访问过,因为转换仅在其中一个被鼠标悬停并单击时生效(对应于{ {1}}规则)。
现在,我希望访问过的链接比未访问的链接具有稍暗的阴影,因此我将颜色放在单独的text-shadow
和a
规则中。但是,出于某种原因,我希望页脚链接显示相同的颜色,无论他们是否访问过。
如果我使用a:hover, a:active
,我会遇到上述特殊问题,因此我选择a:link
。我可以轻松地使用a:visited
,因为它同样适用,但我个人更喜欢指定两个伪类,因为它更直观,即使它使选择器更长一点。
1 特殊性和重复选择器已经提出了如此巨大的问题,事实上,工作组已经在下一个规范中提出{{3}}的建议不必依赖HTML中的footer a
属性,但必须等待长时间才能看到白昼(并且知道它会被称为什么)到那时):
footer a:link, footer a:visited
答案 1 :(得分:3)
a:link
和a:visited
分别用于为普通链接和访问链接指定自定义(浏览器默认值除外)颜色,而a {}
用于覆盖所有样式包括a:link
,a:visited
,a:active
。例如,无论链接是活动的,访问过的还是没有链接或跟踪链接,后续都将具有相同的颜色:
a { color:red; }
您可以使用单独的样式来避免这种情况,例如a:pseudoClass
表示法。
答案 2 :(得分:3)
嗯,你可以拥有只是一个锚点的锚点。例如,
<a href="#top">Return to top</a>
<a name="top">Top</a>
这可以纠正你的错误假设(尽管“顶部”不需要锚点,但它在哲学上是最正确的)。
此外,正如Sarfraz所说,a {}
会覆盖所有其他a:
样式属性,如果样式化(假设a {}
在其他a:
声明之后)。
答案 3 :(得分:3)
a:link
和a:visited
具有特定含义。 a
本身会影响所有<a>
元素,而a:link
只会影响尚未访问的链接,而a:visited
只会影响已访问过的链接。
答案 4 :(得分:3)
有两种情况a
可能没有href
属性。第一个是常规锚点(即<a name="someplace" />
),第二个是纯Javascript交互(即<a onclick="doSomething( );" />
)。这些不是“链接”,不应该是相同的。
编辑:为了澄清,a:link
几乎等同于a[href]
(我相信在属性选择器可用或标准化之前存在以前的符号)。因此,如果您希望所有锚标记的样式相同,则使用a
代替a:link
的原因就是这样。某些浏览器中的默认样式以不同方式显示两者 - 例如仅应用于a:link
的下划线而不是a
。