SVG 信息汇编

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 提供适用于您每个阶段的云产品。从 $200 的免费额度开始!

关于 SVG 的大量信息。

如何使用 SVG

这些是概述文章,涵盖了与 SVG 相关的许多内容。为什么要使用它以及如何使用它的基础知识。主要包括:<img>background-image<svg><iframe><object>/<embed>

SVG 作为图标系统

SVG 特别适合图标。除了分辨率独立性和样式可能性之外,图标的形状通常很简单,因此文件大小很小,可以像精灵图或图标字体一样组合到单个 Web 请求中。

我已经写了很多关于这个

以及其他人的更多信息

所有这些都基于 SVG 内联系统,这是一种很棒的方式,但如果您使用的是 SVG 作为 CSS 背景图像…

  • Filament Group 的 Grunticon: 文章仓库浏览器内工具。它将 SVG 文件夹转换为 SVG 数据 URI,然后从那里回退。Grunticon 2 可以渐进增强到内联 SVG。您还可以从内联 SVG 开始,并 回退到 Grunticon
  • 您无法通过 SVG 背景图像动态调整填充颜色(Grunticon 建议只需制作多个版本,因为 GZip 对此非常有效)。但 Zach Schnackel 提供了 一种巧妙的技术,该技术使用 CSS 预处理器来获取文件,将其转换为数据 URI,然后替换填充颜色。
  • 如果您想为用作背景图像的 SVG 着色,这有点棘手,因为您无法直接在 CSS 中控制它。Noah Blon 提供了一些技术

请记住,如果您正在寻找要使用的 SVG 图标,任何矢量都可以使用。您不必专门寻找“SVG 图标”。即使使用图标字体,您也可以在本地激活该字体,键入您想要的图标字符,将其转换为轮廓,然后将其保存为 SVG。

以下是一些导出到内联 SVG 精灵图的 Web 应用程序

SVG 形状语法

SVG 模式

在 SVG 中,您可以使用颜色和渐变填充形状,但您也可以指定 <pattern> 来填充。<pattern> 是其他 SVG 元素的重复组,因此它有点像在您的 <svg> 中放置一些 <svg>

SVG 尺寸(视口、视区和 preserveAspectRatio)

你现在正在查看的浏览器窗口就是一个视口。如果页面上有一个 <iframe>,它也会有自己的视口。<svg> 也是如此!不过有点棘手,因为 SVG 还有个 `viewBox` 属性,它是 SVG 元素实际绘制的空间。`viewBox` 属性结合 `preserveAspectRatio` 属性,决定了 SVG 如何以及在何处在视口中绘制。

SVG 渐变

SVG 中的 `fill` 只是一个属性(或应用于 CSS),而 SVG 渐变实际上是一个特殊的元素:`<linearGradient>`。CSS 也有渐变,但是由于 SVG 渐变(可以)在 DOM 中,因此在某些情况下,它们更容易操作。

此外,它们在 IE 9 中有效,而 CSS 渐变则无效。

SVG 和片段标识符

SVG 中的 <use> 元素允许你复制 SVG 的一部分并在其他地方使用。但这只适用于内联 SVG。如果你想在 CSS(`background-image`)或 HTML(`<img>`)中使用 SVG 文件中的特定部分,则需要片段标识符。

SVG 描边

SVG 都是关于绘制形状的。就像在 Adobe Illustrator 这样的设计程序中一样,你也可以将 **描边** 应用于这些形状以及填充。

SVG 和文本

SVG 有一个 <text> 元素,它允许你向图形中添加文本(你猜对了)。真实的、原生网页文本,而不是字符轮廓,这 1)使其更实用(可选择、可搜索) 2)使其更具可访问性 3)保持尺寸较小。就像普通的网页文本一样,你可用字体受到给定浏览器/平台/版本中可用的字体或通过 `@font-face` 加载的字体的限制。

动画 SVG

三种方法 来动画 SVG。CSS 和 SMIL 是“声明式”方法,当然 JavaScript 也可以做到。

SMIL

SVG 语法有一个专门的 <animate> 标签,尽管它有点复杂。这被称为 SMIL(同步多媒体集成语言),SVG 也在一定程度上扩展了它。

