• 任意值运动框架


    任意值运动框架思路:

    1、任意值运动框架带有3个形参,第一个是obj对象,第二个是attr属性,第三个是iTarget对象运动的目标值。

    2、清除当前对象的定时器 clearInterval(obj.timer)

    3、设置定时器 obj.setInterval(function(){},30)

    3.1、定义一个空的cur用来设置当前属性。

    3.2、因为有时候是opacity透明度运动,所以就要用if else加一个判断

    1 if(attr=='opacity'){
    2   cur=Math.round(parseFloat(getStyle(obj,attr))*100);  //opacity要用parseFloat强制转换为浮点数才能起作用,因为浮点数习惯用整数表示所以乘以100。因为有些小数*100在计算机中会出现bug,会出现算不尽的数,所以要用Math.round()来四舍五入。
    3 }
    4 else{
    5   cur=parseInt(getStyle(obj,attr));  //getStyle获取样式
    6 }

    3.3、定义速度 var speed=(iTarget-cur)/6;

    3.4、用三目运算符把速度向上取整和向下取整 speed=speed>0?Math.ceil(speed):Math.floor(speed);

    3.5、用if else判断,如果对象的属性值已经等于目标值就清除定时器 clearInterval(obj.timer)

    3.5.1、如果属性名为opacity就设置opacity的值

    3.51.2、否则就设置其它的宽高值运动速度。

    任意值运动框架代码:

     1 function startMove(obj,attr,iTarget)  //三个形参,第一个是对象obj,第二个是对象的属性名,第三个是对象运动的目标值
     2 {
     3     clearInterval(obj.timer);  //清除当前对象的定时器
     4     obj.timer=setInterval(function(){  //定义当前对象的定时器
     5     var cur=0;
     6             
     7         if(attr=='opacity')  //如果attr属性是opacity时
     8         {  
     9             cur=Math.round(parseFloat(getStyle(obj,attr))*100);  //opacity要用parseFloat强制转换为浮点数才能起作用,因为浮点数习惯用整数表示所以乘以100。因为有些小数*100在计算机中会出现bug,会出现算不尽的数,所以要用Math.round()来四舍五入。
    10         }
    11         else
    12         {
    13             cur=parseInt(getStyle(obj,attr));    //把从对象获取到的属性值强制转换为整形
    14         }
    15         
    16         var speed=(iTarget-cur)/6;
    17         speed=speed>0?Math.ceil(speed):Math.floor(speed);  //用三目运算符,当速度大于0就向上取整,否则就向下取整,这样能避免缓冲运动出现bug
    18         
    19         if(cur==iTarget)
    20         {
    21             clearInterval(obj.timer);
    22         } 
    23         else
    24         {
    25             if(attr=='opacity')
    26             {
    27                 obj.style.filter='alpha(opacity:'+(cur+speed)+')';  //IE
    28                 obj.style.opacity=(cur+speed)/100;                
    29             }
    30             else
    31             {
    32                 obj.style[attr]=cur+speed+'px';    
    33             }
    34         }
    35     },30);
    36 };

    任意值运动框架应用实例完整代码:

     1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     2 <html xmlns="http://www.w3.org/1999/xhtml">
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     5 <title>任意值运动框架</title>
     6 <style>
     7 div{margin:20px;}
     8 #div{width:200px;height:200px;background:red;}
     9 #div2{width:200px;height:200px;background:black;filter:alpha(opacity:30);opacity:0.3;}
    10 </style>
    11 <script>
    12 window.onload=function()
    13 {
    14     var oDiv=document.getElementById('div');
    15     var oDiv2=document.getElementById('div2');
    16     
    17     oDiv.onmouseover=function()
    18     {
    19         startMove(this,'height',100)
    20     };
    21     
    22     oDiv.onmouseout=function()
    23     {
    24         startMove(this,'height',200)
    25     };
    26     
    27     oDiv2.onmouseover=function()
    28     {
    29         startMove(this,'opacity',100)
    30     };
    31     
    32     oDiv2.onmouseout=function()
    33     {
    34         startMove(this,'opacity',30)
    35     };
    36 };
    37 
    38 function getStyle(obj,name)
    39 {
    40     if(obj.currentStyle){  //获取对象属性的值
    41         return obj.currentStyle[name];
    42     }
    43     else{  //Chrome FireFox获取对象属性的值
    44         return getComputedStyle(obj,false)[name];
    45     }
    46 };
    47 
    48 function startMove(obj,attr,iTarget)
    49 {
    50     clearInterval(obj.timer);  //清除当前对象的定时器
    51     obj.timer=setInterval(function(){  //定义当前对象的定时器
    52         var cur=0;
    53             
    54         if(attr=='opacity'){  //如果attr属性是opacity时
    55             cur=Math.round(parseFloat(getStyle(obj,attr))*100);  //opacity要用parseFloat强制转换为浮点数才能起作用,因为浮点数习惯用整数表示所以乘以100。因为有些小数*100在计算机中会出现bug,会出现算不尽的数,所以要用Math.round()来四舍五入。
    56         }
    57         else{
    58             cur=parseInt(getStyle(obj,attr));    //把从对象获取到的属性值强制转换为整形
    59         }
    60         
    61         var speed=(iTarget-cur)/6;
    62         speed=speed>0?Math.ceil(speed):Math.floor(speed);  //用三目运算符,当速度大于0就向上取整,否则就向下取整,这样能避免缓冲运动出现bug
    63         
    64         if(cur==iTarget){
    65             clearInterval(obj.timer);
    66         } 
    67         else{
    68             if(attr=='opacity'){
    69                 obj.style.filter='alpha(opacity:'+(cur+speed)+')';  //IE
    70                 obj.style.opacity=(cur+speed)/100;
    71                 
    72                 document.getElementById('txt1').value=obj.style.opacity;
    73             }
    74             else{
    75                 obj.style[attr]=cur+speed+'px';    
    76             }
    77         }
    78     },30);
    79 };
    80 </script>
    81 </head>
    82 
    83 <body>
    84 <div id="div"></div>
    85 <div id="div2"></div>
    86 <input type="text" id="txt1" />
    87 </body>
    88 </html>
  • 相关阅读:
    云中树莓派(5):利用 AWS IoT Greengrass 进行 IoT 边缘计算
    乐观锁 与 悲观锁 来解决数据库并发问题
    Python二维数组构造
    一次问题追查----短字符串签名算法引发的bug
    C++ assert 断言使用
    并查集(Union-Find)算法
    linux shell grep/awk/sed 匹配tab
    C++ 变量默认初始值不确定(代码测试)
    linux 查看机器内存方法 (free命令)
    html table奇偶行颜色设置 (CSS选择器)
  • 原文地址:https://www.cnblogs.com/52css/p/2966285.html
Copyright © 2020-2023  润新知