如何使用 JavaScript 为加速的 DOM 元素设置动画?
How can I animate an accelerating a DOM element with JavaScript?
我正在制作一个应用程序,我需要一个对象从 a 点移动到 b 点,开始时速度很快,但随后变慢。我想用纯 vanilla js 来做这件事,没有任何库。这是我当前用于以恒定速度设置动画的代码,我想知道是否可以修改它或其他内容。
let player = document.querySelector('.player');
var id = setInterval(frame, 1);
let counter = 0;
function frame() {
if (counter == 50) {
clearInterval(id);
counter = 0;
return;
} else {
player.style.top = player.offsetTop - 2 + 'px';
counter++
}
}
使用 CSS3 功能会更好、更容易。
例如,您在 it.e.g.
中定义具有 CSS 转换或转换的 CSS class
.move{
transform: translateX(300px);
transition: transform .3s ease-out;
}
然后您只需使用 JavaScript 添加或删除 class 到您希望其生效的 DOM 元素。
https://jsbin.com/sosuqoyasi/edit?html,css,js,output
在您的情况下,您可以将 300px 设置为 CSS 变量并在添加 class
之前在 javascript 中更新它
如果您想在 JS 代码中更好地控制 CSS,请使用 Web 动画 API:https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API
我会使用超时而不是像这样的递归间隔...
let player = document.getElementById("player")
let a = 0
const b = 500
const playerWidth = 50
animate = () => {
a += 20
setTimeout(() => {
if (a < b - playerWidth) {
animate()
}
player.style.left = a
}, a)
}
animate()
这是一个工作示例
https://replit.com/@BenjaminKile/MoralRegularTransformations#index.html
我正在制作一个应用程序,我需要一个对象从 a 点移动到 b 点,开始时速度很快,但随后变慢。我想用纯 vanilla js 来做这件事,没有任何库。这是我当前用于以恒定速度设置动画的代码,我想知道是否可以修改它或其他内容。
let player = document.querySelector('.player');
var id = setInterval(frame, 1);
let counter = 0;
function frame() {
if (counter == 50) {
clearInterval(id);
counter = 0;
return;
} else {
player.style.top = player.offsetTop - 2 + 'px';
counter++
}
}
使用 CSS3 功能会更好、更容易。 例如,您在 it.e.g.
中定义具有 CSS 转换或转换的 CSS class.move{
transform: translateX(300px);
transition: transform .3s ease-out;
}
然后您只需使用 JavaScript 添加或删除 class 到您希望其生效的 DOM 元素。 https://jsbin.com/sosuqoyasi/edit?html,css,js,output
在您的情况下,您可以将 300px 设置为 CSS 变量并在添加 class
之前在 javascript 中更新它如果您想在 JS 代码中更好地控制 CSS,请使用 Web 动画 API:https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API
我会使用超时而不是像这样的递归间隔...
let player = document.getElementById("player")
let a = 0
const b = 500
const playerWidth = 50
animate = () => {
a += 20
setTimeout(() => {
if (a < b - playerWidth) {
animate()
}
player.style.left = a
}, a)
}
animate()
这是一个工作示例
https://replit.com/@BenjaminKile/MoralRegularTransformations#index.html