JavaScript运动框架 多值运动(四)


Posted in Javascript onMay 18, 2017

多值运动,也就是对于某个对象来说,不仅仅只是其中一个属性值在变化,而是好多个,比如宽,高,字体,透明度等等同时变化

当然了,多值运动会产生一个问题,就是定时器何时关闭的问题!当然是所有的属性值都运动到目标值了才能清理定时器,也就是等最慢的。就好比十个人一起聚餐,不能等到来一个人就开吃!

前几篇讲的都是一个元素对象中某一个属性的运动,这次讲同一个元素对象中多个属性值的缓冲运动,那么每个属性都有个终点(目标点),我们把这些属性及其目标值写成一个对象的形式,或者是json状!容易产生的问题就是上面说的,这里用了共同的速度函数,但有的属性值从100 ?> 101, 有的属性值从100 ?> 600,你得等耗时最长的属性值到达目标值才能关闭该obj所拥有的定时器,设计的思路就是每次执行轮询函数设置一个bStob = true;在遍历扫描json中属性的时候,只要有没到到目标值的属性,就设为false,这样定时器就不会关闭,即使有的属性值已经到达终点,此时轮询依旧会执行扫描,只不过此时该属性运动速度为0了,也不会运动了。也就是之前:

if(attr == cur) {
 cleartInterval(obj.timer);
}

要增强为:

if (bStop) {
 clearInterval(obj.timer);
}
<!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() {
  var json = {
  width: 600,
  height: 200,
  opacity: 30
  };
  startMove(this, json);
 };
 oDiv.onmouseout = function() {
  var json = {
  width: 100,
  height: 100,
  opacity: 100
  };
  startMove(this, json);
 };
 function getStyle(obj, attr) {
  if (obj.currentStyle) {
  return obj.currentStyle[attr];
  } else {
  return getComputedStyle(obj, false)[attr];
  }
 }

 function startMove(obj, json) {
  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));
   }
   var speed = (json[attr] - cur) / 10;
   speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
   if (cur != json[attr]) {//凡是有未到达目标点的,一律不让定时器停下,否则有的属性不能到达目标值
   bStop = false;
   }
   if (attr === 'opacity') {
   cur += speed;
   obj.style.filter = 'alpha(opacity:' + cur + ')';
   obj.style.opacity = cur / 100;//Chrome,IE
   } else {
   obj.style[attr] = cur + speed + 'px';
   }
  }
  //整个循环结束后,仍然保持着true,说明没有没到达目标值的属性,也就是都到了
  if (bStop) {
   clearInterval(obj.timer);//说明所有的属性都到达了目标值
  }

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

JavaScript运动框架 多值运动(四)

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

Javascript 相关文章推荐
javascript 动态添加事件代码
Nov 30 Javascript
基于jQuery选择器的整理集合
Apr 26 Javascript
js加载之使用DOM方法动态加载Javascript文件
Nov 08 Javascript
jQuery实现鼠标悬停背景翻转的黑色导航菜单代码
Sep 14 Javascript
JS中对象与字符串的互相转换详解
May 20 Javascript
jQuery获取剪贴板内容的方法
Jun 16 Javascript
js实现上传图片预览方法
Oct 25 Javascript
微信小程序中input标签详解及简单实例
May 18 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
Jun 08 jQuery
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
Apr 08 Javascript
从源码角度来回答keep-alive组件的缓存原理
Jan 18 Javascript
微信小程序页面开发注意事项整理
May 18 #Javascript
基于BootStrap的前端分页带省略号和上下页效果
May 18 #Javascript
微信小程序网络请求wx.request详解及实例
May 18 #Javascript
微信小程序实现锚点定位楼层跳跃的实例
May 18 #Javascript
Vue2 使用 Echarts 创建图表实例代码
May 18 #Javascript
AngularJS折叠菜单实现方法示例
May 18 #Javascript
jQuery Validate 校验多个相同name的方法
May 18 #jQuery
You might like
php木马webshell扫描器代码
2012/01/25 PHP
php创建sprite
2014/02/11 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
javascript fullscreen全屏实现代码
2009/04/09 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
JS和jQuery使用submit方法无法提交表单的原因分析及解决办法
2016/05/17 Javascript
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
Python实现的简单万年历例子分享
2014/04/25 Python
python中实现php的var_dump函数功能
2015/01/21 Python
python简单文本处理的方法
2015/07/10 Python
对python sklearn one-hot编码详解
2018/07/10 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
2018/10/30 Python
python实现密码强度校验
2020/03/18 Python
python识别验证码的思路及解决方案
2020/09/13 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
取保候审保证书
2014/04/30 职场文书
作文评语怎么写
2014/12/25 职场文书
家长给老师的感谢信
2015/01/20 职场文书
研究生论文答辩开场白
2015/05/27 职场文书