有没有理由使用,而不是:链接或:参观了我的样式表?有没有理由使用,而不是:链接或:参观了我的样式表?

2019-05-14 02:14发布

谁能告诉我,如果有任何理由使用a {}而不是(或接近) a:link, a:visited {}在我的样式表? 我有跨浏览器,网站等不一致的结果测试这一点,所以我从来没有拿出一个满意的答复。 我是不是能够找到的谷歌的答案,无论是。

当然,这是假设永远不会有一个理由去使用的<a>标签没有href值。 也许这是一个错误的假设。

** 编辑 **

我知道这些选择 。 我在寻找原因,我会用a ,而不是a:linka:visited ,因为a总是有一个href属性。 但随着克里斯布雷克和瑞恩P IN的答案说,也有<a name="top">和JavaScript的使用,这两者都不需要的href属性。

Answer 1:

当然,这是假设永远不会有一个理由去使用的<a>标签没有href值。 也许这是一个错误的假设。

嗯,其实......并不是每个<a>元素都需要有一个href属性。 事实上,它仍然没有在HTML5 需要指定href为每<a> 。 克里斯·布莱克与瑞恩P谈论命名锚的概念,我会补充说,虽然name为属性<a>已经过时作为HTML5的 ,命名锚仍然盛行,并会继续,只是由传统和传统。

这就是说, 展望未来 ,笔者建议用户使用id属性,而不是命名锚指定文档锚片段。

此外, <a>缺乏元素href属性,但具有onclick属性的JavaScript是一个烂摊子。 即使你坚持使用onclick绑定事件,优雅降级的缘故,你应该至少使用指向它的地方 href

但是,为了使事情变得简单,让我们假设你会不会写<a>没有元素href属性。

考虑到这一点,要回CSS选择器,有两个重要的考虑点:

他们是一样的吗?

不,选择aa: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:linka:visited ,这是应用样式时,特别明显的特异性问题,一个很普通的源aa:linka: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:linka: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:linka:visited风格在那里一个链接不论是去过或没有。

  • 考虑到上面提到的特异性问题,不要混合使用这两个之间的任何声明aa: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;
}


Answer 2:

a:linka:visited分别用于指定自定义 (比默认浏览器等),颜色正常,访问过的链接,而a {}是用来覆盖所有风格,包括a:linka:visiteda:active 。 例如下面都会有相同的颜色,不论链路是否是活动的,或者访问或没有在徘徊:

a { color:red; }

你能避免通过使用个人风格,例如a:pseudoClass符号。



Answer 3:

有两种情况下的a可能没有href属性。 第一种是定期锚(即<a name="someplace" /> ),第二个是纯的Javascript交互(即<a onclick="doSomething( );" /> )。 这些都不是“链接”,不应该被称呼一样。

编辑:为了澄清, a:link是非常相当于a[href]我相信存在前者符号的属性选择是可利用的或标准化之前)。 因此,一个理由使用a ,而不是a:link ,如果你想所有的锚标签的风格相同的是。 在一些浏览器的默认样式显示两个不同-如下划线只适用于a:link ,而不是a



Answer 4:

a:linka:visited有特定的含义。 a本身会影响到所有<a>元件,而a:link只会影响还没有被访问和链接a:visited只会影响已经访问过的链接。



Answer 5:

那么你可以有一个锚,这只是一个锚。 例如,

<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?