javascript svg 动画

标签 javascript animation svg

我将如何编写脚本来使用 javascript 线性移动 svg 中的形状。我想使用 requestanimframe。

这是一个使用 Canvas 的例子。除了 svg,我只想做同样的事情。

脚本获取 Canvas 的上下文,然后使用 javascript 绘制具有上下文属性的形状。然后它以线性运动管理 Canvas 上形状的动画。我只想使用 svg 作为形状而不是 Canvas 上下文属性。

<!DOCTYPE HTML>
<html>
<head>
    <style>
        body {
            margin: 0px;
            padding: 0px;
        }

        #myCanvas {
            border: 1px solid #9C9898;
        }
    </style>
    <script>
        window.requestAnimFrame = (function(callback){
            return window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.oRequestAnimationFrame ||
            window.msRequestAnimationFrame ||
            function(callback){
                window.setTimeout(callback, 1000 / 60);
            };
        })();

        function animate(lastTime, myRectangle){
            var canvas = document.getElementById("myCanvas");
            var context = canvas.getContext("2d");

            // update
            var date = new Date();
            var time = date.getTime();
            var timeDiff = time - lastTime;
            var linearSpeed = 100; // pixels / second
            var linearDistEachFrame = linearSpeed * timeDiff / 1000;
            var currentX = myRectangle.x;

            if (currentX < canvas.width - myRectangle.width - myRectangle.borderWidth / 2) {
                var newX = currentX + linearDistEachFrame;
                myRectangle.x = newX;
            }
            lastTime = time;

            // clear
            context.clearRect(0, 0, canvas.width, canvas.height);

            // draw
            context.beginPath();
            context.rect(myRectangle.x, myRectangle.y, myRectangle.width, myRectangle.height);

            context.fillStyle = "#8ED6FF";
            context.fill();
            context.lineWidth = myRectangle.borderWidth;
            context.strokeStyle = "black";
            context.stroke();

            // request new frame
            requestAnimFrame(function(){
                animate(lastTime, myRectangle);
            });
        }

        window.onload = function(){
            var myRectangle = {
                x: 0,
                y: 50,
                width: 100,
                height: 50,
                borderWidth: 5
            };

            var date = new Date();
            var time = date.getTime();
            animate(time, myRectangle);
        };
    </script>
</head>
<body onmousedown="return false;">
    <canvas id="myCanvas" width="578" height="200">
    </canvas>

</body>

最佳答案

在 SVG 中使用 JavaScript 移动元素的最简单方法可能是修改元素的 transform 属性。就性能而言,这不是最佳方法,但它非常易读且简单。

最简单:

var el = document.getElementById( "mySVGElement" );
for( var i = 0; i < 100; i++ )
{
  setTimeout( function( ) {
    el.setAttribute( "transform", "translate( " + i + ", 0 )" );
  }, 200 + i );
}

或者如果你想要一个函数来完成它:

function translateElement( element, distance )
{
  var x, y;
  for( var i = 0; i < 100; i++ )
  {
    setTimeout( function( ) {
      x = parseInt( distance.x * i / 100 );
      y = parseInt( distance.y * i / 100 );
      element.setAttribute( "transform", "translate( " + x + ", " + y + " )" );
    }, 20 + i );
  }
}

或者按照 Erik 的建议:

function translateElement( element, distance )
{
  var x, y;
  for( var i = 0; i < 100; i++ )
  {
    setTimeout( function( ) {
      x = distance.x * i / 100;
      y = distance.y * i / 100;
      element.transform.baseVal.getItem( 0 ).setTranslate( x, y );
    }, 20 + i );
  }
}

其中 element 是您要移动的元素,distance 是以下形式的对象:

{
  x: xOffset,
  y: yOffset
}

关于javascript svg 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8365550/

相关文章:

css - 如何在动画后将元素永久保持在 100% - C

javascript - 在不使用jquery的情况下将g标签添加到svg标签中

php - 定期刷新div以检查表中是否有新条目

ios - ios如何旋转控制360度

javascript - 网络动画结束后恢复原状

javascript - Snap.svg 悬停/取消悬停错误(长时间悬停)

javascript - Raphael 设置透明 png 不透明度丢失 alpha channel

javascript - graphql-tools 突变解析器的参数不是 v > 0.8.0 中的对象?

javascript - 弹出窗口中的链接不会关闭窗口?

javascript - 如何在单击添加时隐藏最后一次单击(添加)按钮以及当用户单击删除按钮然后显示上一个隐藏(添加)按钮