以下是 Chris Scott 的客座文章。Chris 正在尝试使用 SVG 滤镜以及如何将其应用于文本。我认为这很有趣,因为 SVG 滤镜与 CSS 滤镜有很大不同。可以说更强大,因为它们种类更多,并且可以执行诸如斜角/浮雕或描边等 CSS 滤镜无法实现的操作。Chris 在这里详细介绍了操作方法,包括一个使其更加简单的工具。
近年来,Web 开发中出现了一种普遍趋势,即在设计中减少使用图像。就在几年前,软件公司更倾向于使用圆角图像作为最佳的“跨浏览器”解决方案;而如今,CSS 属性 border-radius
使该技术显得非常过时。标题是这种趋势的另一个例子,过去人们可能在 Photoshop 中生成一个花哨的横幅标题,并使用图像将其显示在页面上。如今,我们可以使用网络字体和 CSS3 来帮助我们实现阴影和其他效果。这些解决方案加载速度更快、扩展性更好,并且更易访问且语义正确。但我们还可以做得更多!
SVG 滤镜
带有滤镜效果的 SVG 具有实现复杂文本样式的巨大潜力。请查看此示例
查看 CodePen 上 chrismichaelscott (@chrismichaelscott) 编写的笔 SVG 滤镜应用于文本
该行是使用 SVG 滤镜效果创建的。它只是一段文本。您可以使用光标选择它。搜索引擎可以索引它。它可以在不损失质量的情况下缩放大小。此外,下载时间非常短。您还可以实现更多功能,滤镜效果的创意空间非常大。该示例是使用名为 Raphael.js 的库和为其编写的扩展创建的。本文讨论了开发该扩展的理由,并简要介绍了如何使用它。
显然,只有 0.1% 的网页使用 SVG 图形。如果该统计数据有任何意义,那么您可能没有定期使用 SVG。为什么 SVG 的使用率如此低?这只是猜测,但我没有使用 SVG(直到我不得不使用)的原因是它的学习曲线:SVG 是一种 XML 词汇表,我认为它非常技术性(例如,颜色转换的矩阵乘法?)。我开始使用 SVG 的方式是通过 Raphael.js,这是一个用于创建矢量图形的 JavaScript 库。因为它是一个 JavaScript 库,所以感觉相当熟悉,所有复杂性都被抽象掉了。不久之后,我就像专业人士一样创建了复杂的图形。
Raphael 的滤镜效果
不过,Raphael 也有一个缺点:不支持滤镜效果。我记得我的一个客户特别要求在交互式和动画数据可视化中为气泡添加投影。这个请求让我困惑了一段时间,因为我遇到了 Raphael 的这个限制。对于那个项目,我为 Raphael 写了一个非常特殊的扩展来处理投影。但最初让我对 SVG 望而却步的复杂性又回来了,而且比以往任何时候都更糟糕。毫无疑问,滤镜效果非常非常技术性。
因此,在那个项目之后,我开始构建一个功能更全面的库,以便像 Raphael 使绘制形状变得容易一样,使滤镜效果也易于应用。
推出 Raphael 的滤镜效果!
以下是使用方法
首先是 HTML。这部分非常简单,只是一个带有 id
的 div
<div id="title-container"></div>
其他所有操作都在 JavaScript 中完成。
要使用 Raphael 开始 SVG 绘制,您可以通过引用容器元素的 id
来创建“画布”
var paper = Raphael("title-container");
现在开始绘制。此示例创建了一些文本并设置了一些样式属性
// The first two arguments are the origin of the text
var title = paper.text(0, 30, "Filters are ice cold");
title.attr({
"fill": "MintCream",
"font-family": "Butcherman",
"font-size": "54px",
"text-anchor": "start"
});
现在添加一些效果!您可以执行的最简单操作是阴影、模糊、灯光、浮雕和颜色转换。这些操作需要很少的代码。让我们尝试一下浮雕效果。添加到 JavaScript 中
title.emboss();
您可以链接效果,因此随后应用阴影非常简单
title.emboss().shadow();
很酷,对吧?如果您愿意,可以更进一步,创建自己的滤镜。SVG 规范列出了可以组合以创建各种滤镜的(较低级别的)滤镜效果(特别是卷积矩阵可用于大量操作)。
此演示包含完整的代码以及其他一些可以实现的不同效果示例
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的笔 SVG 滤镜应用于文本。
缺点
SVG 的缺点是什么?好吧——除了矢量与光栅(如 canvas
)的优缺点之外——我能想到几个
- 浏览器支持——您可能不会惊讶地发现,此处讨论的图形技巧在旧版本的 IE 中不受支持,仅支持 IE10。SVG 本身会在 IE9 中呈现,只是没有效果。Firefox、Chrome 和 Opera 已经支持滤镜效果很长时间了
- 语义——有些人可能对在文档中使用 SVG 的语义有效性有所保留,当然
svg
标签没有提供任何关于其内容的线索;不过,您可以使用一个合理的父元素
总结
希望本文能让你了解滤镜效果的功能以及 Raphael 的滤镜效果如何实现它们。查看 Github 上的项目页面以了解更多详细信息。感谢阅读!
“只有 0.1% 的网页使用 SVG 图形。”
这太糟糕了!
我总是尝试尽可能多地使用 .svg 图形。查看在高 PPI 智能手机、平板手机等设备上显示矢量图的网站,以及一个不使用矢量图的网站。在“弹出”和清晰度方面存在巨大差异:这几乎就像观看旧电视和高清电视之间的区别。
对于 IE 和 Droid 2.x 用户群来说,优雅降级相当容易,并且每个人的设备都将很快适应 .svg。您将为 4K 台式机和笔记本电脑做好未来准备。位图很快就会显得过时。
放手去做吧!
是的,我尝试在任何时候都使用 SVG,因为我讨厌管理 @2x 图像的想法。我不想做任何重复的事情。SVG 可以解决其中大部分问题(当然还有 PNG 备用方案,但这很容易)。
在 1:1 像素比例的显示器上,SVG 在小图标中看起来非常模糊。在这种情况下,位图胜出。
很酷的东西。不过,另一个可能值得一提的缺点是浏览器性能。滚动经过演示时非常卡顿和缓慢。
我认为这很棒,并且潜力巨大,但我也要说这些滤镜中的一些质量还有待提高。在 OS X 版本 10.8.4 的 Chrome 28.0.1500.95 上,您初始示例中的一些字符仍然像素化。就像我说的,看到这种潜力仍然很酷。
我之前偶然发现了 SVG 文本滤镜,但在我意识到它们糟糕的移动兼容性(没有 Android,只有 iOS 6+)之后,我决定它们目前不值得付出努力。
这正是我想到的——Wordart。不过,喜欢这种风格的网页会很喜欢它。
那Wordart是不是要卷土重来了?
请不要这么说。
这就是我以为这些示例看起来的样子!:X
遗憾的是,我的三星Note 8使用谷歌浏览器时出现渲染问题(在某些情况下,示例根本没有显示)。但是,随着响应式设计和高分辨率显示器导致图像文件大小增加,我认为矢量将发挥巨大作用。
很棒的文章。
现在可能在所有网站上推广这个技术还为时尚早,但了解未来可能会发生什么总归是好的。
我非常感兴趣地看到我的邮箱收件箱里出现了这篇文章,文字应用了过滤器。而且是在Outlook里看到的。
我转发给了其他几个账号,但其他地方都没有成功。如果我有时间,可能会做一个完整的兼容性测试。
干杯。
非常有趣……对于简单的标识来说可能很棒……
我正在努力解决的一个问题是如何使这样的文本像应用了“max-width”属性的图像一样进行缩放。例如,如果你使用几个SVG文本创建了一个基本的标识logo并很好地(但精确地)定位它们,是否可以使SVG输出像应用了max-width属性的图像一样缩放,即自动缩放但保留内部布局和比例……显然,可以使用缩放/转换来实现这一点,但如果它不需要任何设计师的输入,并且可以像响应式图像一样工作,那就太好了……
SVG能否用来实现这样的效果?
当我滚动到包含4条不同线条的示例时,我的浏览器开始变得非常卡顿。重绘速度大约是正常速度的5%,无法想象在移动设备上,尤其是性能较低的移动设备上会是什么样子。就性能而言,图像似乎仍然是最佳选择。
我不明白为什么你要为此使用Raphael,因为Raphael相对于其他绘图库的主要优势在于其VML兼容性层,但这些效果仅限于SVG。这样做有什么特殊原因吗?
很棒的文章!
这里有一个修改后的示例,这样你就可以将文本放在html标签内以实现可访问性,并让JS从那里提取文本。
嗨,Chris,
我刚刚注意到,当我使用“Pin It”书签工具来收藏你的文章时,没有合适的图片显示出来:http://imgur.com/9P1G8Uc
如果每篇文章都有一张相关的静态/特色图片,Pinterest可以抓取并吸引人们点击,这将非常有帮助——仅供参考 :)
Danielle
有趣的是,我上周也在处理类似的想法,尽管我非常希望更频繁地使用它,但浏览器之间的文本渲染不一致性使得它有点棘手。虽然CSS样式功能各不相同(例如,字母间距)并且相当有限(是的,我知道Mozilla的开发者将在未来版本中分享一些关于它的爱),但更大的问题是缺乏简单的自动换行功能,这使得它难以(阅读:难以处理)用于响应式网页设计。=
这真的很可惜,但我认为明年随着SVG 2.0的“发布”,这些情况将会发生改变。