2014 年 4 月更新,内容更加现代化。
WebKit 支持酷炫的 background-clip
CSS3 属性,您可以用它做一些非常棒的事情。我们第一次接触到它是在 iPhone 的滑动解锁 想法中,我们设置了一个渐变来在文本背景中进行动画。然后我们在 透明边框 想法中再次接触到它。
让我们看看如何使用它来使图像仅通过文本的字母可见。这是另一件很酷的事情,我们不再需要羡慕印刷设计师的能力了。

基本思路
h1 {
color: white; /* Fallback: assume this color ON TOP of image */
background: url(images/fire.jpg) no-repeat;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
这就是全部内容。在元素上设置背景图像,然后裁剪它,并将文本填充颜色设置为透明。
问题
我确信每个人都痛苦地意识到,这并不会在所有浏览器中都起作用。当前的支持仅限于 WebKit。那么回退会发生什么?如您在上面的代码中看到的,您也声明了一个 color
值。此值在支持它的浏览器中会被 -webkit-text-fill-color
覆盖,因此我们在这里很清楚。然后在不支持 -webkit-background-clip: text
的浏览器中,我们将看到完整的背景图像,因此我们将看到背景图像上方的文本。因此,如果您不再阅读,请设置一个在该背景图像上清晰可见的颜色值。
所以我们得到了这样的效果

这并不是世界末日,至少我们准备了文本使其在某种程度上可读。但这与我们设想和 WebKit 用户将体验到的效果相差甚远。基本上:该回退很糟糕,让我们做得更好。
更好的回退
更好的回退的终极工具是 Modernizr。只需在您的页面上包含(相当小的)JavaScript 文件,它就会向您页面上的 html
标签添加类名,指示当前浏览器能够做什么。它还提供了一个用于在 JavaScript 中测试功能的 API,但我们今天不需要它。
不幸的是,Modernizr 没有开箱即用的 background-clip
测试。我问了其中一位创建者 Paul Irish,他为我提供了一种快速添加此测试的方法。整个部分
<script src="modernizr-1.6.min.js"></script>
<script>
Modernizr.addTest('backgroundclip',function() {
var div = document.createElement('div');
if ('backgroundClip' in div.style)
return true;
'Webkit Moz O ms Khtml'.replace(/([A-Za-z]*)/g,function(val) {
if (val+'BackgroundClip' in div.style) return true;
});
});
</script>
现在我们将知道当前浏览器是否支持 background-clip
,或者不支持。如果支持,则 html 标签将具有 backgroundclip
类,如果不支持,则将具有 no-backgroundclip
类。
现在我们仅在确定浏览器支持 background-clip
的情况下应用背景图像。
.backgroundclip h1 {
background: url(images/west.jpg) -100px -40px no-repeat;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
h1 {
color: orangered;
}
搞定,现在回退是一个纯色,而不是杂乱的图像剔除。

但是……没有完美的系统可以做到这一点。
Android(包括 4.2 在内)存在一个问题,即它实际上不支持 -webkit-background-clip
——即使任何测试都会返回它确实支持。该属性及其任何值(包括 text
)。即使 Modernizr 的 testAllProps()
也无法捕获它。但是 -webkit-text-fill-color
确实有效,因此您基本上会得到一个没有文本的图像。非常糟糕。
如果您绝对需要使用它,您可能只需要针对 Android 进行 UA 测试
var NastyBrowserSniffing = {
ua: navigator.userAgent.toLowerCase(),
init: function() {
var isAndroid = NastyBrowserSniffing.ua.indexOf("android") > -1;
if (isAndroid) {
$("html").addClass("android");
}
}
};
NastyBrowserSniffing.init();
如果是 Android,则恢复效果
html.android .gradient-text {
color: white;
background: none;
-webkit-text-fill-color: white;
-webkit-background-clip: border-box;
}
.gradient-text {
background: -webkit-linear-gradient(gray, black);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
相关
Stephen Morley 介绍了 如何使用滤镜为 IE 实现此效果。
太棒了!那么,Firefox 还没有实现吗?
Safari 在我的 Windows 上崩溃了??不确定是脚本问题还是 Windows 上的 Safari??
每次我在此站点上打开演示时,Chromium 似乎都会停止响应并且选项卡崩溃。一定是每个页面上都添加了一些内容,但它破坏了我的浏览器。
这是一个我之前测试过非常棒的技巧:http://valuedstandards.com/static/test/clip.html
但是,请注意,WebKit 可能会完全取消对 其他/更好的东西 的支持,例如在
color
属性上使用值。FF4 会支持这个吗?
目前,最新的 FF4 测试版 (b7) 不支持此功能。也许(希望)将来会支持。
这真的很棒。
不过有一点:替换方法不会运行大约 9-10 次吗,因为它也会在每个供应商前缀之间的空格处运行?使用 + 而不是 * 会更好吗?
'Webkit Moz O ms Khtml'.replace(/([A-Za-z]+)/g
这样,只有在实际捕获到某些内容时,回调才会运行。由于空格等效于 false,因此在这些情况下它永远不会运行。(但很小气,是的)。
非常酷的演示。
哦,我认为 Sebastiaan 是对的。也许像这样?
更简洁
'Webkit Moz O ms Khtml'.replace(/\w+/g, ...callback...)
我认为第二个“return true”语句不会实现预期的效果,因为它只是从传递给 replace() 的匿名函数内部返回。如何使用 returnValue 变量并在闭包内部设置它,然后在最后返回它?
似乎在 FF4 beta7 中也坏了。回退不起作用 :-/
我真的很喜欢访问你的网站,伙计,我是一个 CSS 轻量级用户,所以像 CSS3 这样的新东西让我感到震惊,有时它太庞大了,以至于我无法理解它。找到像这样的网站来帮助我们完成这个过程真是太棒了。干杯!
不错的技巧。
不幸的是,在 Android 上,您会在整个 div 上获得背景,而没有任何文本。
干得好,Chris!我非常喜欢你的实验。
这种效果让我第一反应是:为什么要费这个劲?它只在少数几个浏览器中有效,而且增加了什么价值呢?这里最好的解决方案是创建一个实际的图像,而不是使用 CSS 来实现,这样它就能在所有地方都能正常工作。
Bill,
虽然你的观点是有效的,但我认为 Chris 只是在展示一个概念证明。你是否需要将其部署到一个实际的网站上?也许需要,也许不需要。更重要的是,Chris 正在展示一种实验性的 CSS3 方法,更重要的是展示了一种优雅的回退方案。
Chris,你做的很棒。我很高兴你费心做了这个:) 迈向更美好网页的一小步!
你经常省略 -o- 前缀,导致 Modernizr 检测到支持并且不提供回退方案,反而导致渲染出现问题,就像这里一样。
不过,教程一如既往地很棒。
在 Chrome(XP 上)旋转时,这看起来非常卡顿,但水平显示时则正常。是 -webkit-transform 问题吗?
看到 CSS 现在能实现的功能真的很酷,但我真的会用 Photoshop 来处理这种效果。
此测试的问题在于它测试的是 background-clip 属性,而不是特定值(text)。background-clip 受所有现代浏览器支持(甚至 IE9),但“text”值是非标准的 Webkit 扩展。因此,本质上,“更好的回退方案”只会应用于根本不支持 background-clip 的旧浏览器,并且会在不支持 Webkit 的现代浏览器中失败,因为它们只支持它的标准值。
你可以只测试“text”值,方法是尝试将其应用于 background-clip 属性的支持版本,并查看浏览器是否接受它(通过随后尝试获取它,在 try…catch 结构中,因为某些 IE 会针对不支持的值抛出错误)。我还没有尝试过,但这通常适用于测试 CSS 值的支持。
它真的很好。如果它在所有浏览器中都能正常工作,则无需在 Photoshop 中创建这种蒙版效果。
-vara
这将非常有用,只是想知道除了 Webkit 之外的其他浏览器的支持情况。
这(显然)也适用于渐变背景(就像 Chris 在这篇文章中展示的那样)。
但是,如果你现在应用 text-shadow,背景将不会显示,因为阴影显然是整个文本下方的实心“层”。
Jeffrey Way 在这篇文章中描述了一种同时拥有渐变文本和文本阴影的方法,这涉及在你的样式表中复制内容,对我来说这是一个很大的禁忌。
Webkit 应该创建 text-shadow-clip 属性(当然可以)或者允许我们像在背景属性上一样,在文本颜色属性上设置图像或渐变。
哈哈哈..太神奇了。在 Chrome 7.0 中有效(但“旋转文本”无效,鼠标悬停时会变直/不旋转),在 FF 中无效(只有颜色,没有图像),在 Opera 10 中效果很差(像带有图像背景的 div)。但尝试很好 :D
很棒,非常棒的 CSS 与文本结合使用。LT
我希望,当使用移动的 div(滚动)并将背景图像更改为半透明 png 时,这将允许我看到 div 滚动在其上的图像。
遗憾的是,它做不到。
有谁知道如何从具有纯色的 div 中“挖出”文本?将文本设置为透明不起作用。
Firefox 不适用这些技巧吗?在 Safari 中效果很好,感谢分享!
每次尝试观看演示时,演示都会导致我的 Safari 崩溃。也许这个看起来很有趣的功能并不完美。
太棒了
它在 IE 上也能工作吗?
很棒的文章!很酷的技巧!我喜欢它!
它也导致我的 W7 上的 Safari 崩溃了……
如果你有我认为 CS2 之后任何版本的 Photoshop,你也可以制作一个 Photoshop 图像并创建剪贴蒙版。
我尝试在内联 SVG 上为 Mozilla 和 Opera 模拟此属性。
http://www.myadzel.ru/tests/html/text-background/
排序发生了。
嗨,我喜欢 Modernizr 微调的想法,尽管它在我的 FF 27.0.1 中不起作用,因为它在该浏览器中显示 backgroundclip。
使用以下方法怎么样?
@media(-webkit-min-device-pixel-ratio:0){.textbg{background:url(bg.jpg)}}
.textbg{-webkit-background-clip:text;-webkit-text-fill-color:transparent;-webkit-text-stroke:1px black}
?
您,先生,真是太棒了。
这里更新了什么?对我来说,它对所有浏览器(从 Chrome 到 ie7)都应用了 backgroundclip 类。您在更新后/使用更新的 Modernizr 测试过它吗?