JS动画之链式运动与同时运动

一、链式运动
所谓的链式运动,就是在平常的动画运动函数最后在传入一个参数,当第一个动画运动运动完后,检测一下有没有继续传入的参数,如果有的话就继续运行这个参数,这样重复下去就可以完成一套链式运动
        var Li=document.getElementById("li1");
        Li.onmouseover=function(){
            startMove(Li,"width",400,function(){
                startMove(Li,"height",400,function(){
                    startMove(Li,"opacity",100);
                });
            });
        }
        Li.onmouseout=function(){
            startMove(Li,"opacity",30,function(){
                startMove(Li,"height",100,function(){
                    startMove(Li,"width",200);
                });
            });
        }

function startMove(obj, attr, iTarget, fn) { //添加一个回调函数fn
  clearInterval(obj.timer); //1.2+++
  obj.timer = setInterval(function () { //1.2+++
    var icur = null;
    //1.判断类型
    if (attr == ‘opacity‘) {
      icur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
    } else {
      icur = parseInt(getStyle(obj, attr));
    }    //2.算速度

var speed = (iTarget - icur) / 8;
    speed = speed > 0 ? Math.ceil(speed)  : Math.floor(speed);
    //3.检测停止
    if (icur == iTarget) {
      clearInterval(obj.timer);
      if (fn) { //判断是否存在回调函数,并调用
        fn();
      }
    } else {
      if (attr == ‘opacity‘) {
        obj.style.filter = ‘alpha(opacity:‘ + (icur + speed) + ‘)‘;
        obj.style.opacity = (icur + speed) / 100;
      } else {
        obj.style[attr] = icur + speed + ‘px‘;
      }
    }
  }, 30);
}
function getStyle(obj, attr) {
  if (obj.currentStyle) {
    return obj.currentStyle[attr];
  } else {
    return getComputedStyle(obj, false) [attr];
  }
}
二、同时运动:最终封装的‘完美移动框架‘
function startMove(obj, json, fn) {
  var flag = true; //标志所有运动是否到达目标值
  clearInterval(obj.timer);
  obj.timer = setInterval(function () {
    for (var attr in json) {
      var curr = 0;
      //判断是否为透明度
      if (attr == ‘opacity‘) {
        curr = Math.round(parseFloat(getStyle(obj, attr)) * 100);
      } else {
        curr = parseInt(getStyle(obj, attr));
      }      //移动速度处理

var speed = 0;
      speed = (json[attr] - curr) / 10;
      speed = speed > 0 ? Math.ceil(speed)  : Math.floor(speed);
      if (curr != json[attr]) {
        flag = false;
      }
      if (attr == ‘opacity‘) {
        obj.style.filter = ‘alpha(opacity:‘ + (curr + speed) + ‘)‘;
        obj.style.opacity = (curr + speed) / 100;
      } else {
        obj.style[attr] = curr + speed + ‘px‘;
      }
    }
    if (flag) {
      clearInterval(obj.timer);
      if (fn) {
        fu();
      }
    }
  }, 30);
}//取样式

function getStyle(obj, attr) {
  if (obj.currentStyle) { //IE取样式
    return obj.currentStyle[attr];
  } else {
    return getComputedStyle(obj, false) [attr];
  }
}

时间: 2024-08-26 06:20:27

JS动画之链式运动与同时运动的相关文章

(43)JS运动之链式运动框架

链式运动框架就是一系列的运动分阶段进行,在普通的运动框架上加上一个參数function,这个function表示下一个要运行的动作.详细代码例如以下: <!DOCTYPE HTML> <!--链式运动框架:运动分阶段进行,当运动停止的时候.运行下一个运动--> <html> <head> <meta charset="utf-8"> <title></title> <style> #div1

js动画 Css提供的运动 js提供的运动

1.     动画 (1)      Css样式提供了运动 过渡的属性transition  从一种情况到另一种情况叫过渡 Transition:attr  time  linear  delay: Attr 是变化的属性 Time 是花费的时间 Linear 变化的速度 Delay 是延迟 复习background:url() no-repeat 50% 50% red; Background-image Background-repeat Background-position Backgr

原生js实现一个DIV的碰撞反弹运动

 原生js实现一个DIV的碰撞反弹运动: 关键在于DIV的边界检测,进而改变运动方向,即可实现碰撞反弹效果. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{margin:0;} div{height:100px;width:100px;back

简单模拟jQuery创建对象的方法,以及封装一个js动画框架

今天无事点开了N年未点开的慕课网,看了一个js动画框架的视频,心血来潮用jQuery的方法封装了一下,虽然不如jQuery,但是还是有点点所获. 什么都不说,直接上代码: /** * 这是框架的唯一对象,使用jQuery框架的创建方法 * @class MyAnimation * @constructor */ function MyAnimation(Selector){ //返回MyAnimation原型链中init()方法创建的对象 return new MyAnimation.proto

JS动画和CSS动画

一. JS动画和CSS动画区别. CSS实现动画:animation transition transform JS实现动画:setInterval  setTimeout  requestAnimationFrame JS动画: 优点: 1. 过程控制,可以在动画播放过程中对动画进行控制:开始.暂停.回放.终止.取消都是可以做到的. 2. 动画效果比css3动画丰富,有些动画效果,比如曲线运动,冲击闪烁,视差滚动效果,只有JavaScript动画才能完成. 3. CSS3有兼容性问题,而JS大

JS动画之速度动画和透明度变化

一.运动框架实现思路:1.速度(改变值left.right.width.height.opacity)2.缓冲运动3.多物体运动4.任意值变动5.链式运动6.同时运动 二.匀速运动:1.设置定时器,每隔一段时间更改位置,达到匀速运动2.设置定时器前需清除定时器,以防多次触发重复生成多个定时器3.当运动位置达到目标值时,可通过清除定时器停止运动4.当定义函数多处相同时,可封装为一个函数,用不同参数调用,尽量少传递相同的参数        window.onload = function(){  

js手机相应式多级导航分享

js手机相应导航,可以在自适应屏幕的时候运用,当网站屏幕小到一定程度是,让该导航出现,该导航效果如下图:多级导航! 主要的设计思路是:在菜单中往往会有很多内容或者有多个层次的子菜单,为了更加简洁和节省空间,在这个下拉菜单中将每个子菜单都隐藏在一个主导航按钮下方,当点击的时候通过细微的动画显示出来:当再次点击层级菜单时,可以再次以不同形式的动画展示下一级菜单.因为此菜单是流体布局的,所以可以很容易的适应于响应式布局当中. html代码: <div id="dl-menu" clas

CSS vs JS动画:谁更快?

CSS vs JS动画:谁更快? 2016-05-16 前端大全 (点击上方公众号,可快速关注) 英文:Julian Shapiro 译者:MZhou's blog 链接:http://zencode.in/19.CSS-vs-JS动画:谁更快?.html 这篇文章翻译自 Julian Shapiro 的 CSS vs. JS Animation: Which is Faster?.Julian Shapiro 也是 Velocity.js 的创造者.这是一个非常高效.简单易用的JS动画库.他在

显示层封装及实现与优化(无动画+css3动画+js动画)

showhide.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>showhide</title> <link rel="stylesheet" href="../css/base.css"> <style> body{ width