以下是GreenSock动画平台(GSAP)的作者Jack Doyle的来宾帖子。 Jack长期以来一直深深地沉浸在网络动画的树林中,试图使其变得更轻松,更好。 他之前曾在这里写过文章,谈论JavaScript动画如何成为最高效的选择(Google甚至推荐它)。 这次,他专注于SVG动画,使用CSS处理它们时可能遇到的一些非常可怕的问题,以及如何解决这些问题。

如今,SVG非常流行,浏览器支持通常非常出色……一个明显的例外:CSS转换。 对于动画而言,这尤其痛苦,因为缩放,位置,旋转和倾斜非常重要。

系好安全带,因为我们要颠簸。 但是不用担心; 这个复杂的爱情故事有一个幸福的结局。 在本文中,我将向您介绍一些问题,然后向您展示一种协调各种浏览器行为的技术,并将其引入到最新版本的GreenSock动画平台( GSAP )中。

浏览器错误和不一致

首先,查看这些动画GIF,它们在各种浏览器中显示两个<rect>元素的CSS动画完全相同 (至少从2014年11月开始):

请参阅CodePen上的GreenSock ( @GreenSock )提供的笔GIFS:SVG + CSS转换问题 。

  • IEOpera根本不支持SVG元素上CSS转换。 而是必须将值分配给transform 属性
  • Firefox不支持基于%的来源。
  • 放大Safari会破坏基于%和基于px的原点之间的同步。
  • Firefox无法识别基于关键字的来源(如"right bottom" ,而当缩放比例达100%时, Safari会对其进行更改。
  • 所有浏览器中 ,对SVG元素和其他DOM元素而言,基于px的原点的测量方式有所不同(请参见下文)。

这是一个演示这些错误的视频:

transform-origin视为所有旋转和缩放发生的点,就好像是一个销子将其固定在此处一样,

我的转换来源在哪里?

通常,如果要从元素的中心旋转或缩放,则可以设置transform-origin: 50% 50% 。 百分比是相对于元素本身的原始大小的,因此其宽度的50%和高度的50%会在中间出现smack-dab。 所有主要的浏览器都支持常规DOM元素的基于%的来源,但只有少数浏览器支持SVG元素。

基于px的值如何? 支持非常好,但是还有另一个问题:如下所示,SVG相对于 SVG的0,0坐标测量基于px的值,而其他所有DOM元素(如<div> )则相对于其自身的左上角对其进行测量。 因此,如果要居中,则必须进行数学运算以在SVG中绘制坐标( getBBox()可以使用getBBox() JS)。 因此,您不能将相同CSS应用于常规DOM元素和SVG元素,并期望它们的行为相同。

请参阅CodePen上的GreenSock ( @GreenSock )的Pen SVG变换源演示 。

一个办法

如果我有一个可以在这里使用的纯CSS技巧,那会很好,但是由于IE和Opera完全忽略了SVG元素上CSS转换,并且大多数其他浏览器中都有错误,因此我们将依靠一种令人难以置信的优势JavaScript:其灵活性。 即使下周每个浏览器都修复了它们的错误,我们仍然无法避免以下事实:SVG规范与其他DOM元素处理基于px的变换起源非常不同,因此CSS变换绑定到该规范。 据我所知,唯一可行的长期解决方案是基于JS的解决方案。 另外,JS还给我们带来了许多其他好处,但这是另一篇文章的主题。

目标:能够以与“正常” DOM元素相同的方式为SVG元素设置各种变换属性(旋转,缩放,位置和倾斜),同时在所有主要浏览器中提供相同的行为。 我们还应该能够使用类似于CSS的标准值(包括百分比,px或诸如"right bottom"类的关键字)来设置转换原点。 哦,一定是FAST

如果您还不熟悉GreenSock的GSAP ,那么它是一个高性能,专业级JavaScript动画库,具有无与伦比的排序工具,运行时控件和灵活性(几乎可以动画化JavaScript可以触摸的任何东西)。 Google推荐将其用于基于JS的动画,它的速度比jQuery快20倍。

这是GSAP幕后采用的技术的概述(由于它不在本文的讨论范围之内,因此我们将不涉及矩阵数学)。 下面的演示通过将转换原点指定为"50% 50%"来说明当您尝试围绕其中心旋转SVG <rect>时GSAP的操作。

请参阅CodePen上的GreenSock ( @GreenSock )提供的Pen SVG变换源解决方案 。

生成的matrix()字符串应被馈送到元素CSS样式或transform属性,无论该特定浏览器是否必需。

如果那对您没有意义,那没关系–这一切在GSAP的幕后自动为您完成。

结果

我们不仅可以在浏览器中获得统一的行为,而且可以为SVG和非SVG元素使用一致的动画API,而且与(破碎的)纯CSS动画相比,我们必须编写的动画代码很小。

TweenMax.to("#svg, #div", 2, {rotation:360, transformOrigin:"50% 50%"
});

这是一个演示了几个起源的序列的演示。 请注意,对于SVG <rect><div>

请参阅CodePen上的GreenSock ( @GreenSock )提供的Pen SVG CSS转换时间轴 。

使用GSAP动画SVG的技巧

我不会在这里解释GSAP的API(请参阅入门文章 ),但是我将提供一些与SVG相关的技巧。 在github上获取 GSAP 快照,或从GreenSock.com下载。

  • GSAP无需像CSS中那样将所有转换组件组合成单个“转换”字符串,而是使您可以独立定义每个转换组件,并且无需担心操作顺序(它始终是一致的)。 也请记住,GSAP使用xytranslateX()translateY()并且rotationrotate() 其他所有内容都相同( scaleXscaleYskewXskewY )。

    #yourID {animation-name: myAnimation;animation-duration: 2s;animation-timing-function: ease-out;transform-origin: right bottom;
    }
    @keyframes myAnimation {from {transform: none;}to {transform: rotate(270deg) scaleX(0.5) translateX(100px);}
    }
    TweenMax.to("#yourID", 2, {rotation:270, scaleX:0.5, x:100, transformOrigin:"right bottom"
    });
  • 您可以传入原始元素作为目标(第一个参数),选择器文本或元素数组。
  • 要设置SVG的数字属性 (而不是CSS属性)的动画,请使用attr:{}对象,例如:
    TweenMax.to("#circle", 2, {attr:{cx:200, cy:300, r:20}, ease:Power2.easeInOut});
  • 您还可以使用zrotationXrotationYperspective3D属性,但某些浏览器(如IE和Opera)无法识别SVG元素的属性。
  • 最好直接通过GSAP而不是CSS来设置transformOrigin ,因为各种浏览器都会通过getComputedStyle()不一致地报告它们。
  • 您几乎可以为所有CSS值设置动画,包括fillstroke等颜色属性。
  • 如果您想进行很多排序,强烈建议您在此处和此处观看视频。 测序是GSAP最重要的优势之一。

