javascript - 具有多个独立对象的 requestAnimationFrame

标签 javascript jquery html css requestanimationframe

我正在尝试为两个不同的对象制作动画,一个 div 格式看起来像正方形,另一个格式看起来像圆形。我为每个对象都有一个按钮来启动动画,其中包括从左向右移动对象。我已经包含了下面的代码。我遇到的问题是,如果我单击“移动方 block ”按钮,然后单击“移动圆圈”按钮,则方 block 会向左移动。我试图做的是将对象相互独立地移动。

我确信有一个面向对象的解决方案,但我已经搜索过,但没有找到任何对我有意义的东西。有什么建议吗?

$(document).ready(function() {
  var moveSquare = $('#moveSquare');
  var moveCircle = $('#moveCircle');

  var square = $('#square');
  var squareText = $('#squareText');

  square.css({
    top: '100px',
    left: '0px',
    color: 'white',
    position: 'fixed',
    'text-align': 'center'
  });
  var pos_square = square.position();
  squareText.html(pos_square.top + 'px' + '<br/>' + pos_square.left + 'px');

  var circle = $('#circle');
  var circleText = $('#circleText');

  circle.css({
    top: '300px',
    left: '0px',
    color: 'white',
    position: 'fixed',
    'text-align': 'center'
  });
  var pos_circle = circle.position();
  circleText.html(pos_circle.top + 'px' + '<br/>' + pos_circle.left + 'px');

  moveSquare.on('click', function() {
    console.log('movesuqare here');

    requestAnimationFrame(function(timestamp) {
      starttime = timestamp;
      move(timestamp, square, squareText, 800, 5000);
    });

  });

  moveCircle.on('click', function() {
    console.log('movecircle here');

    requestAnimationFrame(function(timestamp) {
      starttime = timestamp;
      move(timestamp, circle, circleText, 800, 1000);
    });

  });


  function move(timestamp, element, elementText, distance, duration) {
    var runtime = timestamp - starttime;
    var progress = runtime / duration;
    progress = Math.min(progress, 1);

    var leftPos = (distance * progress).toFixed(0) + 'px';
    element.css({
      left: leftPos,
      position: 'absolute'
    });
    element.css({
      'text-align': 'center'
    });

    var topPos = element.css('top') + '<br/>';
    elementText.html(topPos + leftPos);

    console.log(element.prop('id') + leftPos);
    if (runtime < duration) {
      requestAnimationFrame(function(timestamp) {
        move(timestamp, element, elementText, distance, duration);
      });
    }
  }


});
html {
  position: fixed;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
}

body {
  font-family: 'Courier New';
  color: black;
  font-size: 15px;
  width: auto;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
}

.container {
  width: 100px;
  height: 100px;
}

.square_css {
  width: 100px;
  height: 100px;
  background-color: blue;
}

.circle_css {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background-color: green;
}

.shapeText {
  padding-top: 30%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js"></script>
<html lang="en">

<head>
  <link rel="stylesheet" type="text/css" href="<?php echo URL; ?>views/index/css/index_Main.css" />
</head>

<body>

  <div>
    <input type="button" id="moveSquare" value="Move Square" />
  </div>

  <div>
    <input type="button" id="moveCircle" value="Move Circle" />
  </div>

  <div id="square" class="square_css">
    <div id="squareText" class="shapeText"></div>
  </div>

  <div id="circle" class="circle_css">
    <div id="circleText" class="shapeText"></div>
  </div>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script type="text/javascript" src="<?php echo URL; ?>views/index/js/index_main.js"></script>
</body>

</html>

最佳答案

问题是由两个动画共享一个公共(public)变量 starttime 引起的。

要解决这个问题,您需要某种方式让每个动画都有自己的开始时间

有多种方法可以做到这一点,其中最简单的方法是从点击处理程序将开始时间连同其他参数一起传递给 move()。因为 move() 会调用自身,所以 starttime 需要传递给下一个调用。

$(document).ready(function() {
	var square = $('#square').css({
		'top': '100px',
		'left': '0px',
		'color': 'white',
		'position': 'fixed',
		'text-align': 'center'
	});
	var circle = $('#circle').css({
		'top': '300px',
		'left': '0px',
		'color': 'white',
		'position': 'fixed',
		'text-align': 'center'
	});

	var squareText = $('#squareText');
	var circleText = $('#circleText');

	var pos_square = square.position();
	var pos_circle = circle.position();

	squareText.html(pos_square.top + 'px' + '<br/>' + pos_square.left + 'px');
	circleText.html(pos_circle.top + 'px' + '<br/>' + pos_circle.left + 'px');

	$('#moveSquare').on('click', function() { // button
		console.log('movesuqare here');
		requestAnimationFrame(function(timestamp) {
			move(timestamp, timestamp, square, squareText, 800, 5000);
		});
	});

	$('#moveCircle').on('click', function() { // button
		console.log('movecircle here');
		requestAnimationFrame(function(timestamp) {
			move(timestamp, timestamp, circle, circleText, 800, 1000);
		});
	});

	function move(starttime, timestamp, element, elementText, distance, duration) {
		var runtime = timestamp - starttime;
		var progress = runtime / duration;
		progress = Math.min(progress, 1);
		var leftPos = (distance * progress).toFixed(0) + 'px';
		element.css({
			left: leftPos,
			position: 'absolute'
		});
		element.css({
			'text-align': 'center'
		});
		var topPos = element.css('top') + '<br/>';
		elementText.html(topPos + leftPos);
		console.log(element.prop('id') + leftPos);
		if (runtime < duration) {
			requestAnimationFrame(function(timestamp) {
				move(starttime, timestamp, element, elementText, distance, duration);
			});
		}
	}
});
html {
  position: fixed;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
}

body {
  font-family: 'Courier New';
  color: black;
  font-size: 15px;
  width: auto;
  top: 0;
  bottom: 0;
  right: 0;
  left: 0;
}

.container {
  width: 100px;
  height: 100px;
}

.square_css {
  width: 100px;
  height: 100px;
  background-color: blue;
}

.circle_css {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background-color: green;
}

.shapeText {
  padding-top: 30%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js"></script>
<html lang="en">

<head>
  <link rel="stylesheet" type="text/css" href="<?php echo URL; ?>views/index/css/index_Main.css" />
</head>

<body>

  <div>
    <input type="button" id="moveSquare" value="Move Square" />
  </div>

  <div>
    <input type="button" id="moveCircle" value="Move Circle" />
  </div>

  <div id="square" class="square_css">
    <div id="squareText" class="shapeText"></div>
  </div>

  <div id="circle" class="circle_css">
    <div id="circleText" class="shapeText"></div>
  </div>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script type="text/javascript" src="<?php echo URL; ?>views/index/js/index_main.js"></script>
</body>

</html>

关于javascript - 具有多个独立对象的 requestAnimationFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47253434/

相关文章:

javascript - 从 Windows 8 JS 应用程序获取仅 HTTP 的 cookie

javascript - 页面不在水平滚动上重绘

javascript - 将对象内的对象作为参数传递给函数

jquery - 结合图像映射和悬停

javascript - 从一个页面调用 session 到另一个页面并将其包含在 javascript 中

javascript - jquery 函数未在 ajax 函数内部调用

javascript - 更改 div 的每个第二个实例的类?

javascript - 广播 Laravel 通知时应使用什么事件名称

javascript - 如何将 javascript 与 HTML 合并,使表格根据值改变颜色?

html - Bootstrap 3 : images of same height displaying at different heights