当前位置: 首页 > 面试题库 >

是否有理由在样式表中使用a而不是a:link或a:visit?

穆毅然
2023-03-14
问题内容

谁能告诉我在样式表中是否有a {}代替(或相邻)使用的理由a:link, a:visited {}?我在浏览器,网站等上测试此结果的结果不一致,所以我从来没有得出满意的答案。我也无法在Google上找到答案。

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

编辑

我知道这些选择器的 作用
。我正在寻找为什么要使用a而不是a:link或的原因a:visited,因为它a始终具有href属性。但是正如克里斯·布莱克(Chris
Blake)和瑞安·普(Ryan P)在回答中说的那样,也有<a name="top">javascript用法,两者都不需要href属性。


问题答案:

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

好吧,实际上…并非每个<a>元素都需要具有href属性。确实,在HTML5中仍然
不需要href为每个都指定<a>。克里斯·布雷克(ChrisBlake)和瑞安·普(RyanP)讨论了命名锚点的概念,我将补充一点,尽管HTML5以来的name属性<a>已过时,但命名锚点仍然很盛行,并且将继续存在,仅仅是继承和传统而已。

就是说, 今后 ,建议作者使用id属性而不是命名锚来指定文档锚片段。

同样,<a>缺少href属性但具有onclickJavaScript
属性的元素也一团糟。即使你坚持使用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:linka: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:linka:visited规则。但是,由于某种原因,无论是否访问,我都希望页脚链接显示相同的颜色。

如果使用footer a,则会遇到上述特异性问题,因此我选择了footer a:link, footer a:visited。我可以轻松地选择它,footer a[href]因为它也可以正常工作,但是我个人更喜欢同时指定这两个伪类,因为它更直观,即使它会使选择器更长一些。

1 特殊性和重复的选择器构成了一个巨大的问题,实际上,工作组提出了下一个规范中的:any- link伪类提案,以消除必须依赖hrefHTML中的属性的问题,但这将等待很 长一段 时间才能看到曙光(谁知道那时会叫什么):

/* 1 pseudo-class, 3 types -> specificity = (0, 1, 3) */
body > header > a:any-link {
    color: white;
}


 类似资料:
  • 问题内容: 我还没有机会在学校参加任何严肃的低级编程课程。(我知道我真的应该继续学习“幕后知识”以成为更好的程序员。)我感谢Java的便利性,包括将任何内容粘贴到语句中的能力。但是,为什么有任何理由要使用它呢? 另外,我应该避免在“实际应用程序”中进行此类打印调用吗?使用某种UI功能将消息打印到客户端的显示屏上可能更好,对吧? 问题答案: PrintStream类的方法提供类似于C中函数的字符串格

  • 问题内容: 是否可以使用JavaScript更改CSS样式表? 我 不是 在说: 我 AM 谈论改变: 除了做一些肮脏的事情(我们还没有尝试过)之外,比如在头部创建一个新对象,innerHTML在其中创建一个样式标签,等等。尽管这样做确实可行,但仍会带来一些样式问题块已经在其他地方定义了,我不确定何时/是否浏览器会解析动态创建的样式块? 问题答案: 浏览器支持已得到很大改进(支持所有浏览器,包括I

  • 版本: 返回一个,其ID为“z”,偏移量为0,默认区域规则。 返回一个,包含ID“utc”和。 例如,在处理时。在这里,我能发现的唯一区别是它的打印方式不同。 我们正在来回地进行代码审查讨论,所以我想这种冲突并不罕见。 它是一个常量(此外,它的偏移量值(0)甚至被缓存)。 由于缺少区域信息,它的开销少了一点。 在UTC时,不需要考虑夏时制时间或历史变化,就像在任何其他时区一样。 因此,对于我迄今为

  • 问题内容: 我已经使用Hibernate几年了,但仅将其与注释一起使用,并在代码中设置了连接参数。 我是否通过不使用XML文件来“缺少某些东西”?是否只有XML提供重要的功能?是否存在使用XML有意义的情况或模式? 问题答案: 我认为可以肯定地说您不会错过任何事情。 如果XML中有任何功能无法在属性中表示(我相信有一些罕见的情况),那么您仍然可以选择使用[RawXml]并将XML写入属性中。因此,

  • 问题内容: 如果某些列返回FALSE,如何显示不同的值, 例如, COLUMN“ BASIC”返回FALSE,但我需要为用户显示YES或NO。情况为FALSE,请返回NO。 问题答案: 如果是varchar或bit,则处理NULL 或者如果只是一点点 编辑:

  • 问题内容: 有没有一种方法可以检查表是否存在 而无需 从表中选择和检查值? 也就是说,我知道我可以检查返回的字段数,但是似乎必须有一种更直接/更优雅的方法。 问题答案: 您无需计数。 如果没有错误,则表存在。 或者,如果您想正确,请使用INFORMATION_SCHEMA。 或者,您可以使用 如果结果集中有一行,则表存在。