在网络上实现**挖空文字**(即文字看起来被挖掉,可以透过文字看到背景)效果有几种方法。有一种比较新的方法,浏览器支持度不错,非常有趣。但我们还是会全面介绍一下。
直接用Photoshop制作
就像其他任何东西一样,你可以用平面图形来伪造它。有时候值得考虑一下显而易见的方法。缺点是它不具有动态性/难以更改。你不能复制粘贴文本。图片文件大小可能很大,尤其是在追求更高分辨率的时候。等等等等。但是,你可以这样做,而且它在任何地方都能工作。

-webkit-background-clip: text;
这是一个非标准属性,但它被发明出来就是为了实现这个目的。美妙之处在于,你可以将其与-webkit-text-fill-color: transparent;
配对,这样你只在能够进行剪裁的浏览器中“隐藏”文本。几年前,Divya Manian 记录了这一点。
.clip-text-maybe {
/* if we can clip, do it */
-webkit-text-fill-color: transparent;
-webkit-background-clip: text;
/* what will show through the text
~ or ~
what will be the background of that element */
background: whatever;
/* fallback text color
~ or ~
the actual color of text, so it better work on the background */
color: red;
}
这是真正的网页文本,因此它具备了所有可访问性、可搜索性和易于更改等特性。
以下是Jintos使用此方法的一些有趣示例
查看 Jintos 在 CodePen 上创作的笔 -webkit-background-clip:text CSS 效果(@Jintos)。
像任何其他背景一样,如果需要,你可以固定其位置。以下是Richard Hayes对此的演示
查看 Richard 在 CodePen 上创作的笔 带固定背景的 Webkit 剪裁(@strawstack)。
SVG <pattern> 填充
SVG 也可以通过其<text>
元素包含真实的文本。SVG 文本可以使用任何填充,包括图案。而图案可以使用图像。所以……挖空文字!
例如:
<svg>
<pattern id="pattern" patternUnits="userSpaceOnUse" width="750" height="800">
<image width="750" height="800" xlink:href="image.jpg"></image>
</pattern>
<text x="0" y="80" class="headline" style="fill:url(#pattern);">background-clip: text | Polyfill</text>
</svg>
你可以在任何 HTML 中直接使用它。以下是 C.Y. Park 的一个示例
查看 C.Y. Park 在 CodePen 上创作的笔 带渐变和 GIF 的 SVG 文本剪裁(@cypark)。
Lea Verou 也记录了此技术。
使用 SVG 填充 CSS
Tim Pietrusky 创建了一个用于-webkit-background-clip
的 polyfill,它使用 SVG 方法作为回退。CSS 版本肯定比 SVG 版本更容易快速编写,因此在获得更好的浏览器支持的同时,这似乎是一个不错的选择。
查看 Tim Pietrusky 在 CodePen 上创作的笔 -webkit-background-clip: text Polyfill(@TimPietrusky)。
mix-blend-mode: screen;
这是我以前从未见过的新的方法!CSS 混合 比较新。它允许你像在 Photoshop 中分层样式一样(例如,“屏幕”、“正片叠底”、“亮光”等)将元素混合到其他元素之上。
如果操作正确,你可以在文本的正上方混合图像,而不会影响“真实”背景。我第一次看到 Giana 在 CodePen 上这样做
查看 Giana 在 CodePen 上创作的笔 Firefox 中的 CSS 渐变文本(@giana)。
它是这样工作的
- 将文本设置为黑色。
- 用新的文本背景覆盖整个文本,并使用
mix-blend-mode: screen;
。 - 然后用相同文本的新副本(白色)和页面相同的背景覆盖它,并使用
mix-blend-mode: multiply;
。
这将只留下带有“挖空”背景的文本可见。如果你使用pointer-events,你也可以使文本可点击和可选,尽管很难看到你在做什么。
这里的优点是,这是一种纯 CSS 方法,也可以在 Firefox 中使用,而不仅仅是-webkit-
的东西。
仅供参考,Photoshop 还有更好的方法。确保文本图层位于图像下方,然后按住 Alt 键并单击两个图层之间的区域。
然后你以后可以更改文本,蒙版将始终保持最新。
https://helpx.adobe.com/photoshop/using/revealing-layers-clipping-masks.html
感谢 Andrew 提供的信息,
不幸的是,如果它没有输出可访问的文本,可能会让企业陷入困境,更重要的是,会疏远无法访问以图像形式呈现的内容的潜在用户。
无论如何,这是一个很酷的链接,绝对是围绕图形或不包含文本主体的内容的视觉指示器进行挖空效果的最佳方法。
Lewis,Photoshop 中提出的第一个选项也没有。如果你要制作图像而不是文本,你最好像 Andrew 建议的那样设置剪切蒙版。
Lewis,是的。就像 Matth 所说:我只是建议使用工作流程来使最糟糕的解决方案稍微不那么痛苦。
同样,如果你使用 Photoshop 方法,你可能会保存很多视觉上复杂的 Png 文件。请记住压缩它们,每个人!http://pngmini.com 几乎是黄金标准。
我认为 Andrew 并不是暗示他的方法比使用 CSS 更好。他只是说,如果你必须使用 Photoshop,他建议的方法优于文章中的示例,因为它是非破坏性的。
有没有办法用 CSS 实现相反的效果?
相反的效果?你的意思是照片背景上方的白色文本?
Andrew,快速原型比文字更有效:https://cloudup.com/ctQdOssOX6h
规定:文本应保持可访问性,同时保持灵活,并且不应绑定到伪元素的
content
。Scott,
我仍然不确定我是否看到了区别。
我假设他的意思是你想将带有挖空文字的蓝色框放在图像的顶部。如果是这样,它在视觉上看起来就像上面的每个示例:纯色背景,图像剪裁到文本的边界内。
也就是说——如果你真的希望文本是透明的而不是剪切蒙版(再说一次,我不确定它们在现实世界中看起来有什么不同),那么你可能可以使用 SVG。我不知道怎么做,这只是随口一说。
Andrew,感谢你的回复。虽然效果可能与原始示例类似,但我试图实现的目标却大不相同。
仔细查看第一个示例,需要将背景颜色应用于剪裁文本(
clip-text_one
),并且它需要与父元素(body
)的背景颜色匹配才能实现效果。正确吗?我 fork 了原始笔,在其中我将背景图像应用于
body
,并故意将剪裁文本设置为紫色以便可以看到。我邀请你尝试使文本挖空以显示父body
。http://codepen.io/anon/pen/WQGGdx?editors=110
啊,我明白了。
我认为你所要求的可能无法实现。你可能不得不伪造它,并接受它在示例一中的工作方式(假设它看起来相同)。
如果你不喜欢这种复杂性,可以考虑创建一个 Sass mixin 来帮你处理所有事情?
使用混合模式方法时,无需重复文本。
如果你想要文本在白色背景上
mix-blend-mode: lighten
如果你想要文本在黑色背景上
mix-blend-mode: darken
在这个笔上可以工作 查看示例。
黑色或白色背景可以大大简化问题。笔的 CSS 中有一条注释提到了这一点,但它是通过移除伪元素文本而不是 HTML 文本来实现的。对于彩色背景,重复文本是一种糟糕的解决方案。我喜欢你版本简洁的方式。
请注意,对于第一种技术,
-webkit-text-fill-color
不是必需的,color
就足够了。我想这样做是因为,如果你想使用
-webkit-text-stroke
渲染一些带透明填充的描边文本,在不支持它的浏览器中将看不到任何内容。所以你可能需要使用
-webkit-text-fill-color
,并为其他浏览器回退到color
——它具有较低的优先级,如果-webkit-text-fill-color
没有用于其预期用途(你可以使用!important
与color
并且没有任何效果!),这可能会导致很多麻烦。最后,在支持
@supports
的浏览器中,可以完全放弃-webkit-text-fill-color
(包括 Safari 9 及更高版本)。我不确定我是否理解这里的意思。如果你不将文本设置为透明,你就看不到镂空效果。你可以使用
color
来做到这一点,但是回退则会变成不可见的文本(不好)。使用 SVG,你可以使用 clipPath 和渐变,甚至可以变得疯狂并为它制作动画! 查看示例
大家好!
“-webkit-background-clip: text;” 技术…
我不明白它是如何工作的,以及是否有效: 查看截图
我的浏览器 - Firefox 43.0a2。
Firefox 41.0 和 Rekonq 中显示类似。
唯一可以正常工作的浏览器是 Chrome
Firefox 无法识别大多数
-webkit
前缀,这很合乎逻辑,因为它的前缀是-moz
。haroen,
所以,你建议为“background-clip”属性添加“-moz”前缀?
“background-clip”属性在 Firefox 中无需前缀即可正常工作。但最终结果并不理想…
很久以前,我做了一个笔,用动画画布作为背景来重新创建镂空效果: 查看示例
相当简单的示例,可能这就是它没有被注意到的原因。可能会用更有趣的示例重新创建。;)