如何在 SVG 元素内触发动画?

2024-03-07

我创建了一个简单的 SVG 动画,通过单击 SVG 元素来触发。我想多次重复使用这个动画元素,并希望避免每次都重复定义。但是,当我在 a 中创建元素时<defs>标签,然后用<use>标签,我无法从外部访问动画。

下面是同一动画元素的示例,该元素既独立(黄色)又作为<use>元素(橙色和红色)。唯一有效的动画是黄色的。

我在 SVG 中包含了重复动画g组内定义<defs>部分,以表明动画确实有效。

有没有办法在a中触发动画<use>来自外部的元素?或者是否有另一种方法可以在重复使用的元素内创建 2 状态动画?

jsfiddle http://jsfiddle.net/m1epsL8h/1/

<!DOCTYPE html>
<html>
<head>
  <title></title>
  <style>
    g#yellow {
      fill:#cc9;
      color: #993;
    }
    use#orange {
      fill: #ca8;
      color: #963;
    }
    use#red {
      fill:#c99;
      color:#933;
    }
  </style> 
</head>

<body>
<svg width="360" height="120" 
     viewPort="0 0 120 360" version="1.1"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">

<defs>
  <g
    id="door"
    width="120"
    height="120" 
    viewPort="0 0 120 120">

    <rect width="120" height="120" class="wall"></rect>
    <rect
      x="30"
      y="20"
      width="60"
      height="100"
      fill="#000"
      opacity="0.7"></rect>

    <polygon class="door"
      points="
  30,120
  90,120
  90,20
  30,20"
      fill="currentColor">
      <animate
        class="open"
        attributeName="points"
        dur="500ms"
        to="
  100,120
  90,120
  90,20
  100,10"
      begin="indefinite" 
      fill="freeze" />
      <animate
        class="shut"
        attributeName="points"
        dur="500ms"
        to="
  30,120
  90,120
  90,20
  30,20"
      begin="indefinite" 
      fill="freeze" />
     <animate
      attributeName="opacity"
      values="0.5;1;0.5" dur="2s"
      repeatCount="indefinite" />
    </polygon>
  </g>
</defs> 

  <use x="240" y="0" xlink:href="#door" id="red"/>
  <use x="120" y="0" xlink:href="#door" id="orange"/>
  <g xlink:href="#door" id="yellow"
    id="door"
    width="120"
    height="120" 
    viewPort="0 0 120 120">

    <rect width="120" height="120" class="wall"></rect>
    <rect
      x="30"
      y="20"
      width="60"
      height="100"
      fill="#000"
      opacity="0.7"></rect>

    <polygon class="door"
      points="
  30,120
  90,120
  90,20
  30,20"
      fill="currentColor">
      <animate
        class="open"
        attributeName="points"
        dur="500ms"
        to="
  100,120
  90,120
  90,20
  100,10"
      begin="indefinite" 
      fill="freeze" />
      <animate
        class="shut"
        attributeName="points"
        dur="500ms"
        to="
  30,120
  90,120
  90,20
  30,20"
      begin="indefinite" 
      fill="freeze" />
    </polygon>
  </g>
</svg>

<script>
;(function () {
  document.body.onclick = function(event) {
    var target = event.target
    var animation

    while (target && target.nodeName.toLowerCase() !== "g") {
      target = target.parentNode
    }

    if (!target) {
      return
    }

    if (target.classList.contains("open")) {
      target.classList.remove("open")
      animation=document.querySelector("#"+target.id+" animate.shut")
    } else {
      target.classList.add("open");
      animation=document.querySelector("#"+target.id+" animate.open")
    }

    animation.beginElement()
  }
})()
</script>
</body>
</html>

编辑:我尝试了另一种方法,我定义了几种不同的方法g要素:

  • 一个没有动画的
  • 一个带有开场动画的
  • 一个带有关闭动画的

我使用 JavaScript 来交换href of <use>元素到适当的g元素。

交换元素无法播放动画,在不同浏览器中效果不同。在 Chrome 和 Firefox 中,新元素会立即出现在动画后状态中。在 Apple Safari 中,它们显示为动画前状态。

