JavaScript 动画动态返回元素上的位置

标签 javascript html css animation

我正在尝试深入研究 JavaScript 中错综复杂的动画,并提出一些功能性问题。在我的代码中,我试图在按下“按钮”后“发射”“火箭”。我注意到,一旦我启动我的函数,我的值就会计算出我想要的值,但是火箭在网页上的位置不会改变,直到函数返回。

下面是我的问题:

有什么方法可以在我的函数中动态更新火箭的位置 (rocket.style.top)?如果没有,更新位置的更好方法是什么?我应该在按钮上使用事件监听器以外的东西吗?

var button = document.querySelector('.button');
var rocket = document.querySelector('.rocket');
var x = rocket.offsetTop;
var a = 1;

function launch() {
  while (a < 1000) {
    console.log(x);
    console.log(a);
    console.log(rocket.style.top);
    rocket.style.top = x - a + 'px';
    a += a;
    sleep(1000);
  }
}

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds) {
      break;
    }
  }
}

button.addEventListener('click', launch);
div.button {
  font-family: impact;
  letter-spacing: 1px;
  text-transform: uppercase;
  margin: auto;
  text-align: center;
  background-color: rgba(255, 0, 0, 1);
  border-style: solid;
  border-width: 1px;
  border-radius: 100px;
  width: 75px;
  height: 25px;
  padding: 25px 0;
  cursor: pointer;
}

div.rocket {
  position: absolute;
  background-color: rgba(0, 0, 0, .5);
  width: 25px;
  height: 25px;
  bottom: 0%;
  left: 5%;
}
<!DOCTYPE html>
<html>

<head>
</head>

<body>
  <div class='button'>launch</div>
  <div class='rocket'></div>
</body>

</html>

最佳答案

您可以使用 jquery 完成此操作:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

$('.button').click(async function() {
  var a = 0;
  var x = 10;
  while (a < 50) {
    var upd = String(x-a) + 'px';
    $('.rocket').css("margin-bottom", upd);
    a += -x;
    await sleep(50);
  }
});
div.button {
  font-family: impact;
  letter-spacing: 1px;
  text-transform: uppercase;
  margin: auto;
  text-align: center;
  background-color: rgba(255, 0, 0, 1);
  border-style: solid;
  border-width: 1px;
  border-radius: 100px;
  width: 75px;
  height: 25px;
  padding: 25px 0;
  cursor: pointer;
}

div.rocket {
  position: absolute;
  background-color: rgba(0, 0, 0, .5);
  width: 25px;
  height: 25px;
  bottom: 0%;
  left: 5%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!DOCTYPE html>
<html>

<head>
</head>

<body>
  <div class='button'>launch</div>
  <div class='rocket'></div>
</body>

</html>

关于JavaScript 动画动态返回元素上的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48155898/

相关文章:

javascript - 如何在 JavaScript 中调用对象数组的方法?

javascript - 是否可以在模式按钮中短暂存储表单数据?

javascript - 更高效的导航效果

Javascript 日期正则表达式 DD/MM/YYYY

javascript - 想用 JavaScript 改变文本颜色

javascript - 嵌套在堆栈导航器中的 React Native 选项卡导航器

使用用户提供的值替换 HTML 文件中的文本的 Python 脚本

css - 强制div填充指定区域?

javascript - 设置 div 的宽度取决于图像的 x 宽度

html - 图像元素的背景图像 z-index 问题