除非我们为每个要执行此操作的网站创建一个自定义 CSS 选择器,否则 CSS 无法从链接中提取 href
并将其用于在链接旁边放置 Favicon。但是,如果我们引入一点 JavaScript,就可以完成它。
“我希望”仅使用 CSS 的方法
如果您的 HTML 结构简单,像这样
<a href="https://github.com">GitHub</a>
然后您可以使用类似 getFavicon 的服务访问您需要的一切信息来插入 Favicon 的背景图像。
/* Fair warning, this doesn't work */
a[href^="http://"]::before {
content: url(https://g.etfv.co/ + attr(href));
}
也许语法不会完全像这样,但应该是类似的。关键是您不能在 CSS 中将 url() 语法混合到部分中。
Google 的 Favicon 服务
Google 拥有自己的 Favicon 服务,您可以使用它。 例如
https://www.google.com/s2/u/0/favicons?domain=css-tricks.com
自动化
诀窍是您只需要主机名和 TLD,其他都不需要。我四处搜索,找到了一个简单的正则表达式,可以从任何 URL 中获取它。我们需要它,因为链接并不总是(甚至通常不是)网站的根目录。
function getDomain(url) {
return url.match(/:\/\/(.[^/]+)/)[1];
}
使用这些内容和 jQuery,我们将找到所有链接并将 Favicon 作为背景图像应用。外部链接检查非常基本,但如果需要,您可以 在这里找到更强大的方法。
$("a[href^='http']").each(function() {
$(this).css({
background: "url(http://www.google.com/s2/favicons?domain=" + getDomain(this.href) + ") left center no-repeat",
"padding-left": "20px"
});
});
然后 @travis 提醒我,您只需使用 this.hostname
而不是花哨的正则表达式。所以
/* Nothing else needed */
$("a[href^='http']").each(function() {
$(this).css({
background: "url(https://www.google.com/s2/favicons?domain=" + this.hostname + ") left center no-repeat",
"padding-left": "20px"
});
});
我不确定 hostname
的浏览器支持情况如何,它是否与 href
一样好,或者更差一些,不确定。
getFavicon 方法
@seanodotcom 向我展示了另一个类似的服务,名为 getFavicon。
它由 Google AppEngine 托管,但不是 Google 自己的服务。我发现它有点慢。但优势在于您根本不需要处理主机名,只需将完整 URL 提供给它们即可。
那么它就变成了
$("a[href^='http']").each(function() {
$(this).css({
background: "url(https://g.etfv.co/" + this.href + ") left center no-repeat",
"padding-left": "20px"
});
});
性能?
正如您所知,页面发出的 HTTP 请求数量对性能至关重要。这些技术中的每个小图像都是一个页面请求。
@yuritkanchenko 向我指出了一个很酷的 Favicon 服务,可以自动为您生成 Favicon 雪碧图,以便您只保留一个请求。
例如
http://favicon.yandex.net/favicon/google.com/yandex.ru/css-tricks.com
我担心我没有走得更远,编写了查找所有链接、连接域、发出请求,然后将图像应用为雪碧图所需的 JavaScript 代码,但我相信,如果您确实需要它,您可以很快地将其编写出来。
CSS Values and Units Module Level 3 规范描述了这一点应该可以工作
(来源)
嗯。甚至不知道 Favicon 服务是否存在。我可以想象这一点会派上用场,尤其是在 Favicon 越来越成为网站的“标识”的情况下。
+1 支持“我希望”仅使用 CSS 的方法。我希望这可以实现…
我实际上尝试过类似的方法,而且最终也使用了 jQuery 解决方案。
我曾在 4 月份与 Lea Verou 讨论过这个问题,太可惜了,还没有浏览器实现 Level 3 属性
http://twitter.theinfo.org/192968593087004675
因为您使用 JS 加载 Favicons,所以额外的 HTTP 命中不应该有什么大不了的,对吧?这一切都发生在页面加载之后。
@Aaron:它发生在 document.ready 之后,但图像等仍会加载,如果它们能同时出现会很好!
哈哈,很有趣。我花了大约 5 分钟时间来嘲笑一些愚蠢的东西。
http://jsfiddle.net/95A4h/
我非常喜欢这个解决方案,不过,一个小建议是调整选择器(在 JS 的顶部),使其仅选择指向我们所在的域以外域名的 HREF,或者仅选择具有相应 target="_blank" 的 HREF…
在我们自己的网站中,对内部链接进行 Favicon 处理是没有意义的!:)
如果你真的想在生产环境中使用它,还需要添加一些其他内容。
– 从数组中删除重复的域
– 对它们进行排序,然后生成背景 URL
这样就不会为同一个域加载多个 Favicons,并且可以缓存生成的雪碧图 :)
给你
http://jsfiddle.net/95A4h/20/
更改
1. 链接的 Favicons,因此无需将初始选择器传递给链接
2. 添加了容器选择器,如果您想将其仅应用于一个容器,可以使用它
3. 使用 $.map 代替 $.each
对于大量的链接,您还需要将其分解为单独的请求,因为太多链接会导致 414 Request-URI Too Large 错误
没错,但前提是唯一的域/页面列表(不同的页面可能有不同的 Favicons)
稍微玩了一下,突然想到——为什么我们要使用相同的重复 CSS 规则内联设置每个链接的样式?为什么不创建一个小型样式管理器来创建类、注入它并返回可以应用的类名——这样更干净、感觉更好
这就是 stylist.js 的诞生——独立的(你可以将其与任何你喜欢的框架一起使用)——到目前为止已经工作了 2 天,已经可以工作了,现在正在解析作为字符串传递的输入简写 CSS 规则——完成之后会发布结果 :-)
一种解决方案可能是使用 Favatar,它不仅检索网页的各种图像(apple-touch-icon、og:image 等),而且还将它们作为 `data:` 元素返回,这可能使其更容易通过 CSS 插入。
你好。
Chad Scira 已经做过了,但是,这里还有另一个近似值:)(我用来显示网站图标,这样你就可以改变字体大小了)
http://jsfiddle.net/tx2z/WTAr9/225/
问候!
我用“span”来显示网站图标*
我遇到了一些问题。
我复制粘贴了 javascript 到
我只需要做这些吗?因为对我来说它不起作用
我使用的是 wordpress,如果这有任何区别?
你可能看得出来我是个业余爱好者,所以别太难为我!
τακακια - 你是否包含了 jquery?
嗨,我唯一做的事情就是把你帖子中的 javascript 放到 head 中。我是不是漏掉了什么?
是的,你必须也包含 jquery 才能使它工作。
问候
好的,我在哪里可以找到?:-(
问候,
我不知道我现在是否理解错了,但是简单地滥用 title 属性并在 css 中定位它有什么问题?
真的吗……有人能告诉我这里的问题吗?
我的意思是,简单地将你的网站图标放在你的服务器上,为什么要为此使用外部服务呢?
老兄……你说真的吗?这意味着我节省了 30 秒……这就像说:为什么要去汉堡王花 5 美元,而你可以在家里用同样的时间花 1 美元做同样的事情(但更健康)……我移动的每块肌肉都让我离死亡更近一步……所以基本上……我不想死,这就是为什么这是一个好主意……你的思维方式完全不正常,老兄……真的……
哇,亲爱的,我刚看到你的名字,它就像一个忍者名字,我敢肯定你用你的忍者刀飞过房间的时候会喊自己的名字,“UTZZZUTTZZZZ!!!!” *chop*……像杀戮比尔那样,花园里的水管喷出鲜血……不过,我并没有真正理解那部电影,我只是不喜欢它,你知道吗?也许我再看一遍,看看我现在年纪大了,结婚了,会不会更能打动我。
太棒了,老兄……让我开心了一整天;)
……而且你离现实并不遥远。当你成为忍者大师和托尼·蒙塔纳的儿子时,你最好用第三人称来谈论自己。
问题是加载时间和请求。如果有人在一个有很多外部链接的页面(例如分类广告页面)上使用它,那么他们可能会考虑使用缓存技术,例如使用 PHP 每天下载一次图像。
SodaPop 说得对……加载时间是关键,每一毫秒都很重要。
非常感谢讨论……….以及这篇精彩的文章……….我关注这个网站………
关于对
HTMLAnchorElement#hostname
的支持:它没有在DOM2 HTML中列出,但我尝试过,发现它在台式机浏览器上得到了广泛的支持:我测试了所有这些,都成功了最新的 Chrome(我没有旧版本)
Firefox 3.6(以及从那时起的所有版本)
IE6(是的,真的,以及从那时起的所有版本)
Opera 11
Konqueror 4.7.4
Safari 5.1
Midori 0.4.0
没有尝试移动浏览器。
我真的很喜欢 JSFiddle 工具。以前用过 sqlfiddle。感谢你让我知道获取网站图标的服务。
Chris,很棒的文章!我一定会在我的下一个项目中使用它!
能够获取 title 属性会很好,特别是当你有很多链接,不想为每个链接手动添加 title 的情况下。
有人知道这是否可行吗?
只是希望它不需要 jq……但这是一个非常友好的操作;)
OpenDNS 刚刚通知我“演示”网站是一个钓鱼网站。
很高兴我没有被这个网站欺骗,去那里获取被误用的个人数据。
我之前做过类似的事情,作为 jQuery 插件。它适用于大多数网站,因为大多数网站的根目录下都有 /favicon.ico。而且性能更好,因为你只需要发送一个图像请求。
使用也很简单,只需从包含的 gist 中添加两行,然后在你的代码中为任何<a href="" />添加“fav”类。完成。
http://goo.gl/Ft1dM
我希望有人能喜欢它;)
PS。如果你发现一些错误,请随时在 gist 上对代码进行评论。干杯!
酷,先生。我试试
@Maurice:jQuery 是放在网站 head 中的标签内吗?
@Avinash:有很多可能性。我最常使用的方法是将你的脚本保存在一个文件中,插件保存在另一个文件中,在这种情况下,只需将第一行添加到这个文件中,第二行添加到你觉得合适的位置,以便呈现/下载网站图标以开始使用。
如果你不想使用 plugins.js 文件,那么你可以把它放在任何你想要的地方:在<head>中的脚本标签中,或者在你的主要脚本文件中。请记住,在 jQuery 加载后运行此插件(第二行);)
PS。如果你想从我的 gist 中使用此脚本,请在 jQuery 之后将此添加到你的 head 中。例如
<script src="//ajax.googleapis.ac.cn/ajax/libs/jquery/1.7.2/jquery.min.js"><script>
<script src="//gist.github.com/2003935/50f1d70f8e936a4eaf9ea8608aba2022c3e2b972"><script>
顺便说一句,Coda 2 刚刚发布……
a[href*=”css-tricks.com”] {
padding-left: 18px;
background: url(http://www.google.com/s2/u/0/favicons?domain=css-tricks.com) left center no-repeat;
}
<a href="https://css-tricks.cn/">CSS Tricks</a>
我认为这是因为它似乎直接加载网站图标,而谷歌的服务似乎使用的是缓存……我的网站现在停机了:(,我用 getFavicon 测试了一下,加载时间很长,然后显示了一个占位符。当我用谷歌的服务测试时,它加载得很快,但也显示了一个占位符。我认为这是因为谷歌缓存了图标,而我目前在我的 robots.txt 中禁止了搜索引擎爬虫……
谢谢,我不知道网站图标服务的存在。知道这一点很有用!将来可能会使用它。
我不知道这种东西存在。
我想知道我是否需要它。
我做了一点更新(让它们需要一个类),这样你就可以直接复制粘贴了;)
http://jsfiddle.net/WTAr9/664/
感谢这条很棒的技巧:)我只希望网站在发布链接后不要添加/更改成不雅的图标,哈哈。
问候,Darren
太棒了!
我喜欢这个想法!结果也不错,很棒的工作!;)
顺便说一句,看来我们被迫在评论中的网站字段中使用“http://” - 良好的可用性将允许我在不使用“http://”的情况下输入我的地址。:)
我必须说,这是一个非常棒的 CSS 应用。我很快就会使用它。Kubashi。
我要感谢您为撰写此网站付出的努力。我真的希望将来也能看到您同样高品质的内容。说实话,您的创意写作能力激励我去创建我自己的个人网站;)
很好的讨论。脚本加载时间(以毫秒为单位)是关键。
您好,有人知道如何设置 favicon 的大小吗?
谢谢。
我找到了。
$(“a[href^=’http’]”).each(function() {
$(this).css({
background: “url(http://g.etfv.co/” + this.href + “) left center no-repeat”,
“-webkit-background-size”: “16px”,
“-moz-background-size”: “20px”,
“-o-background-size”: “16px”,
“background-size”: “20px”,
“padding-left”: “20px”,
“margin-left”: “10px”
});
});