更多资源

  • Sara Soueidan撰写了一篇精彩的文章,内容涉及通过SMIL为SVG设置动画。
  • 有关 CSS技巧的SVG相关资源的完整列表 。
  • 查看Joni Trythall 撰写的《 SVG编写袖珍指南》 。
  • 神话破灭:CSS动画与JavaScript

翻译自: https://css-tricks.com/svg-animation-on-css-transforms/

SVG动画和CSS转换:复杂的爱情故事相关推荐

  1. HTML5: 利用SVG动画动态绘制文字轮廓边框线条

    DEMO: 点击这里看效果 简要教程 这是一款很酷的html5 svg线条动态绘制文字轮廓边框动画特效.SVG路径动画在网页设计中是一项热门的技术,它允许我们绘制各种简单.精美的图标和文字.关于使用S ...

  2. 如何使用CSS来修改SVG原点和制作SVG动画

    SVG元素可以像HTML元素一样,使用CSS keyframes和animation属性或者CSS transitions来制作各种动画效果. SVG元素可以像HTML元素一样,使用CSS keyfr ...

  3. CSS转换动画与移动web

    CSS转换与移动web 一.课前导学 1.阶段目标: 使用字体图标.平面转换.动画等C3属性丰富网页效果和呈现方式 2.CSS3 目标:使用平面.空间转换和动画属性,丰富网页元素 3.Flex 了解移 ...

  4. svg配合css3动画_带有Adobe Illustrator,HTML和CSS的任何网站的SVG动画

    svg配合css3动画 A top trend in web design for 2020 is the increased use of SVG animations on web pages a ...

  5. UI设计师SVG动画进阶篇——路径变形动画(上篇)

    之前分享了一些自己平时整理的可以通用的SVG动画的教程基本都是最基础的变化,旋转也好,缩放也好,沿路径运动也好,只需要定义CSS3的一些动画属性值或者SVG的动画属性标签,当然,运用得当的话,依靠这些 ...

  6. svg 动画_30个很棒的SVG动画

    作者:MrWang 转发链接:https://segmentfault.com/a/1190000023090287 前言 设计人员使用CSS在HTML元素中创建动画.然而,由于HTML元素在创建模式 ...

  7. svg动画制作_制作动画SVG横幅

    svg动画制作 I've been reading David Walsh's blog for years. The tips and tutorials he shares have helped ...

  8. svg动画制作_制作第一个SVG动画

    svg动画制作 Story of a designer trying to code animations instead of asking a dev to figure it out. 一位设计 ...

  9. 10 个非常有用的 SVG 动画的 JavaScript 库

    2019独角兽企业重金招聘Python工程师标准>>> SVG 通常可以用作跨分辨率视频.这意味着在一块高分屏幕上不会降低图片的锐度.此外,你甚至可以让SVG动起来,通过使用一些ja ...