CSS

如果您使用内联 SVG,您还可以使用 CSS 针对 SVG(或其中的形状)进行样式设置并使用 CSS 动画进行动画。

JavaScript

您也可以使用 JavaScript 来操作(从而动画)SVG。另请参阅下一节中的库。这些库通常具有动画功能。

其他

为了好玩,看看 Dennis Gaebel 的 SVG 动画集合

SVG JavaScript 库

  • D3.js (数据驱动文档) 由 Mike Bostock 编写
  • Snap.svg (Dmitry Baranovskiy/Adobe 的新东西 – 类似于 SVG 的“jQuery”)(Sara Vieira 的入门指南)
  • Raphaël (Dmitry Baranovskiy 的旧东西)
  • Bonsai – “一个具有直观图形 API 和 SVG 渲染器的轻量级图形库。”
  • SVG.js 由 Wout Fierens 编写
  • Fabric.js (SVG-to-canvas & canvas-to-SVG) 由 Juriy Zaytsev 编写
  • Two.js – “一个面向现代 web 浏览器的二维绘图 API。它与渲染器无关,使相同的 API 能够在多个上下文中绘制:svg、canvas 和 WebGL。”
  • Paths.js – “为几何形状生成 SVG 路径”
  • VLEX – “矢量布局表达式”
  • jQuery,凭借其 DOM 操作能力,可以修改内联 SVG 属性,并且通常可以处理 SVG DOM,但它在创建和注入 <svg> 元素方面存在问题,因为它不使用正确的命名空间。解决方案:先将其放在 <div> 中。
  • Ben Howdle 的 deSVG 通过 Ajax 获取内联 SVG 来替换 <img> SVG,因此您可以对其进行样式设置并执行所有可以使用内联 SVG 执行的酷炫操作。注意:需要两次请求。

使用 SVG 绘制图表

SVG 没有任何特定于图表的功能,但它有很多功能可以很好地用于创建图表。

还有许多功能齐全的库可以构建出很棒的图表。例如

组织 SVG

就像有 HTML 标签来组织内容一样,SVG 中也有标签来组织图形。例如,<g>(组)标签类似于 <div>。它本身并没有太多意义,但它很有用,因为它意味着您可以对其进行样式设置并让这些样式影响整个组。

SVG 和字体

  • 曾经,@font-face 生成器会制作字体 SVG 版本。我认为这是 iPad 的某些生成版本所必需的。它并不是真正的独立格式,而是在 SVG 中嵌入的另一种字体格式,从而使其工作。我相信我们现在已经不再做这件事或讨论它了。
  • SVG 和 OpenType 字体中的颜色 Johannes Lang

SVG 剪裁/蒙版

您可以绘制形状/路径来隐藏其他位于其内部/外部的形状/路径。

SVG 生成工具

在网站上使用 SVG 的一种常见方法是拥有一个“包含许多 SVG 的文件夹”,您打算在整个网站中使用它们。出于性能原因,您不希望单独请求每个 SVG。这些生成工具以某种方式将它们组合在一起。或者,它们可以帮助您对 SVG 执行某些有用的操作。

浏览器工具

  • IcoMoon Keyamoon(选择您想要使用的图标,仅以 SVG 雪碧图输出。将它们拖放到您自己的 SVG 中。保存项目以稍后更新。)
  • Fontastic 输出 SVG 雪碧图
  • Iconizr Joschi Kuphal (仓库)(结合了许多功能)

Grunt

Gulp

仅命令行

获取 SVG 使用

