CSS-Tricks 有一种非常酷的悬停链接样式方法。默认情况下,文本为常见的蓝色。但当鼠标悬停在链接上时,它们会填充线性渐变。


很不错,对吧?而且技巧并不复杂。在悬停时…
- 为链接提供 线性渐变 背景,
- 将背景裁剪到文本,以及
- 使文本填充透明,以便显示背景。
它在 CSS 中看起来像这样
a {
color: #007db5;
}
a:hover {
background: linear-gradient(90deg,#ff8a00,#e52e71);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
请注意 -webkit-
前缀,目前是必需的。CSS-Tricks 上的实际实现还有更多内容,但这一小段可以满足我们的需求。
但这不是重点。就在前几天,Brad Westfall 打电话告诉我们,此技术也会对表情符号起作用,就像任何其他文本一样,在悬停时会填充透明颜色。
他在我们的一篇文章中的一个链接上注意到这种情况。

这不是最糟糕的事情。而且完全说得通。我的意思是,表情符号是字形,就像字体文件中的任何其他文本一样,对吧?它们碰巧是彩色字体并采用图像形式。当然,在像这样我们挖空填充颜色的情况下,它们会被像任何其他字形一样对待。
但是,如果需要保持表情符号的颜色不变,可以通过将表情符号包装在 span 中并将其填充恢复到初始状态来解决。
但是谁想每次表情符号出现在链接中时都编写一个 span 呢?👎
如果您正在寻找 CSS 解决方案,我们有点走运了。也就是说,CSS 字体模块级别 4 规范包含对提议的 font-variation-emoji
属性的定义。但是,目前关于它的信息不多(我所能找到的),而且似乎并非为这种事情而设计,快速浏览一下 一些讨论 与该提案相关的讨论表明,它更多地与某些浏览器或系统如何自动将 Unicode 转换为表情符号以及如何控制这种行为有关。
在同一草案规范中,还提出了 font-palette
的定义,这似乎是一种控制彩色字体的方法——归根结底,表情符号就是这样。但这也不是解决方案。
似乎唯一无需 span 即可阻止表情符号填充发生变化的方法是某种 JavaScript 解决方案。看看 WordPress、Dropbox、Facebook 和 Twitter 等服务。它们都实现了自己自定义的表情符号集。它们使用什么?图片。

这将是一种方法。如果表情符号替换为图像(在此特定示例中为 SVG),那么这肯定可以将其排除在与链接文本一起填充之外。
或者,嘿,为什么不阻止我们陷入这种情况,并将那该死的东西放在链接之外?
这可能是我们应该一直采取的路线。但表情符号可能不会出现在链接的开头或结尾,而是在中间某个位置。它只是强调了在某些情况下拥有某种控制权可能派上用场。
Codepen 示例在 Firefox 中没有显示任何渐变。表情符号在这里是否也填充过度?使示例在非 Chrome 浏览器中也能正常工作是否非常费力?
将表情符号包装在 span 中似乎是最简单的解决方案。如果已经将 JavaScript 视为可能的修复方法,那么当页面呈现时,可能只需有一两行代码即可将链接内的所有表情符号都用 span 包裹起来。
这被认为是好的。
使用透明文本描边
‘-webkit-text-stroke: 1px rgb(0 0 0 / 0);’
我们可以让它在 Firefox 中工作。
正如 Alex Berkowitz 所说,您可以使用 JS 以机器人方式将所有表情符号都放入 span 中。但是
使用正则表达式在字符串中搜索表情符号结果相当复杂,但人们已经创建了一些工具来执行此操作。我在 GitHub 上找到了 satans17 的这个工具
`var unified_emoji_ranges = [
‘\ud83c[\udf00-\udfff]’, // U+1F300 至 U+1F3FF
‘\ud83d[\udc00-\ude4f]’, // U+1F400 至 U+1F64F
‘\ud83d[\ude80-\udeff]’ // U+1F680 至 U+1F6FF
];
var reg = new RegExp(unified_emoji_ranges.join(‘|’), ‘g’);`
一个我之前从未考虑过有趣的话题!如果必须将表情符号包含在链接本身中,则 span 解决方案似乎是最佳选择,并且不难自动化。