<路径 clip-rule="evenodd" d="M33.377 4.574a3.508 3.508 0 0 0-2.633-1.126c-1 0-1.993.67-2.604 1.334l.002-1.24-1.867-.002-.02 10.17v.133l1.877.002.008-3.18c.567.611 1.464.97 2.462.973 1.099 0 2.022-.377 2.747-1.117.73-.745 1.1-1.796 1.103-3.002.003-1.232-.358-2.222-1.075-2.945Zm-3.082.55c.637 0 1.176.23 1.602.683.438.438.663 1.012.66 1.707-.003.7-.22 1.33-.668 1.787-.428.438-.964.661-1.601.661-.627 0-1.15-.22-1.6-.666-.445-.46-.662-1.086-.662-1.789.003-.695.227-1.27.668-1.708a2.13 2.13 0 0 1 1.596-.675h.005Zm5.109-.067-.008 4.291c-.002.926.263 1.587.784 1.963.325.235.738.354 1.228.354.376 0 .967-.146.967-.146l-.168-1.564s-.43.133-.64-.01c-.198-.136-.296-.428-.296-.866l.008-4.022 1.738.002.002-1.492-1.738-.002.005-2.144-1.874-.002-.005 2.143-1.573-.002 1.57 1.497ZM20.016 1.305h-9.245l-.002 1.777h3.695l-.016 8.295v.164l1.955.002-.008-8.459 3.621-.002V1.305Z" fill="#262D3D" fill-rule="evenodd"><路径 clip-rule="evenodd" d="M10.06 5.844 7.277 3.166 4.015.03 2.609 1.374l2.056 1.978-4.51 4.313 6.065 5.831 1.387-1.327-2.073-1.994 4.526-4.331ZM4.274 8.7a.211.211 0 0 1-.124 0c-.04-.013-.074-.03-.15-.102l-.817-.787c-.072-.069-.092-.104-.105-.143a.187.187 0 0 1 0-.12c.013-.039.03-.07.105-.143L5.76 4.938c.072-.07.108-.09.15-.099a.21.21 0 0 1 .123 0c.041.012.075.03.15.101L7 5.727c.072.07.093.104.103.144.013.04.013.08 0 .119-.013.04-.03.072-.106.143L4.422 8.601a.325.325 0 0 1-.147.099Z" fill="#204ECF" fill-rule="evenodd"><路径 clip-rule="evenodd" d="M24.354 4.622a3.94 3.94 0 0 0-2.876-1.149 4.1 4.1 0 0 0-2.829 1.084c-.804.725-1.214 1.733-1.217 2.992-.002 1.26.405 2.267 1.207 2.995a4.114 4.114 0 0 0 2.832 1.094c.04.002.082.002.123.002a3.967 3.967 0 0 0 2.75-1.138c.538-.532 1.183-1.473 1.186-2.938.002-1.465-.637-2.408-1.176-2.942Zm-.59 2.94c-.003.73-.228 1.334-.671 1.794-.441.458-.99.69-1.633.69a2.166 2.166 0 0 1-1.614-.697c-.43-.45-.65-1.057-.65-1.797s.222-1.344.655-1.795a2.17 2.17 0 0 1 1.617-.69c.64 0 1.189.235 1.63.698.443.46.668 1.064.665 1.797ZM41.15 6.324c0-.458.25-1.465 1.632-1.465.49 0 .768.159 1.003.347.227.18.34.626.34.994v.174l-2.282.341C40.035 6.98 39 7.913 38.993 9.28c-.002.708.266 1.314.777 1.76.503.438 1.191.67 2.004.673 1.023 0 1.792-.354 2.341-1.084.003.31.003.621.003.91h1.903l.013-5.246c.002-.856-.289-1.685-.864-2.14-.567-.449-1.31-.679-2.386-.681h-.015c-.82 0-1.69.208-2.274.695-.689.572-1.027 1.478-1.027 2.178l1.682-.02Zm.864 3.814c-.676-.002-1.115-.371-1.112-.938.003-.589.43-.933 1.346-1.081l1.875-.305v.017c-.005 1.36-.87 2.307-2.102 2.307h-.008Zm4.917-8.712-.018 10.058v.044l1.684.005.018-10.06v-.045l-1.684-.002Zm2.654 9.491c0-.173.062-.322.19-.445a.645.645 0 0 1 .462-.186c.18 0 .338.062.465.186a.596.596 0 0 1 .193.445.583.583 0 0 1-.193.443.644.644 0 0 1-.465.183.634.634 0 0 1-.461-.183.59.59 0 0 1-.191-.443Zm.108 0c0 .146.052.273.158.376a.54.54 0 0 0 .389.154.539.539 0 0 0 .547-.53.498.498 0 0 0-.16-.373.531.531 0 0 0-.387-.156.531.531 0 0 0-.387.155.497.497 0 0 0-.16.374Zm.702.344-.176-.3h-.118v.3h-.109v-.688h.292c.144 0 .23.082.23.196 0 .096-.076.168-.176.188l.178.304h-.121Zm-.294-.596v.21h.167c.093 0 .14-.034.14-.104 0-.072-.047-.106-.14-.106h-.167Z" fill="#262D3D" fill-rule="evenodd">< / svg >作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

