• js运动框架完成块的宽高透明度及颜色的渐变


      了解了运动框架完成块元素的宽高和透明度的变化的原理,我想着写一个颜色的变化来练习一下,不想写了很长时间才写出来,跟各位分享一下。

      颜色的变化是通过三元素渐变的方式完成的,通过构造json,使当前的颜色与目标颜色进行对比,实现渐变的过程。

    代码如下:

      1 <!DOCTYPE html>
      2 <html>
      3 <head lang="en">
      4     <meta charset="UTF-8">
      5     <title></title>
      6     <style>
      7         div{
      8             display: inline-block;
      9             width: 50px;
     10             height: 50px;
     11             background: rgb(220,254,235);
     12             position: absolute;
     13             top: 100px;
     14         }
     15     </style>
     16 </head>
     17 <body>
     18 <div style="left: 100px"></div>
     19 </body>
     20 </html>
     21 <script>
     22     //获取元素样式,并设置
     23     function getStyle(obj,attr,value){
     24         if(arguments.length == 2){
     25             if(obj.currentStyle){
     26                 return obj.currentStyle[attr];
     27             }else{
     28                 return getComputedStyle(obj,false)[attr];
     29             }
     30         }else if(arguments.length == 3){
     31             obj.style[attr] = value;
     32         }
     33     }
     38     //运动框架  透明度 + 颜色 + 基本
     39     function move(obj,json,fn){
     40         clearInterval(obj.timer);
     41 
     42         obj.timer = setInterval(function(){
     43             var bStop = true;
     44             for(var name in json){
     45                 var iCur = 0;
     46 
     47                 if(name == "opacity"){         //若name为opacity时
     48                     iCur = parseInt(parseFloat(getStyle(obj,name))*100);
     49                     var iSpeed = (json[name]*100 - iCur)/10;
     50                     iSpeed = iSpeed>0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
     51                     obj.style.opacity = (iCur + iSpeed)/100;
     52                     obj.style.filter = "alpha(opacity:" + iCur + iSpeed +")";
     53                 }else if(name == "background"){        //若name为background时(该部分代码完全自己所想,不代表标准模式,望有更好意见的访客能给出更好的意见)
     54                     //获取颜色的三元素 str = rgb(r,g,b)
     55                     function getColor(str){             //获取到背景色的三元素,进行拆分
     56                         var s = str.substring(4,str.length-1);
     57                         var arr = s.split(",");
     58                         var r = parseInt(arr[0]);
     59                         var g = parseInt(arr[1]);
     60                         var b = parseInt(arr[2]);
     61                         return {
     62                             red : r,
     63                             green : g,
     64                             blue : b
     65                         };
     66                     }
     67 
     68                     iCur = getStyle(obj,"background-color");  //当前背景色
     69                     var newStr = json[name];
     70                     var arr = [];    //定义一个数组,用来存放新的三元素的值
     71                     var newJson = {};  //将设置的背景色写成一个json,并与getColor相对应
     72                     newJson.red = getColor(newStr).red;
     73                     newJson.green = getColor(newStr).green;
     74                     newJson.blue = getColor(newStr).blue;
     75 
     76                     for(var name in newJson){    //newJson中循环,得到最新的三元素
     77                         var cur = parseInt(getColor(iCur)[name]);
     78                         var iSpeed = (newJson[name] - cur)/10;
     79                         iSpeed = iSpeed>0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
     80                         var tmp = cur + iSpeed;
     81                         arr.push(tmp);
     82                     }
     83                     obj.style.background = "rgb(" + arr[0] + ","+ arr[1] + ","+ arr[2] + ")";
     84                 }else{     //name为width height
     85                     iCur = parseInt(getStyle(obj,name));
     86                     var iSpeed = (json[name] - iCur)/10;
     87                     iSpeed = iSpeed>0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
     88                     obj.style[name] = iCur + iSpeed + "px";
     89                 }
     90                 if(iCur != json[name]) bStop = false;
     91             }
     92             if(bStop){
     93                 clearInterval(obj.timer);
     94                 if(fn) fn();
     95             }
     96         },30)
     97     }
     98 
     99     window.onload = function(){
    100         var oDiv = document.getElementsByTagName("div")[0];
    101 
    102         oDiv.onmouseover = function(){
    103             move(oDiv,{200,height:300,opacity:0.5,background:"rgb("+234+","+" "+ 124+","+" "+ 211+")"});
    104         }
    105     }
    106 </script>
  • 相关阅读:
    第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)
    第十二节:深究内核模式锁的使用场景(自动事件锁、手动事件锁、信号量、互斥锁、读写锁、动态锁)
    第十一节:深究用户模式锁的使用场景(异变结构、互锁、旋转锁)
    第十节:利用async和await简化异步编程模式的几种写法
    第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)
    C# DataTable列名不区分大小写
    如何很好的使用Linq的Distinct方法
    Java读写记事本文件
    c# 获取方法所在的命名空间 类名 方法名
    C#中类的序列化和反序列化
  • 原文地址:https://www.cnblogs.com/lahm8963/p/6224042.html
Copyright © 2020-2023  润新知