Math常用函数以及缓动动画

一、Math常用函数

1.Math.ceil() 向上取整 天花板

Math.ceil(1.11) 结果 是 2

Math.ceil(1.99) 结果 是 2

Math.ceil(-1.5) 结果 是 -1

2.Math.floor() 向下取整 地板

Math.floor(1.11) 结果 是 1

Math.floor(1.99) 结果 是 1

Math.floor(-1.2) 结果 是 -2

3.Math.round() 四舍五入

Math.round(1.11) 结果 是 1

Math.round(1.99) 结果 是 2

Math.round(-1.2) 结果 是 -2

二、缓动动画原理

  • 缓动动画的原理:** 盒子本身的位置 + 步长 (不断变化的,由大变小)**

  • 步长:begin = begin + (end - begin) / 缓动系数

  • 基本的缓动动画函数:

// 缓动动画
// 谁  目标
function buffer(obj, target) {  
    // 1. 清除定时器    
    clearInterval(obj.timer);    
    // 2. 设置定时器    
    obj.timer = setInterval(function () {        
           // 2.1 求出步长        
           var speed = (target - obj.offsetLeft) / 20;        
           console.log(speed);        
           speed = speed > 0 ? Math.ceil(speed): Math.floor(speed);        
           console.log(speed);        
           // 2.2 设置动画        
           obj.style.left = obj.offsetLeft + speed + 'px';        
           obj.innerHTML = obj.offsetLeft;        
           // 2.3 清除定时器        
           if(obj.offsetLeft == target){           
                  clearInterval(obj.timer);        
            }    
            }, 20);
}

2.1 常见的 js访问 CSS 属性

  • 在开发中,访问得到css 属性,比较常用的有两种:

点语法

box.style.width,box.style.height,box.style.top,box.style.left 得到带有单位的属性值,比如:200px; 但是,点语法存在一个很致命的问题,跟在style后面的属性不能由外面传入

var h = 'height'; 
box.style.h = 300 + 'px';
  • 下标语法

利用 [] 访问属性 元素.style[“属性”];

这种语法的好处就是可以动态的传递参数作为属性

var h = 'height';
     box.style[h] = 300 + 'px';

2.2 JS获取CSS的样式

在开发中,我们想要获得css 的样式,通常采用:box.style.top ,box.style.backgorundColor等, 但这种方式只能得到 行内样式,而平常用的最多的是页内样式或者外部样式, 那我们如何解决这样的问题?

  • 在IE和Opera浏览器
    obj.currentStyle

  • 其他W3C标准浏览器
    **window.getComputedStyle("元素", "伪类") **( 注意:两个选项是必须的, 没有伪类 用 **null **替代 )

兼容写法

function getStyleAttr(obj, attr) {    
    if(obj.currentStyle){ // IE 和 opera        
         return obj.currentStyle[attr];    
    }else {        
         return window.getComputedStyle(obj, null)[attr]; 
    }
}

2.3 JSON 遍历

  • for in 关键字

  • for ( 变量 in 对象) { 执行语句; }

for(var k in json){   
   console.log(k); // key    
   console.log(json[k]); // value
}

2.4 回调函数

在开发中,有很多操作是链式的,下一个操作接着上一个操作执行,那么如何实现这样的行为?** 回调函数。**

回调函数什么时候调用? 
  --> 动画结束的时候调用 ? 
  --> 动画什么时候结束? 
  ---> 定时器被清除的时候
  --> 定时器被清除时调用回调函数

2.5 完整版缓动动画

 /* 
   * 缓动动画 
   * obj: 要做动画的元素 
   * json: 要做动画的属性键值对
   * fn: 回调函数 
  */ 
  function Buffer(obj, json, fn) {     
      // 1. 清除定时器     
      clearInterval(obj.timer);     
      // 2. 设置定时器     
      var flag = true, begin, target;
      obj.timer = setInterval(function () {         
          // 2.1 遍历json         
          for(var k in json){             
             // 2.1.1 获取做动画属性的初始值            
             if('opacity' == k){ // 透明度               
                begin = parseInt(parseFloat(getCssStyleAttr(obj, k)) *100) || 0;  
                target = parseInt(parseFloat(json[k])*100); 
             }else { // 其他动画               
                begin = parseInt(getCssStyleAttr(obj, k));   
                target = parseInt(json[k]);    
             }    
 // 2.1.2 获取动画的步长      
             var speed = (target - begin) / 20;
             speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
             // 2.1.3 设置缓动动画
             if('opacity' == k ){ // 透明度
                   obj.style.opacity = (begin + speed) / 100;
                   obj.style.filter = 'alpha(opacity='+ (begin + speed) +')';
             }else if('zIndex' == k){
                   obj.style.zIndex = json[k];
            }else { // 其他情况 
                  obj.style[k] = begin + speed + 'px'; 
            }            
            // 2.1.4 判断是否清除定时器
            flag = (begin != target) ? false : true;
           }         
           // 2.2 清除定时器
           if(flag){
               clearInterval(obj.timer);
               //判断
               if(fn){
                   fn(); // 执行函数
               }
            }
       }, 20); 
  }

  function $(id) {
      return document.getElementById(id);
  }

  function getCssStyleAttr(obj, attr) {
      if(obj.currentStyle){
          return obj.currentStyle[attr];
      }else {
          return window.getComputedStyle(obj, null)[attr];
      }
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容