jsfiddle http://jsfiddle.net/xocxk8hc/


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 SVG 元素内触发动画? 的相关文章

  • 如何在 Chrome 中创建 TouchEvent?

    The W3C规范 http www w3 org TR 2011 WD touch events 20110505 idl def TouchEvent宣称initTouchEvent如下 void initTouchEvent in D
  • 请解释与 Google Chrome 扩展程序的后台通信

    我已经阅读并重新阅读了此页面 并运行了示例 http code google com chrome extensions background pages html http code google com chrome extension
  • 双弧形

    我目前正在尝试生成 波浪形幽灵底部 形状 该形状包含两条双曲线 虽然底部的部分这个图片 http images clipartpanda com ghost clip art castle ghost clipart1 jpg我认为以更好的
  • 使用selenium IDE提取部分文本并将其放入变量中

    有人可以告诉我应该使用哪个命令来使用 Selenium Ide 从文本中仅提取数字 694575 并将其放入变量中以供进一步使用 这是带有文本的 div div class loginBoxTitle Edit Exhibition Cen
  • 如何使用键盘和鼠标控制相机 - Three.js

    我在 WEB GL 中有一个带有 Three js 的 3D 环境 并且我曾经使用 Orbitcontrols js http codepen io nireno pen cAoGI http codepen io nireno pen c
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 如何将中间件绑定到socket.io中的事件

    现在您可以将中间件绑定到io use middleware 但这仅在建立套接字连接时触发 有没有办法在将其传递给事件句柄之前拦截它 就像在expressjs中一样 换句话说 In 快递 js你可以做 app get middleware1
  • 计算Javascript中两次点击之间的时间

    我想用 javascript 计算属性的两次点击之间的时间 但我不知道如何 例如 a href click here a 如果用户单击多次 假设 5 秒内 我想显示警报 如果有帮助的话我正在使用 jQuery 我对 javascript 不
  • SVG 转 JPG / PNG

    有没有工作模块可以convert a SVG image into像素格式如JPEG or PNG 看看蜡染工具包 具体来说是光栅化器 http xmlgraphics apache org batik tools rasterizer h
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?

    我主要了解 Ember JS 的基础知识 大多数示例实际上只处理单个控制器和模型以在页面上显示某些内容 我真的很想用 Ember 构建一个完整的 Web 应用程序 所以有人能告诉我如何组织和连接多个控制器 模型和视图到一个页面中吗 例如 如
  • 保存/导出Chrome的JavaScript控制台输入历史记录

    无论如何 我可以保存或导出 JavaScript 控制台的历史记录吗 input 控制台历史记录 在 Google Chrome 中 我不想保存输出或错误 因此将鼠标悬停在控制台框上 右键单击并选择Save as 不是解决方案 我不想每次都
  • 用数组反向查找对象

    假设我有一个这样的对象 resourceMap a 0 1 2 3 4 5 6 7 8 9 10 b 11 12 c 21 23 d 54 55 56 57 510 确定是否的最佳方法是什么resourceId 21将会 c 我们不知道钥匙
  • jQuery 选择器:为什么 $("#id").find("p") 比 $("#id p") 更快

    该页面的作者 http 24ways org 2011 your jquery now with less suck http 24ways org 2011 your jquery now with less suck断言 jQuery
  • 使用 jquery 将字符串数组转换为整数

    我正在尝试将 jquery 中的字符串数组转换为整数数组 这是我的尝试 var cdata data values split each cdata function i l l parseInt l 我认为在这种情况下你不需要使用 Jqu
  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 如何获取使用 .map 渲染的第一个元素的 ref?

    我需要在几行中显示视频 卡片 的缩略图 并重点关注第一个缩略图 我使用嵌套地图进行了显示 该代码基本上迭代视频数组并返回多行视频 我们如何关注第一个渲染的元素 我认为我们需要获得第一个要聚焦的元素的引用 但是我们如何在这里设置 ref 并在
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 我可以使用 jQuery 动态创建文件(及其内容)吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这是我的 HTML 代码 ul li

随机推荐