【发布时间】:2015-09-06 06:41:23
【问题描述】:
所以,正如您在 JSFiddle 中看到的那样,我正在使用原生 JavaScript 制作弹跳动画,它旨在成为一个浮动的云。
问题是我想让它仅上下反弹 10 像素,但这样做会使它看起来像在低帧率上,我希望它更平滑。
我发现将 px 数量从 10 增加到 20 会增加它的平滑度,我想是因为它的距离更长并且运行速度更快。我有点想不通它可能是什么。
elem.style.top = elem.offsetTop - 10 + "px";
上面的代码是用于实现结果的代码,因为应用的“left”属性是在一个类中,而不是元素本身,所以需要使用'offsetTop'。
编辑
使用 transfom 我能够使其更平滑:
elem.style.webkitTransform = 'translateY(-10px)';
但问题仍然存在,我想知道如何在原生 JavaScript 中做到这一点。
HTML
<div id='cloud' class='style'></div>
CSS
#cloud{
position: absolute;
width: 50px;
height: 50px;
background: green;
-webkit-transition: all 1s ease-in-out;
-moz-transition: all 1s ease-in-out;
-o-transition: all 1s ease-in-out;
-ms-transition: all 1s ease-in-out;
}
.style{
left: 150px;
top: 50px;
}
JS
var bounce = true;
var cloud = document.getElementById('cloud');
var interval = setInterval(animate(cloud), 1000);
function animate(elem) {
return function () {
if (bounce) {
elem.style.top = elem.offsetTop - 10 + "px";
bounce = false;
} else {
elem.style.top = elem.offsetTop + 10 + "px";
bounce = true;
}
}
}
【问题讨论】:
-
为什么不使用css转场(codepen.io/dodozhang21/pen/siKtp)或JS存在框架(jqueryui.com/resources/demos/effect/easing.html)?
-
回答第二个,因为我想自己学习如何做,我不会重新发明轮子,但我想知道我能造出一个。第一个,我从来没有使用过 SCSS,我想用 JS 事件来解决这个问题(我正在练习 JS)。我尝试过使用转换,效果很好(尽管我更喜欢上面所说的 JS),但是当我移动鼠标时它会重置,不知道为什么。
-
按照@fixmycode 的建议,在 CSS 和 JS 之间进行选择。这是一个使用 rAF 的纯 JS 示例:jsfiddle.net/Lfed8wbh/5
-
@Ted:看看这个带有注释 cmets 的 updated fiddle。
-
@Ted: 并在
requestAnimationFrameAPI 上阅读 this。
标签: javascript css css-transitions frame-rate