有许多方法可以获取您需要的 SVG。

  • 学习 SVG 语法。(查看部分)
  • 学习使用矢量编辑软件。(查看部分)
  • 从互联网下载矢量素材。记住,任何矢量都可以转换为 SVG(例如,您可能找到 .eps 或 .pdf,但其中包含矢量内容,因此在 Illustrator 中打开/操作,另存为 .svg)。
    • The Noun Project 上的所有内容都是 SVG
    • 库存照片网站通常有方法仅返回矢量搜索结果。(例如,ShutterstockVecteezy
    • 记住字体是矢量的,因此图标字体是矢量的,因此图标字体集中的任何图标都可以是 SVG。(下载并激活字体,在 Illustrator 文档中输入该字体的字符,转换为轮廓,另存为 .svg)以下是 的一大堆图标字体。
    • SVGCuts (免费类别)
    • Pinterest
    • Foundry:“提供新一代矢量资产和无限可能性” by thoughtbot
    • SVG Porn(流行内容的 SVG 格式的徽标)

SVG 演示

  • SVG Fancy Town: 我发现的展示 SVG 世界中一些酷炫或有趣内容的 Pens 集合。
  • Codrops 有很多 不错的 SVG 演示
  • SVG Wow
  • Erik Dahlström 的 /svg/
  • 通过 SASS 动态生成的 SVG + 3D 动画 RGB 立方体! Lea Verou
  • Patatap – Jonathan Brandel 使用您的交互动画 SVG 和音乐的超级有趣的演示。
  • rafszul 的复杂 SMIL 动画 一只狼在奔跑
  • SVG 非常适合“响应式徽标”的概念。Joe Harrison 的 这些 是 SVG,但实际上更像是 CSS 雪碧图,因为它们是正在交换的完整图形。Jeremy Frank 有一篇博文 关于根据可用空间样式/隐藏/显示/移动 SVG 的部分。
  • HalfTone.svg

    您是否怀念曾经打开报纸欣赏精美半色调黑白印刷品的日子?使用完全可缩放的 SVG 重现这种神奇体验(减去墨迹和纸张气味)。

SVG 滤镜

有 CSS 滤镜,允许模糊等常见操作。SVG 有自己的滤镜集(CSS 滤镜来自这里),其中包括这些常见操作,但也包含更多内容,包括更像是 Photoshop 滤镜的奇怪和独特的操作。SVG 滤镜可以应用于 HTML 内容和 SVG 内容。

数据 URI 和 SVG

内联 SVG 的一个优点是不需要进行网络请求。绘制 SVG 的信息就在那里。数据 URI(有时是“Base64”编码,有时是实际的 <svg> 语法(UTF-8))也实现了无请求渲染(这才是重点)。

SVG 和 CSS

CSS 可以影响内联 SVG 的大多数方面,但 SVG 也有自己的一组 CSS 属性。

SVG 和照明

优化 SVG

在网络上使用之前,对图像进行优化非常明智。对于栅格图像,即使您已经保存了您觉得最小的、质量最低的图像,像 ImageOptim 这样的工具也可以在不影响质量的情况下进一步缩减文件大小。

SVG 也是如此!

SVG 软件

桌面软件

浏览器软件

移动应用程序

代码编辑器中的 SVG 内容

SVG 安全性

可访问 SVG

我不是可访问性专家,但我可以告诉您,SVG 在可访问性社区中得到了不错的认可。当然,您仍然需要正确地使用它。

SVG 和响应式设计

这里有一些重叠。一个是在于 SVG 的固有灵活性、锐度和小型文件大小,这与响应式设计中跨设备的理念非常契合。第二个是,由于 SVG 有自己的视口,因此它们内部的 CSS 媒体查询有点像传说中的“元素查询”,它们基于自身。

SVG 和 JavaScript

SVG 的一个优势是形状在 DOM 中。例如,也许一个 <svg> 有一个 <rect> 和一个 <circle>。通过 JavaScript,您可以将事件处理程序绑定到 <rect>,并将不同的事件处理程序绑定到 <circle>。

SVG 和光栅图形

SVG 和 CMS

SVG 浏览器支持

所有当前版本的浏览器以及几个版本以前都支持 SVG。最大的问题通常是 IE 8 及更低版本以及 Android 2.3 及更低版本。但这只是基本的 SVG 支持(内联、<img>、CSS 背景)。SVG 的子功能具有不同的浏览器支持级别。Can I Use... 很好地跟踪这些内容。

SVG 回退

如果您需要支持不支持 SVG 的旧浏览器(请参阅 浏览器支持 部分),有很多方法可以将资源回退到可用的资源(例如,将 image.svg 替换为 image.png 或类似内容)。

  • SVG 回退的完整指南 Amelia Bellamy-Royds 和我。这里有一个 旧指南,它主要是对一个特定的不太好的情况的反应。
  • 测试 SVG-as-img 的支持
  • SVG for Everybody Jon Neal。语法:<svg><use xlink:href="spritemap.svg#icon"></use></svg>。要么直接工作,要么 ajax 并替换(对于 IE),或者放入备用 PNG。
  • SVG Injector 来自 Iconic 人员(一个非常棒的图标集作为内联 SVG 和各种备用方案)。语法:<img data-src="svg/thumb-up.svg" data-fallback="png/thumb-up-green.png">。将注入内联 SVG 或备用方案。
  • Iconic 还有 开源 他们的 Illustrator 导出器和 Grunt 工具包。
  • 前端 SVG 黑客入门 David Bushell
  • SVGEezy Ben Howdle 和 Jack Smith。在 HTML 中使用 .svg,如果浏览器不支持,则将其替换为 .png。请记住,当您使用 src 时,预取器是最好的,因此这将受到双重请求的影响。
  • 在移动浏览器中处理 SVG 图像 Krister Kari
  • 在 Android 2.x 上使用 SVG Todd Anglin
  • 重新审视 SVG 工作流程以提高性能和渐进式开发,使用透明数据 URI Todd Motto
  • 托德·莫托还描述了一种不错的测试内联 SVG 支持的方法,他在其中使用 createElementNS 创建 SVG 元素并应用矩形来查看它是否有效。
  • 如果你想像链接 SVG 文件一样进行编写(例如 SVG-as-img),但实际上是插入内联 SVG,并且你正在使用 Angular.js:查看此。你可能可以将其与支持测试结合起来,然后在不支持的情况下使用备用方案。
  • 一种技术由 Artur A 提供的内联 SVG 回退方案。它有点复杂,包括 <switch><foreignObject> 以及页面上的 CSS 和内联 SVG 中的 CSS 之间的相互作用,但它似乎有效。其理念是不使用 <img src>,因此不会进行双重下载,并且如果不需要,也不会下载背景图像。
  • SVG 魔术 – jQuery 插件,提供 PNG 回退方案。SVG 魔术的很大一个优点是它为你创建 PNG 图像,而不是需要你自己创建。更简单,但要注意它会向第三方网络发出请求来执行此操作。
  • svg-fallback 由 yoskel 创建。(Grunt 任务)
  • 将 SVG 拖放到 PNG 的转换 在 OS X 上。
  • 旧版:svgweb 将使用 Flash 进行 SVG 回退。

SVG 规范

W3C 负责指导浏览器实现 SVG 的语法。技术上有一个完整的SVG 工作组。SVG 1.1 是最终版,SVG 2 处于草案阶段。(阿米莉亚·贝拉米-罗伊德斯的一点历史。)

  • SVG 1.1(推荐状态)
  • SVG Tiny 1.2(据我所知,并没有真正使用,即使你可以从 Illustrator 导出它。它原本是为了旧款 BlackBerry 而设计的)

    SVG 1.2 Tiny 是为各种设备(从手机和 PDA 到笔记本电脑和台式电脑)实现 SVG 而设计的配置文件,因此包含了 SVG 1.1 Full 中包含的功能子集。

  • SVG 2(编辑草案状态,也位于此处)显然将包含诸如描边定位(内部、外部、中间)等内容。

    这个版本的 SVG 基于 SVG 1.1 第二版,通过提高语言的可用性以及添加作者通常请求的新功能来改进。

    说到 SVG 2,这里有Tavmjong Bah 讨论了一些新功能。我听说 z-index 也将在 SVG 2 中出现,但现在你必须更改源顺序来复制它。

  • 还有一些专门针对标记描边的规范。

SVG 会议

有很多事情可以讨论!尤其是现在 SVG 在浏览器中的支持水平如此普遍的时代。

幻灯片

视频形式的演讲

播客

SVG 书籍

SVG 错误

希望到目前为止,SVG 已经是一个庞大的宇宙。有如此多的功能,以及功能与其他功能和技术相结合,因此出现错误和浏览器不一致性也就不足为奇了。

杂项

强制性的随机事物!

SVG 2