zoukankan      html  css  js  c++  java
  • 纯js写“运动”框架

    所谓“运动”不一定真的是运动,在连续的一段时间内改变某一样式都可以成为“运动”。

    先写几个会用到的函数

    //获取某一元素的指定样式
    function getstyle (element, target) {
            // body...
            if (element.currentStyle) {
                return element.currentStyle[target];
            }else{
                return window.getComputedStyle(element, null)[target];
            }
        }
    //填充digits长度的十六进制数
        function zero_fill_hex(num, digits) {
            var s = num.toString(16);
            while (s.length < digits)
                s = "0" + s;
            return s;
        }
    
            //rgb颜色转成十六进制颜色    
        function rgb2hex(rgb) {
    
            if (rgb.charAt(0) == '#')
            return rgb;
    
            var ds = rgb.split(/D+/);
            var decimal = Number(ds[1]) * 65536 + Number(ds[2]) * 256 + Number(ds[3]);
            return "#" + zero_fill_hex(decimal, 6);
        }

    最后是“运动”框架部分

    /*
        *在连续时间内改变某一样式(运动框架)
        *@element 要改变样式的元素
        *@target 要改变的样式
        *@end 目标样式最终的值
        *@speed 改变的速度
        *@flag 是否变速改变,true为变速,false为匀速
        */
        function changeStyle (element, target, end, speed, flag) {
            // body...
            if(target.indexOf("color") != -1){
                var begin = $$.getStyle(element, target)+"";
                begin = rgb2hex(begin).replace(/#/, '');
                end = end.replace(/#/, '');
                speed = Math.ceil(Math.abs(parseInt(begin, 16)-parseInt(end, 16))/speed);
    
                clearInterval(element[target+"Timer"]);
                element[target+"Timer"] = setInterval(function(){
                    var intBegin = parseInt(begin, 16);
                    var intEnd = parseInt(end, 16);
                    speed = intEnd > intBegin ? Math.abs(speed) : (-Math.abs(speed));
    
                    if (Math.abs(intBegin-intEnd) <= Math.abs(speed)) {
                        clearInterval(element[target+"Timer"]);
                        element.style[target] = '#'+end;
                    }else {
                        var sum = intBegin + speed
                        begin = sum.toString(16);
                        element.style[target] = '#' + zero_fill_hex(begin, 6);
                    }
                }, 30);
            }
            else if (target == "opacity") {
                var begin = $$.getStyle(element, target)+"";
                clearInterval(element[target+"Timer"]);
                element[target+"Timer"] = setInterval(function(){
                    if (Math.abs(begin-end) <= Math.abs(speed)){
                        clearInterval(element[target+"Timer"]);
                        element.style.opacity = end;
                    }else{
                        begin = begin*1.0 + speed;
                        element.style.opacity = begin;
                    }
                }, 30);
            }else{
                var begin = $$.getStyle(element, target)+"";
                console.log("begin--- "+begin);
                begin = begin.replace(/px/g, '');
                clearInterval(element[target+"Timer"]);
                element[target+"Timer"] = setInterval(function(){
                    var realSpeed = Math.abs(end-begin)/speed;
                    realSpeed = realSpeed > 0 ? Math.ceil(realSpeed) : Math.floor(realSpeed);
    
                    if (Math.abs(begin-end) <= Math.abs(realSpeed)){
                        clearInterval(element[target+"Timer"]);
                        element.style[target] = end + "px";
                    }else{
                        if (flag)
                            begin = begin*1.0 + realSpeed;
                        else
                            begin = begin*1.0 + speed;
                        element.style[target] = begin + "px";
                        console.log(target+"  "+begin+"  "+realSpeed);
                    }
                }, 30);
            }
        }
  • 相关阅读:
    HTML多媒体标记之字幕标记
    认识JS的基础对象,定义对象的方法
    JDBC-ODBC桥接器连接Access数据库
    使用JQuery制作幻灯片(轮播图)
    开博11天后的第一次随笔!
    Springboot配置MongoDB连接增加mongoplus支持
    云服务器部署集锦 阿里ESC+docker+mysql+Portainer+rabbitmq+mongo
    centos8安装docker
    vue cli的使用
    MyBatis Plus数组list存入数据库之TypeHanlder类转换器
  • 原文地址:https://www.cnblogs.com/pbnull/p/5542744.html
Copyright © 2011-2022 走看看