search

Home  >  Q&A  >  body text

javascript - 怎么用js实现渐变切换背景颜色

我的思路是弄一个数组把几种颜色放进去,然后设置一个时间(时间较短),从数组的第一个颜色快速渐变到数组的第二个颜色,变成第二个颜色后再停留一阵子(时间较长),再从第二个元素快速渐变到第三个元素,接着就是像这样的循环,我不知道怎么改变rgb的值也不太清楚怎么实现一直循环,求位指教!谢谢了!

PHPzPHPz2822 days ago713

reply all(7)I'll reply

  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:12:00

    循环的话可以用setInterval函数,然后再里面实现颜色切换:

    $("body").css('background-color',颜色值);
    

    补充:
    其实完全可以用css3的animation实现。

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:12:00

    <!DOCTYPE html>
    <html>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <head>
          <script type="text/javascript" src="script/jquery-1.4.4.min.js"></script>
    
          <script>
            $(function(){
                var orgColors=[
                    {r:0,g:0,b:255},
                    {r:255,g:127,b:80},
                    {r:34,g:165,b:13}
                    ]
                var colorGrandientSteps=10;
                //form color1  to   color2
                function getColor(color0,color1,curstep,defaultStep){
                    return {
                        g:parseInt(color0.g+(color1.g-color0.g)/defaultStep*curstep,10),
                        r:parseInt(color0.r+(color1.r-color0.r)/defaultStep*curstep,10),
                        b:parseInt(color0.b+(color1.b-color0.b)/defaultStep*curstep,10)
                    }
                }
                var renderColor=(function(colors,defaultStep){
                    var curstep=1;
                    var color1=colors[0],color2=colors[1];
                    return function(){
                        var newColor=getColor(color1,color2,curstep,defaultStep);
                        var cssColor='rgb('+newColor.r+','+newColor.g+','+newColor.b+')';
                        $('p#colorp').css({
                            "background-color":cssColor
                        });
                        curstep++;
                        if(curstep===defaultStep+1){
                            //curstep 置为=1
                            curstep=1;
                            colors.push(color1);
                            colors.shift();
                            color1=colors[0];
                            color2=colors[1];
                        }
                    }
                })(orgColors,colorGrandientSteps);
    
                setInterval(function(){
                    renderColor();
                },50);
    
            });
          </script>
    
      </head>
      <body style="margin:0px;border:0px solid #cccccc;width:100%;height:100%"  >
         <p id="colorp" style="width:100px;height:100px;border:1px solid #cccccc;"></p>
    
      </body>
    </html>
    

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:12:00

    屎代码,题主将就看吧,望大大狂喷

    ;(function changeColor() {
            var arr = ['#00CC99', '#00FFFF', '#CCCCFF']
            var t = 2000
            var n = false
            var body = document.querySelector('body')
            body.style.transition = 'background-color 500ms'
    
            function change() {
                n = !n
                var v = arr.shift()
                body.style.backgroundColor = v
                arr.push(v)
                if(n) {
                    setTimeout(change, t)
                } else {
                    setTimeout(change, 3*t)
                }
            }
    
            change()
        })()
    

    直接复制粘贴到console,enter看效果

    reply
    0
  • PHPz

    PHPz2017-04-10 15:12:00

    我重新描述下我理解到你想要的动画过程吧!不对请指出
    time0: 颜色1
    time1: 维持颜色1
    time2: 开始向颜色2渐变(此时任然是颜色1)
    time3: 颜色完全由颜色1渐变为颜色2
    time4: 维持颜色2
    。。。
    重复以上过程(颜色可以不止2种)
    其中 time1 - time0 是颜色维持的时间(较长)
    time2 = time1
    time3 - time2 是颜色渐变的过渡时间(较短)
    time4 - time3 = time1 - time0

    如果上述描述的过程是题主的意思,请往下看,否则可以忽略了
    这个东西可以用纯css实现,也可以css结合js实现

    纯css实现使用css3的animate + keyframe来实现,不多做介绍

    css+js实现:

    css部分

    cssselector {
        transition: background-color (time3-time2) 过渡的函数;
        /* 其它样式 */
    }
    

    js部分

    以下的$element是这个元素的jquery实例

    javascriptvar color_array = [color1, color2, color3, color4];//你说的颜色数组
    var current_color_index = 0;
    var duration = time3 - time0; //颜色的维持时间 + 颜色的过渡时间
    
    function colorChange() {
        //将颜色更改,然后css会执行渐变的过程
        $element.css('background-color', color_array[current_color_index]);
        //确保在颜色数组内循环变化
        current_color_index = (current_color_index + 1) % color_array.length;
        //定时改变颜色,可以将这个动作放到外部通过setInterval来循环,就这个例子来说,他们之间没太大区别。
        setTimeout(arguments.callee, duration);
    }
    
    colorChange();
    

    reply
    0
  • 阿神

    阿神2017-04-10 15:12:00

    正好我以前写过一个这个,是你要的东西吗?

    http://codepen.io/fishenal/pen/LhHsg

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:12:00

    以前写的,仅供参考啊。
    http://www.cnblogs.com/zjfree/archive/2011/10/20/2219071.html
    http://www.cnblogs.com/zjfree/archive/2011/10/20/2219044.html

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:12:00

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Document</title>
    </head>
    <body>
        <script>
    
            
        var color1=null;
        var color2=null;
        function random(){
            return '#'+Math.random().toString(16).slice(2,8);
        }
    
        function start(){
        color1=random();
        document.body.style.backgroundColor=color1;    
        setTimeout(changeColor, 2000);
    }
     
        function changeColor(){
            var a,b,c,i=0;
            var animate=null;
            color2=random();
            
            var array1=strSlip(color1);
            var array2=strSlip(color2);
            
            var r1=array2[0]-array1[0];
            var r2=array2[1]-array1[1];
            var r3=array2[2]-array1[2];
    
             animate=setInterval(function(){
                
                array1[0]=array1[0]+Math.round(r1/30);
                array1[1]=array1[1]+Math.round(r2/30);
                array1[2]=array1[2]+Math.round(r3/30);
                a=array1[0].toString(16);
                b=array1[1].toString(16);
                c=array1[2].toString(16);
                i++;    
                document.body.style.backgroundColor=returnColor(a,b,c);
                if(i==20){
                    clearInterval(animate);
                    color1=returnColor(a,b,c);
                }
            },100);
            setTimeout(changeColor, 7000);
            
        }
    
    
        function returnColor(a,b,c){
             return "#"+a+b+c;
        }
        function strSlip(str){
            var num=[];
            var x=parseInt(str.substring(1,3),16);
            var y=parseInt(str.substring(3,5),16);
            var z=parseInt(str.substring(5,7),16);
            num.push(x);
            num.push(y);
            num.push(z);
            return num;
        }
    start();
    
        </script>
    </body>
    </html>

    reply
    0
  • Cancelreply