原生JavaScript实现动画

原生JavaScript实现动画的主要方法有setInterval()、setTimeout()以及requestAnimationFrame()1。以下是一些关于使用原生JavaScript实现动画的方法、技巧和注意事项:

  1. setInterval()和setTimeout():这两个函数可以用来创建定时器,通过设定时间间隔来实现动画效果。例如,你可以使用setInterval()每隔一定时间改变元素的样式,从而创建动画效果1

  2. requestAnimationFrame():这是一个更现代的动画API,它可以让浏览器在下次重绘之前调用你传入给它的回调函数来更新动画。这个方法在处理复杂动画或需要更高帧率的动画时非常有用2

  3. 动画与时间关联:在创建动画时,一个常见的问题是动画的速度会受到代码执行速度的影响。为了避免这个问题,你可以将动画与时间关联起来,而不是与代码执行的次数关联。这样,无论代码执行的速度如何,动画总是按照预定的速度播放1

  4. 注意事项:在使用这些方法创建动画时,需要注意的是,如果在循环中进行大量的计算或操作,可能会导致动画变慢。此外,当页面不可见或者最小化时,setInterval()和setTimeout()可能会停止运行,而requestAnimationFrame()则会继续运行1

以下是一些使用原生JavaScript实现动画的代码案例:

  1. 匀速动画:这是一个简单的匀速动画效果,使一个元素在一定时间内匀速移动到指定位置。

    function animate(element, target) {
    clearInterval(element.timer);
    element.timer = setInterval(function () {
    var current = element.offsetLeft;
    var step = (target - current) / 10;
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    current += step;
    element.style.left = current + 'px';
    if (current === target) {
    clearInterval(element.timer);
    }
    }, 20);
    }

  2. 缓动动画:这是一个简单的缓动动画效果,使一个元素在一定时间内缓动移动到指定位置。

    function animate(element, target) {
    clearInterval(element.timer);
    element.timer = setInterval(function () {
    var current = element.offsetLeft;
    var step = (target - current) / 10;
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    current += step;
    element.style.left = current + 'px';
    if (current === target) {
    clearInterval(element.timer);
    }
    }, 20);
    }

  3. 淡入淡出动画:这是一个简单的淡入淡出动画效果,使一个元素在一定时间内逐渐显示或隐藏。

    function fadeIn(element) {
    var op = 0.1; // initial opacity
    element.style.display = 'block';
    var timer = setInterval(function () {
    if (op >= 1){
    clearInterval(timer);
    }
    element.style.opacity = op;
    element.style.filter = 'alpha(opacity=' + op * 100 + ")";
    op += op * 0.1;
    }, 10);
    }

    function fadeOut(element) {
    var op = 1; // initial opacity
    var timer = setInterval(function () {
    if (op <= 0.1){
    clearInterval(timer);
    element.style.display = 'none';
    }
    element.style.opacity = op;
    element.style.filter = 'alpha(opacity=' + op * 100 + ")";
    op -= op * 0.1;
    }, 10);
    }

相关推荐
ZJ_.19 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
joan_851 小时前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
还是大剑师兰特1 小时前
什么是尾调用,使用尾调用有什么好处?
javascript·大剑师·尾调用
Watermelo6172 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
一个处女座的程序猿O(∩_∩)O4 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
燃先生._.10 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
高山我梦口香糖11 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
black^sugar12 小时前
纯前端实现更新检测
开发语言·前端·javascript
2401_8576009513 小时前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js