菲利普迪娃

菲利普是一名web开发人员,在高度交互式前端应用程序方面具有专业知识. 在为AlignAlytics和Captario等公司工作期间,他帮助构建了几个BI产品的数据可视化.

工作经验

10

动画是网络中无处不在的一部分. 与互联网早期困扰网站的闪烁GIF图像不同, 今天的动画更加微妙和有品位. 设计师和前端专家使用它们使网站看起来更精致, 增强用户体验, 注意重要的元素, 传递信息.

Web开发人员可以从 SVGCSS 创建动画而不使用外部库. 本SVG动画教程展示了如何为实际项目构建自定义动画.

SVG动画:CSS和核心概念

在使用CSS动画svg之前,开发人员需要了解svg的内部工作原理. 幸运的是, 它类似于HTML:我们用XML语法定义SVG元素,并用CSS为它们设置样式, 就好像它们是HTML.

SVG元素专门用于绘制图形. 我们可以用 为了画一个矩形, 用于画圆圈等.svg还定义了 , , , , <路径>.

注意: SVG元素的完整列表 甚至包括 ,它允许您使用同步多媒体集成语言(SMIL)创建动画。. 然而,它的未来是不确定的,Chromium团队 建议 尽可能使用基于CSS或javascript的方法来动画svg.

可用的属性取决于元素,所以while 宽度高度 属性, 元素具有 r 属性,该属性定义其半径.

三个基本SVG元素(矩形、圆形和直线)及其可用属性. 矩形由其左上角的x坐标和y坐标定义, 以及它的宽度和高度, e.g., <rect x="25" y="25" 宽度="150" 高度="100"/>. 圆是由圆心的x坐标和y坐标定义的, Cy),再乘以半径r, e.g., <circle cx="75" cy="75" r="50"/>. 这条线是用起始坐标(x1和y1)和结束坐标(x2和y2) e来定义的.g., <line x1="40" y1="140 x2="140" y2="40"/>.
Select basic SVG 元素; coordinates are relative 到 origin (the top-left corner of the SVG 视窗).

虽然大多数HTML元素可以有子元素,但大多数SVG元素不能. 一个例外是group元素 ,我们可以使用它来一次对多个元素应用CSS样式和转换.

元素及其属性

HTML和SVG之间的另一个重要区别是我们如何定位元素,特别是通过 viewBox 属性 给定外层的 元素. 其值由四个由空格或逗号分隔的数字组成: min-x, min-y, 宽度, 高度. 它们一起指定了我们希望浏览器呈现多少SVG图形. 该区域将被缩放以适应 视窗的定义 宽度高度 的属性 元素.

当涉及到信件时,比例 宽度高度 属性可能确实不同于 宽度高度 部分 viewBox 属性.

默认情况下, SVG画布的长宽比将被保留,但代价是大于指定的长宽比 viewBox,从而在视口中产生较小的、带字母框的呈现. 方法指定不同的行为 preserveAspectRatio 属性.

这使我们能够独立绘制图像,并确信无论上下文或渲染大小如何,所有元素都将正确定位.

显示viewBox如何以不同的宽高比呈现到视窗中,同时保持内容的宽高比. 在左边,一个矩形viewBox的中心有一个等距立方体. 在右边, 更大的方形视口具有相同的等距立方体, 居中放大, 同时保持立方体的长宽比.
通过信箱保持图像的宽高比.

虽然您可以手工编写SVG图像, 更复杂的图像可能需要矢量图形程序(我们的SVG动画教程演示了这两种技术). 我选择的编辑器是Affinity 设计er, 但是任何编辑器都应该为这里介绍的简单操作提供足够的功能.

使用CSS过渡和动画的SVG动画示例

CSS转换允许我们定义属性变化的速率和持续时间. 而不是立即从起始值跳到结束值, 当你用鼠标悬停在SVG圆圈上时,它的颜色会发生变化。

看笔 转换示例 作者:菲利普·德法尔(@dabrorius) on CodePen.

来定义转换 过渡 财产, 它接受我们想要转换的属性的名称, 转换的持续时间, a 过渡定时功能 (也称为缓和函数),效果开始前的延迟长度:

/*属性名|持续时间|缓动函数|延迟时间*/
过渡:margin-right 15 - ease-in-out 15;

我们可以为多个CSS属性定义过渡, 每一个都可以有单独的转换值. 然而,这种方法有两个明显的限制.

第一个限制是,当属性值发生变化时,会自动触发转换. 这在某些用例中是不方便的. 例如,我们不能有一个无限循环的动画.

