JavaScript 动画

IT技术 javascript animation
2021-03-05 12:08:13

我正在尝试在 JavaScript 中水平div移动设置动画200px

下面的代码使它跳跃像素,但有没有办法让它在不使用 jQuery 的情况下看起来动画?

function () {
    var div = document.getElementById('challengeOneImageJavascript');
    div.style.left = "200px";
}
6个回答

这是一个基本的动画设置:

function animate(elem,style,unit,from,to,time) {
    if( !elem) return;
    var start = new Date().getTime(),
        timer = setInterval(function() {
            var step = Math.min(1,(new Date().getTime()-start)/time);
            elem.style[style] = (from+step*(to-from))+unit;
            if( step == 1) clearInterval(timer);
        },25);
    elem.style[style] = from+unit;
}

使用:

animate(
    document.getElementById('challengeOneImageJavascript'),
    "left","px",0,200,1000
);

此示例将动画给定元素在 1 秒(1000 毫秒)的时间内从 0px 线性滑动到 200px。

如果此答案解决了您的问题,请考虑通过单击投票分数正下方的大复选标记将其标记为已接受;)
2021-04-22 12:08:13
@neoDev 该行用作动画的第一“帧”,因为该时间间隔不在该点运行。如果元素已经在第一帧的正确位置,它将没有可见的效果。
2021-04-24 12:08:13
这很好用,谢谢!你将如何在其中实施缓动?
2021-04-26 12:08:13
非常彻底的实现,具有许多功能......喜欢它
2021-05-01 12:08:13
好吧,这一切都是在我发现 CSS3 转换之前写的。此时,我强烈建议您使用过渡而不是手动动画,因为这为您提供了无限范围的动画功能有了这个,你只需要 JavaScript 来做document.getElementById('...').style.left = '200px';,它就会自动动画。
2021-05-05 12:08:13

您可以通过CSS3-Transition轻松做到这一点

#challengeOneImageJavascript {
    -webkit-transition: left .2s;
       -moz-transition: left .2s;
         -o-transition: left .2s;
            transition: left .2s;
}

但是,IE9 和更早的浏览器版本不支持它。

它会立即在不受支持的浏览器中移动。由于这些浏览器真的很慢,也许调低其中的动画效果还不错。
2021-04-26 12:08:13
请指定这仅是 css3
2021-05-03 12:08:13
在支持此类 CSS 的浏览器中
2021-05-12 12:08:13
CSStransition对我来说很流畅,Javascript setInterval(无论多小)总是给出不稳定的结果。
2021-05-15 12:08:13
是的 - 这个答案尽管被很多人投票支持,但它是未来的答案,并且只受最新浏览器的支持
2021-05-16 12:08:13

我做了大量的研究,我终于学会了如何做得很好。

我喜欢将我的程序放在 window.onload 函数中,这样它在页面加载完成之前不会运行代码。

要制作动画,请创建一个函数(我将其称为 draw 函数)并根据需要调用它,除了保留字之外,然后在绘制函数的最后调用 requestAnimationFrame 函数并为其指定函数名称被称为下一帧。

在 requestAnimationFrame 函数可以使用之前,它必须被声明。

请参阅下面的代码:

window.onload = function() {
  function draw() { //  declare animation function
    context.fillStyle = "white";
    context.fillRect(0, 0, 400, 400);
    requestAnimationFrame(draw); // make another frame
  }
  var requestAnimationFrame = // declare the 
    window.requestAnimationFrame || // requestAnimationFrame
    window.mozRequestAnimationFrame || // function
    window.webkitRequestAnimationFrame ||
    window.msRequestAnimationFrame;
  draw(); // call draw function
}

注意:在调用draw函数的那一行之后不会运行任何东西,所以你需要把所有你想运行的东西放在调用draw函数的那一行之前。

您将不得不使用 javascript 超时功能,并一次稍微更改 css 值。最简单的方法是每次增加一个设定的数量,直到达到阈值,这会给你一个线性动画,与 jQuery 的默认swing动画相比,它看起来笨重和业余,它遵循近似于 s 曲线的贝塞尔曲线。

未经测试的代码应该做线性动画

var lefty = 0;
var animate = function(){
    lefty += 20;
    var div = document.getElementById('challengeOneImageJavascript');
    div.style.left = lefty +"px";
    if(lefty < 200)
      setTimeout(animate(),100);
}

animate()

注意,对该代码块有很多改进,但它应该能让你继续前进......

我让它与 JQuery 一起工作(这显然是一个更好的选择)但我正在尝试学习 Javascript,我知道的最好方法是先尝试让事情以艰难的方式工作
2021-04-20 12:08:13

使用 JavaScript,你将不得不使用setInterval函数,或者这就是它在 jQuery 中的实现方式:

$('#challengeOneImageJavascript').animate({left: '=-5'});

5根据您的需要以及通过=-或 的方向调整值 ( )=+

使用原生 JavaScript:

var interval;
var animate = function(id, direction, value, end, speed){
    var div = document.getElementById(id);
    interval = setInterval(function() {
       if (+(div.style) === end) {
          clearInterval(interval);
          return false;
       }
       div.style[direction] += value; // or -= as per your needs
    }, speed);
}

你可以像这样使用它:

animate('challengeOneImageJavascript', 'left', 5, 500, 200);

要随时停止动画,您可以执行以下操作:

clearInterval(interval);

注意: 这只是一种非常快速的方法,可以给您一个想法。

恐怕 OP 想要一个 javascript 非 Jquery 解决方案。
2021-05-17 12:08:13
CSS 版本不适用于所有 IE,而这应该适用于几乎所有浏览器。国军
2021-05-18 12:08:13