zoukankan      html  css  js  c++  java
  • js实现动画效果框架

    RT,是参照慕课的教程做的。两个多小时的教程,看完了然后晚上的时候做了下,看的时候感觉明白了,但其实做的时候还是有很多小细节需要处理的。

    上代码,思想什么的直接去慕课看教程就好了。点击这里

    注释也比较清楚,应该能看得懂

    -------16年12.5更新-------

    想做全屏滚动,发现这个框架不支持,于是做了点小改动,支持document.body的scrollTop属性还有其他部分宽高属可自行测试,顺带修复了一部分小bug

    博文在此

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4   <meta charset="UTF-8">
     5   <title> </title>
     6 
     7   <style>
     8   #aaa{
     9       position:absolute;
    10       left:-50px;
    11       width: 100px;
    12       height: 100px;
    13       background-color: blue;
    14     border:1px solid red;
    15   }
    16     #ddd{
    17       position:absolute;
    18       top:120px;
    19       left:-50px;
    20       width: 100px;
    21       height: 100px;
    22       background-color: red;
    23       filter: alpha(opacity:30);
    24       opacity: 0.3;
    25     }
    26   </style>
    27 </head>
    28 <body>
    29       <div id = "aaa">123</div>
    30 </body>
    31 <script type="text/javascript" src="./js/animate.js"></script>
    32 <script type="text/javascript">
    33 window.onload=function(){
    34     var aaa = document.getElementById('aaa');
    35     var ddd = document.getElementById('ddd');
    36 
    37     aaa.onmouseover=function(){
    38         showAnimate(this,{'width':200,'height':200});
    39     }
    40     aaa.onmouseout=function(){
    41         showAnimate(this,{'width':100,'height':100});
    42     }
    43 }
    44 </script>
    45 </html>
    HTML demo
     1 /**
     2 *函数作用:执行动画
     3 *接受参数:obj(需要运动的DOM元素)
     4 *        json(需要改变的属性集合,json格式)
     5 *        fn(回调函数)
     6 */
     7 function showAnimate(obj,json,fn){
     8     clearInterval(obj.timer);
     9     //表示运动是否都已经停止
    10     var flag = true;
    11     obj.timer=setInterval(function(){
    12         //循环json
    13         for(var i in json){
    14              if(i == 'opacity'){
    15                  //获取透明度值,round四舍五入去除小数点
    16                  var icur = Math.round(parseFloat(getStyle(obj,i))*100);
    17              }
    18              else{
    19                  //获取属性值
    20                  var icur = parseInt(getStyle(obj,i))||obj[i];
    21              }
    22              //缓冲运动,speed随时变换
    23             var speed = (json[i]-icur)/10;//千万要写在定时器里面,写在外面会有意想不到的后果
    24             speed = speed > 0 ? Math.ceil(speed):Math.floor(speed);//速度向上或者下取整,防止到不了over位置
    25             //如果有一个没到达终点就是false
    26             if(json[i] !== icur){
    27                 flag = false;
    28             }else{
    29                 flag = true;
    30             }
    31             if(i == 'opacity'){
    32                 obj.style.filter = 'alpha(opacity:'+(icur+speed)+')';//IE兼容
    33                 obj.style.opacity = (icur+speed)/100;
    34             }else if(i == 'scrollTop'){
    35                 obj[i] = icur+speed;
    36                 
    37             }
    38             else{
    39                 obj.style[i] = icur+speed+'px';
    40             }
    41             console.log(icur + ' ' + json[i]);
    42         }
    43         //检查是否所有的运动都已经停止
    44         if(flag){
    45             clearInterval(obj.timer);
    46             if(fn){
    47                 fn();
    48             }
    49         }
    50     },13);
    51 }
    52 /**
    53 *函数作用:返回样式属性值
    54 *接受参数:obj(需要获取属性的DOM元素)
    55 *           attr(需要获取的属性名称)
    56 */
    57 function getStyle(obj,attr)
    58 {
    59     if(obj.currentStyle)
    60     {
    61         return obj.currentStyle[attr];//IE兼容
    62     }
    63     else
    64     {
    65         return getComputedStyle(obj,false)[attr];
    66     }
    67 }
    68 </script>
    View Code

     

    看完以后再做的时候还是碰到了不少小问题。

    1.将speed移到setInterval外面时出现了一个莫名其妙的小bug,比如定时器设置的是1000毫秒,然后给两个DIV,各自设置鼠标移入移出事件,当我移入第一个DIV并且移出以后,只要在1000毫秒内,也就是移出定时器还没出发的时候迅速移动到另一个DIV上,第一个DIV就会一直执行移入事件(或者说是在第一个DIV上执行第二个DIV的事件),各位可以去试试,求大神解答。

    2.getComputedStyle,看教程是可以写成getComputedStyle(obj,false).attr这种形式的,但是在实践中发现虽然没报错,但是返回是个空的。所以还是写成了getComputedStyle(obj,false)[attr];

    只有这两个教程里面没讲,其他的speed取整问题, opacity特殊处理,小数点处理问题都在视频里有讲过

  • 相关阅读:
    for 循环、序列和range()
    Python 中的 / 运算符的一切运算结果都是浮点数
    web如何测试
    性能测试中会遇到的瓶颈
    APP测试之内存命令查询
    接口测试常见的题目
    接口测试基础知识
    异或和之和 异或问题
    DP?
    Matrix Power Series
  • 原文地址:https://www.cnblogs.com/baqiphp/p/5907246.html
Copyright © 2011-2022 走看看