【问题标题】:Anime.js and MathMLAnime.js 和 MathML
【发布时间】:2018-12-03 17:05:12
【问题描述】:

我刚刚发现了anime.js,感觉它是我需要的正确工具(在2D 中为一些网络教程制作动画)。 问题是我使用的是 MathML(HTML5 标准的一部分),它使用“数学”标签。

HTML

<math>
    <mrow>
        <msqrt>
            <mrow>
                <msup class="ml4">
                    <mi class="letter">b</mi>
                    <mn>2</mn>
                </msup>
            </mrow>
        </msqrt>   
    </mrow>
</math>

JS

<script type="text/javascript" src="anime.min.js"></script>
<script>
    anime.timeline({loop: true})
    .add({
        targets: '.ml4 .letter',
        opacity: [0, 1],
        scale: [0.2, 1],
        duration: 800
    });
</script>

当我尝试简单地为数学标签(不透明度、比例、持续时间)中的字母设置动画时,我得到:

如果我使用anime.min.js (2.0)

在火狐中

"TypeError: right-hand side of 'in' should be an object, got undefined" 
-> anime.min.js:9:136

在 Safari 中

"TypeError: a.style is not an Object. (evaluating 'b in a.style')"
 -> "B" -> anime.min.js:9:145

如果我使用anime.js (2.0)

在火狐中

"TypeError: right-hand side of 'in' should be an object, got undefined"
-> anime.min.js:346:5

在 Safari 中

"TypeError: a.style is not an Object. (evaluating 'b in a.style')"
-> "getCSSValue" -> anime.min.js:346

在这两种情况下,数学公式看起来都很好,但动画不起作用。 我尝试了以前版本的anime.js,结果相同。

我玩弄了代码,动画又回来了 + 如果我去掉“数学”标签,Firefox 和 Safari 上的错误消息就会消失。但是,当然,数学公式是一团糟,这无济于事。 但似乎这个问题仅与这个数学标签有关。 我还尝试对数学标签和内部标签进行样式设置、取消样式设置,但错误仍然存​​在。

我可以理解 animate.js 不支持此标签,但动画工作得很好,并且在我的 Mac 上的 Coda2(网络开发软件)中没有任何错误,在它自己的专用浏览器上。 所以这似乎非常依赖于浏览器,但到目前为止,它似乎是唯一认为脚本有效的浏览器。

我在网络上没有找到任何同时处理anime.js 和MathML 的东西,所以很难说这是我的错误还是错误。

谢谢。

https://jsfiddle.net/bt4u23rh/1/

【问题讨论】:

  • 样式 API 不适用于 Mathml 元素。

标签: mathml anime.js


【解决方案1】:

您可以使用包装器,也可以修改animejs 库上的函数getCSSValue。基本上,该函数会查找该特定目标的 style 属性。

function getCSSValue(el, prop) {
  if (prop in el.style) {
    return getComputedStyle(el).getPropertyValue(stringToHyphens(prop)) || '0';
  }
}

当代码到达if 行时,您的mi .letter 没有该属性,并且对函数的调用失败并冒泡。

使用建议的解决方法,您可以创建一个包含您的mathML 标签的div

<div class="letterWrapper">
<math>
  <mrow>
    <msqrt>
      <mrow>
        <msup class="ml4">
          <mi class="letter">b</mi>
          <mn>2</mn>
        </msup>
      </mrow>
    </msqrt>   
  </mrow>
</math>
</div>

https://jsfiddle.net/bt4u23rh/2/

【讨论】:

  • 很高兴帮助@BachirMessaouri :)
  • 只有一件事。尽管这使我可以成功地定位整个公式,但是有什么方法可以定位子元素吗?我的意思是,如果我只需要将动画应用于 标记。我试图用 div 或任何标准的 html5 标签包围它,但没有成功。在这种情况下有什么解决方法吗?这就是我所需要的。
  • 以这种方式使用它会有奇怪的行为。如果 a 保留为内联元素,例如,动画将不会翻译。如果将 a 更改为块元素,它会很好地工作,但是由于某种原因,字母会被复制(最初的 b 保留在原处,而它的另一个实例在其上被动画化)。如果将 a 更改为 inline-block,那么它完全可以工作,但是我们会得到一个位置偏移量,而其他元素就不能正常工作。所以感觉它只是不是很有用。这有点烦人,但事实就是如此。无论如何,非常感谢您的帮助!
  • 问题像这样解决(填充会很麻烦):我将“display:block”添加到 a 标签并将其父级的颜色设置为透明。它就像一个魅力。 jsfiddle.net/bt4u23rh/8你真的把我带到了正确的道路上,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多