什么是 CSS 属性选择器?
CSS 提供了一种方法,可以根据链接的属性(而不仅仅是元素类型)对元素进行样式设置。 例如,您已经知道可以对标题元素进行样式设置
h1 { color: blue; }
但您实际上可以变得更加具体,只对具有 title 属性的标题元素进行样式设置
h1[title] { color: blue; }
您可以更进一步,只对具有特定属性值的标题元素进行样式设置
h1[title="Go Home"] { color: blue; } /* Has the exact value "Go Home" in the title attribute */
h1[title~="Go Home"] { color: red; } /* Has the value "Go Home" somewhere in the title attribute */
h1[title^="Go Home"] {color: green; } /* Value of the title attribute starts with "Go Home" */
电子邮件链接的独特之处是什么?
电子邮件链接不同于所有其他链接,因为它总是以“mailto:”开头,这是浏览器用来通知操作系统用户要使用默认电子邮件程序将电子邮件发送到特定电子邮件地址的命令。 我们可以利用链接之间的这种相似性,以便我们只能对电子邮件链接应用 CSS 样式。
这里有一个问题
a[href^="mailto"] { color: blue; }
这将定位所有具有以“mailto”开头的href的链接。
完成样式设置
现在我们已经定位了这些链接,我们可以做的不仅仅是使它们变为蓝色。 我们还可以使用另一种强大的 CSS 技术,即“content”属性。 content 属性允许您向页面元素添加内容,甚至是直接从其自身属性中提取的内容! 使用伪选择器,您可以指定想要添加内容的位置,在前面或后面。
让我们变得花哨,从我们的链接中提取 title 属性,并将它们附加到链接本身之后,在链接的悬停状态下
a[href^="mailto"]:hover:after { content: attr(title); }
这将起作用,但它将把该文本附加到链接的正后方,所以让我们确保格式看起来不错,并添加一点间距和一个>字符,以将链接与将在悬停时添加的文本隔开
a[href^="mailto"]:hover:after { content: " > " attr(title); }
漂亮!
[查看示例]
为什么这更好?
- 只将电子邮件地址本身列为链接并不会暗示“操作”。 我认为,当您单击链接时,它会在没有任何警告的情况下启动您的邮件客户端,这很突兀。
- 通过将链接命名为“发送电子邮件”——您正在暗示该操作
- 两全其美,现在您可以将链接命名为“发送电子邮件”,但也可以显示电子邮件地址。
- 前向增强(并且向后兼容)。 此技术仅在良好的现代浏览器中有效,但它降级得很好。 旧浏览器只会看到链接,并且它可以正常工作。
此代码在 IE 中存在错误。
非常棒的小贴士,非常感谢! 我一定会在将链接指向外部页面或在新窗口中打开页面时使用此技术来警告用户。
对于 IE 用户来说很遗憾,但是... 如果你有一个好的浏览器,你就能获得好的功能,不是吗? ;)
在 IE 6(Win 2K)中绝对失败。 当我在 FF 中查看示例时,我明白了你的意思。
IE 目前不支持属性选择器。
此代码在 IE 7 中也失败。
感谢各位,我在文章最后确实提到过,这是一种仅在良好浏览器中有效的向前增强技术 =)
酷的是它不会在 IE 中崩溃,你只是不会得到乐趣。
电子邮件仍然可以正常工作,这很好。 我现在在我的当前网站上实际使用它,因为我的大多数访客谢天谢地都使用 FF。
我知道这将受到大多数任何语义/标准思维的程序员的谴责,但是...
为了帮助防止垃圾邮件,我选择在没有为我的 mailto 链接提供标题的情况下使用它,而是完全在 add content css 命令中添加了电子邮件地址。
如果你担心它在 IE 中无法正常渲染,你总是可以反转它,使用链接文本说电子邮件地址,然后在文本之前使用 css 添加内容,说“发送电子邮件”,然后它提供了单击前的愉快过渡,提供了一个号召性用语,并且有点两全其美。
我不喜欢使用 content 属性。 CSS 用于样式,而不是内容。
我以前从未见过这种用法!
我喜欢,所以感谢 Chris :)
如果你想让它在 IE 中运行,你可能想使用这个 JS 库
http://dean.edwards.name/IE7/
嘿,感谢你提供那个链接 Rob,我真的很想尝试一下,看起来很不错。
不错的,谢谢!
#8,样式是一个很宽泛的术语,人们常常认为它只与静态内容有关。 作者提出了一种通过“content”属性提高可见性和意义的有趣方法。 虽然“content”的使用通常意味着对数据的更改,但这种方法仅仅揭示了先前定义的数据(锚点的标题)。
我不会争论它是否语义化,但这种方法的效用是最有趣的。 我想看看设计师在哪些其他有创意的方法中实现了这一点。
属性选择器非常酷。 如果 IE8 能够正确实现这些,那就太好了!
出于某种原因,它在我的 Firefox 2 中不起作用。
好的,Firefox 的 Better Gmail 2 扩展与这种效果有冲突。 :(
好主意,但它在我的 IE 中不起作用。
感谢您提供的好资源。
这些选择器确实很厉害,但在其他情况下更有用,仅仅因为电子邮件链接在看起来像电子邮件链接时更容易识别(所以“[电子邮件保护]”比“发送邮件”更好的链接名称)。 这并没有真正改变 自 2002 年以来(以及更早的日子)。 在某些文本后面显示电子邮件地址(如您的示例中)看起来像一个替代方案,但在这里它对于键盘用户来说并不真正可访问,并且尝试复制电子邮件地址会暴露出一个特定的可用性问题。
好文章。我在链接的 TITLE 属性中使用“启动您的电子邮件程序”作为对用户的提示。我还使用了小邮件图标作为背景图像,放置在链接的末尾,作为另一个视觉线索。
我个人讨厌某些链接执行一些意想不到的操作……比如启动 PDF 文件。
谢谢!
吉姆·萨默
Jacksonville Web Design
http://tentonweb.com/
感谢您提供的链接,Rob,我将在我的下一个项目中尝试它!!
霍尔格
这可以在 IE 7 中比在 Firefox 中更好地实现。
对 FF 粉丝们没有冒犯之意,但我花在让 CSS 在 FF 中可预测地工作上的时间比我花在任何其他浏览器上的时间都要多——再次重申,没有冒犯之意,但“那些统治市场的人可以制定标准……”
但这仍然是一个好技巧。
很棒的技巧/诀窍,感谢您的发布。
@Tinkerer
如果您将 CSS 编写到标准规范,您将看到 Firefox 恰好按预期工作。您使用的是适用于 IE 的非标准 CSS。很难实现跨浏览器兼容性,但我更愿意为 FF 编码,而不是 IE。
“我不喜欢使用 content 属性。CSS 用于样式,而不是内容。”
但是,在这个示例中显示的内容仍然是内容的一部分——它作为 title 属性的一部分存在于 HTML 中。CSS 仅仅控制着 HTML 中已存在内容的呈现方式。我理解您关于 CSS 用于呈现而不是内容的观点,但是 content 属性是 CSS 规范的一部分,那么为什么不在可以的时候使用它呢?
我同意评论 #25。
此示例实际上并不查看内容(即 HTML 标签之间的文本),而是查看A标签的属性。我认为这从 CSS 的角度来看是有效的行为,就像在将不同的 CSS 代码应用于相同类型的 HTML 标签时使用style属性一样。
实际上,此功能是存在的,并且由于它确实证明了自己的价值,那么为什么不利用它呢?我个人将在现在开始使用,因为我知道它的存在。唯一的问题是 IE 什么时候会开始支持它……
这里还有另一个用途——用于打印。在打印时,您看到的不仅仅是带下划线的超链接文本,而是还会在打印的超链接之后显示链接的实际 URL……在 Firefox 中有效,在 IE6 中没有效果……尚未在 IE7 中测试。
这将打印主要内容 div 中超链接的 URL,并用“«”和“»”包围。
#content a:after {
content:” «” attr(href) “ »”;
}
谢谢!
吉姆·萨默
杰克逊维尔网页设计 http://tentonweb.com/
吉姆,您提供的提示非常棒。我真的很需要在这里的 CSS-Tricks 上使用打印样式表,我今天会尝试一下(希望如此)。
如果有人感兴趣,还有一个关于使用 JQuery 进行此操作的评论在 CSS Zone 上。
很棒的提示..谢谢 :D
如前所述,IE 不支持属性选择器。简单的解决方法是将 mailto 链接标记为特定类。通过应用信封等的背景图像,可以获得额外的(有用的)视觉效果。
无论如何,如今更实用的东西(很可能不在 CSS 领域)是能够启动您选择的网页邮件服务来撰写电子邮件,而不是启动默认系统电子邮件应用程序。这对使用 Windows 的人来说非常烦人,而且许多这些用户使用网页邮件。Windows 上的默认设置是启动 Outlook Express,除非您拥有 MSOffice……而且 Outlook Express 甚至不受 MS 支持……所以您就明白为什么它会默认启动。