最新文章

  1. 什么是android刷机包,什么是安卓RAM?安卓RAM和安卓ROM有什么区别?
  2. svn之迁移代码技巧
  3. 性能测试脚本的编写和调试_编写自动调试器以在测试执行期间捕获异常
  4. java代码_【JAVA虚拟机(JVM)精髓】05-Java代码的执行过程
  5. pytest框架+conftest.py配置公共数据的准备和清理
  6. 【故障诊断分析】基于matlab概率神经网络柴油机故障诊断【含Matlab源码 1754期】
  7. Flink catalog简单使用
  8. 软考软件设计师下午真题-面向对象的程序设计与实现-享元设计模式(2021年下半年试题六))Java代码讲解
  9. 蒸汽平台进dota2显示连接不上服务器,蒸汽平台dota2连不上服务器
  10. 调用高德api 实现地点搜索,且获取经纬度
  11. 万字长文爆肝呕血整理Python入门到精通,【巨详细,一学就会】
  12. Linux中阶—域名解析服务DNS(十)
  13. utf8编码和utf8mb4编码(其它编码简介)
  14. 格斗类游戏的键盘处理
  15. OpenGL Android 安卓 入门 GLES20 初学者 初级 官方
  16. PT100热电阻温度传感器 铂热电阻 德国贺利氏 硅胶四氟镀锡屏蔽线
  17. 商圈调查方案-调研目标
  18. java编程用什么笔记本_程序员都用什么牌子的笔记本,你知道吗?
  19. 甘露糖-聚乙二醇-马来酰亚胺 mannose-PEG-MAL 马来酰亚胺-PEG-甘露糖
  20. 数据预处理+数据清理

热门文章

  1. oracle之归档日志空间管理
  2. audio实现歌词同步
  3. java盖金字塔的游戏,最强大脑积木金字塔
  4. usb转vga转换器
  5. poj 3067 树状数组
  6. [leetcode]Majority Element II
  7. LPC1768-SYSTICK
  8. 使用malloc函数分配空间
  9. Git分支及其协同开发
  10. Mac:Permission denied XXX