JavaScript运动框架 链式运动到完美运动(五)

发布时间 - 2026-01-11 01:10:18    点击率:

基于前几篇的运动框架基础,本文主要讲解一下链式运动,就是运动完后接着再运动,比如很多网站中,一个方框的出现和退出:出现时先变宽再变高,退出时先变矮再变窄退出!
之前的模型是:

startMove(obj, json);

现在改为:

startMove(obj, json, fn);

也就是在第一次运动结束的时候执行fn(); fn是传过来的一个参数,这个参数是个函数,定时器清理之后手动运行fn();如果想采用链式运动,那就是在fn中再调用startMove(obj, json, fn),再在里面的fn中调用startMove(obj, json, fn),可以一直玩下去

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>运动框架(五):链式运动到完美运动</title>
  <style type="text/css">
    div {
      width: 100px;
      height: 100px;
      background: orange;
      margin: 10px;
      float: left;
    }
  </style>
</head>
<body>
  <div id="div1"></div>

  <script type="text/javascript">
    var oDiv = document.getElementById('div1');
    oDiv.onmouseover = function() {
      startMove(oDiv, {width:300,opacity:30}, function() {
        startMove(oDiv, {height:500});
      });
    };
    oDiv.onmouseout = function() {
      startMove(oDiv, {height:100}, function() {
        startMove(oDiv, {width:100,opacity:100});
      })
    };

    function getStyle(obj, attr) {
      if (obj.currentStyle) {
        return obj.currentStyle[attr];
      } else {
        return getComputedStyle(obj, null)[attr];
      }
    }

    function startMove(obj, json, fn) {
      clearInterval(obj.timer);
      obj.timer = setInterval(function() {
        var bStop = true;
        for (var attr in json) {
          var cur = 0;
          if (attr === 'opacity') {
            cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
          } else {
            cur = parseInt(getStyle(obj, attr));
          }
          if (cur != json[attr]) {
            bStop = false;
          }
          var speed = (json[attr] - cur)/10;
          speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
          cur += speed;
          if (attr === 'opacity') {
            obj.style.filter = 'alpha(opacity:' + cur + ')';
            obj.style.opacity = cur/100;
          } else {
            obj.style[attr] = cur + 'px';
          }

        }
        if (bStop) {
          clearInterval(obj.timer);
          if (fn) fn();
        }

      }, 30);
    }
  </script>
</body>
</html>

最后提取出来的完美运动框架如下,motionFrame.js:

function getStyle(obj, attr) {
  if (obj.currentStyle) {
    return obj.currentStyle[attr];
  } else {
    return getComputedStyle(obj, null)[attr];
  }
}

function startMove(obj, json, fn) {
  clearInterval(obj.timer);
  obj.timer = setInterval(function() {
    var bStop = true;
    for (var attr in json) {
      var cur = 0;
      if (attr === 'opacity') {
        cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
      } else {
        cur = parseInt(getStyle(obj, attr));
      }
      if (cur != json[attr]) {
        bStop = false;
      }
      var speed = (json[attr] - cur)/10;
      speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
      cur += speed;
      if (attr === 'opacity') {
        obj.style.filter = 'alpha(opacity:' + cur + ')';
        obj.style.opacity = cur/100;
      } else {
        obj.style[attr] = cur + 'px';
      }

    }
    if (bStop) {
      clearInterval(obj.timer);
      if (fn) fn();
    }

  }, 30);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# js  # 运动框架  # 链式运动  # 完美运动  # JS多物体 任意值 链式 缓冲运动  # Js实现简单的小球运动特效  # js运动动画的八个知识点  # javascript实现10个球随机运动、碰撞实例详解  # JS实现匀速运动的代码实例  # 使用JavaScript 实现对象 匀速/变速运动的方法  # js实现缓冲运动效果的方法  # JavaScript中的匀速运动和变速(缓冲)运动详细介绍  # Javascript实现重力弹跳拖拽运动效果示例  # javascript动画之圆形运动  # 环绕鼠标运动作小球  # Javascript模拟加速运动与减速运动代码分享  # JS运动特效之链式运动分析  # 链式  # 是在  # 是个  # 那就  # 也就  # 在里面  # 现时  # 完后  # 大家多多  # 几篇  # 中再  # 变窄  # 变宽  # brush  # xhtml  # DOCTYPE  # lt  # false  # gt  # 一直玩 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用IIS7快速搭建并优化网站站点?  如何快速建站并高效导出源代码?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  JavaScript如何实现倒计时_时间函数如何精确控制  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel如何处理和验证JSON类型的数据库字段  Linux系统命令中screen命令详解  Laravel如何为API生成Swagger或OpenAPI文档  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Laravel如何使用模型观察者?(Observer代码示例)  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何用PHP快速搭建CMS系统?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  详解Android图表 MPAndroidChart折线图  如何用景安虚拟主机手机版绑定域名建站?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  高防服务器租用如何选择配置与防御等级?  再谈Python中的字符串与字符编码(推荐)  Laravel如何使用Vite进行前端资源打包?(配置示例)  手机软键盘弹出时影响布局的解决方法  免费网站制作appp,免费制作app哪个平台好?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel怎么上传文件_Laravel图片上传及存储配置  原生JS实现图片轮播切换效果  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何快速配置高效服务器建站软件?  Laravel如何实现用户密码重置功能?(完整流程代码)  网站制作免费,什么网站能看正片电影?  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  java中使用zxing批量生成二维码立牌  Laravel怎么在Blade中安全地输出原始HTML内容  Laravel如何使用Blade模板引擎?(完整语法和示例)  海南网站制作公司有哪些,海口网是哪家的?  JS中对数组元素进行增删改移的方法总结  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  深圳网站制作培训,深圳哪些招聘网站比较好?  香港服务器如何优化才能显著提升网站加载速度?  轻松掌握MySQL函数中的last_insert_id()  如何基于云服务器快速搭建网站及云盘系统?