第二个限制是转换总是有两个步骤:初始状态和最终状态. 我们可以延长动画的持续时间,但不能添加不同的关键帧.

这就是为什么存在一个更强大的概念:CSS动画. 使用CSS动画,我们可以有多个关键帧和一个无限循环:

看笔 动画的例子 作者:菲利普·德法尔(@dabrorius) on CodePen.

要在多个关键帧上动画CSS属性,首先我们需要使用 @keyframes at-rule. 关键帧的时间是用相对单位(百分比)定义的,因为在这一点上, 我们还没有定义动画持续时间. 每个关键帧描述一个或多个CSS属性在那个时间点的值. CSS动画将确保关键帧之间的平滑过渡.

将具有描述的关键帧的动画应用到所需的元素上 动画 财产. 类似于 过渡 属性时,它接受一个持续时间、一个缓和函数和一个延迟.

唯一的区别是第一个参数是 @keyframes 名称而不是属性名称:

/* @keyframes name | duration | easing-function | delay */
动画:my- slide - 动画 3s线性1s;

如何为汉堡包菜单切换动画SVG/CSS

现在我们已经对svg动画的工作原理有了基本的了解, 我们可以开始构建一个经典的动画——一个菜单切换,平滑地在一个“汉堡包”图标和一个关闭按钮(一个“X”)之间转换:

看笔 汉堡 作者:菲利普·德法尔(@dabrorius) on CodePen.

这是一个微妙但有价值的动画. 它吸引了用户的注意力,告诉他们可以使用图标关闭菜单.

我们通过创建一个有三行代码的SVG元素开始演示:


  
  
  

每行有两组属性. 的 x1y1 表示直线起点的坐标,而 x2y2 表示线尾的坐标. 我们用相对单位来设置位置. 这是一种确保图像内容调整大小以适应包含SVG元素的简单方法. 虽然这种方法在这种情况下有效, 有一个很大的缺点:我们不能维持这样定位的元素的长宽比. 为此,我们必须使用 viewBox 属性 元素.

注意,我们对SVG元素应用了CSS类. 有许多属性可以通过CSS改变, 因此,让我们对SVG元素应用一些基本样式.

我们将设置的大小 元素,并更改光标类型以表明它是可单击的. 但是要设置线条的颜色和粗细,我们将使用 中风笔划宽度 属性. 你可能会用到 color or 边境,但不像 SVG子元素本身不是HTML元素,所以它们通常有不同的属性名:

.汉堡{
  宽度:62 px;
  身高:62 px;
  光标:指针;
}
.汉堡__bar {
  中风:白色;
  笔划宽度:10%;
}

如果我们在这一点上渲染, 我们会看到这三条线都有相同的大小和位置, 完全重叠. 不幸的是,我们不能改变起始和结束的位置 独立 但是我们可以移动整个元素. 让我们移动顶部和底部的条 变换 CSS属性:

.汉堡__bar——顶级{
  变换:translateY (-40%);
}
.汉堡__bar——机器人{
  变换:translateY (40%);
}

通过移动Y轴上的条,我们最终得到了一个看起来不错的汉堡包.

现在是时候编写第二个状态:关闭按钮. 我们依赖于 .打开 CSS类应用于SVG元素以在两种状态之间切换. 为了使结果更易于访问,让我们将SVG封装在

了解基本知识

  • SVG的用途是什么?

    SVG(可缩放矢量图形)是一种基于xml的标记语言,用于描述矢量图像. 浏览器可以以这种方式清晰地渲染任何大小的图像——创建完美的清晰边缘,没有任何模糊. 另外, 与光栅图像相比,svg往往要小得多, 哪一个可以帮助网站加载更快.

  • SVG比PNG好吗?

    SVG(可缩放矢量图形)是一种矢量图像格式, 这使得它成为用户界面元素的理想选择, 标志, 图标, 图, 类似的图像. 在这些情况下, 它将提供比PNG版本的图像更好的图像质量和更小的文件大小. SVG几乎总是更好的选择.

  • SVG可以动画吗?

    是的. SVG是一种矢量图像格式,其语法与HTML非常相似, 这使得制作动画更方便. 使用DOM选择器来定位各种SVG元素,并使用CSS或JavaScript将它们动画化.

  • 如何制作SVG动画?

    有几种方法可以使SVG图像动画化. 对于中等复杂的动画, 最直接的方法是使用CSS过渡或CSS动画. 对于更复杂的情况, 你可以使用原生JavaScript动画或外部库,如GSAP或动漫.js.

就这一主题咨询作者或专家.
预约电话
菲利普迪娃

位于 克罗地亚的萨格勒布

成员自 2014年5月12日

作者简介

菲利普是一名web开发人员,在高度交互式前端应用程序方面具有专业知识. 在为AlignAlytics和Captario等公司工作期间,他帮助构建了几个BI产品的数据可视化.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

工作经验

10

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.