Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to increment / decrement hex color values with javascript / jQuery

Is it possible to increment or decrement hex color values on a step-by-step basis in jQuery / javascript?

What I would like to do is something like this:

Adapting from a for-loop like

for (var i = 0; i <= 100; i++) {
    console.log(i);
}

I would like to do something like

for (var color = 000000; color <= ffffff; color++) {
    console.log(color);
}

without any conversion.

Is that possible? I've allready tried this:

for (var color = parseInt('000000', 16); color <= parseInt('ffffff', 16); color++){
    console.log(color.toString(16));
}

and it works but it's terribly slow (I get the warning that the script is slowing down the website and if I want to stop the script).

The reason why I want to do this: I would like to change the color stops of svg gradients in a certain interval. If I had for example this svg (simplified):

<svg>
    ...
    <linearGradient>
        <stop offset="0%"  stop-color="#C8E3EF"/>
        <stop offset="100%"  stop-color="#C8E3EF"/>
    </linearGradient>
    ...
</svg>

This gradient would of course appear as a solid color. Now I want to change it step by step to for example

<svg>
    ...
    <linearGradient>
        <stop offset="0%"  stop-color="#dfcf99"/>
        <stop offset="100%"  stop-color="#c5b6ec"/>
    </linearGradient>
    ...
</svg>

At each step or interval I want to go one value closer to the target color (through addition/substraction). In the end the result should be a smooth color-animation. Is that possible without the conversion? It does not have to be a for-loop btw., I just chose it to illustrate my idea.

like image 963
TimG Avatar asked Oct 17 '12 12:10

TimG


People also ask

How to increment hex value in JavaScript?

$hex = dechex(hexdec($hex)+1); // Increment the hex value. $hex = str_pad($hex, 2, "0", STR_PAD_LEFT); // Keep leading zeroes up to 2 digits.

How to specify hex color in html?

A hexadecimal color is specified with: #RRGGBB, where the RR (red), GG (green) and BB (blue) hexadecimal integers specify the components of the color.

Does html use hex colors?

HTML colors are specified with predefined color names, or with RGB, HEX, HSL, RGBA, or HSLA values.

What is html hexadecimal code?

HTML color codes are hexadecimal triplets representing the colors red, green, and blue (#RRGGBB). For example, in the color red, the color code is #FF0000, which is '255' red, '0' green, and '0' blue. There are 16,777,216 possible HTML color codes, and all are visible on a 24-bit display.


3 Answers

I wrote a gradient-function some time ago, maybe it helps you (returns an Array):

function gradient(startColor, endColor, steps) {
             var start = {
                     'Hex'   : startColor,
                     'R'     : parseInt(startColor.slice(1,3), 16),
                     'G'     : parseInt(startColor.slice(3,5), 16),
                     'B'     : parseInt(startColor.slice(5,7), 16)
             }
             var end = {
                     'Hex'   : endColor,
                     'R'     : parseInt(endColor.slice(1,3), 16),
                     'G'     : parseInt(endColor.slice(3,5), 16),
                     'B'     : parseInt(endColor.slice(5,7), 16)
             }
             diffR = end['R'] - start['R'];
             diffG = end['G'] - start['G'];
             diffB = end['B'] - start['B'];

             stepsHex  = new Array();
             stepsR    = new Array();
             stepsG    = new Array();
             stepsB    = new Array();

             for(var i = 0; i <= steps; i++) {
                     stepsR[i] = start['R'] + ((diffR / steps) * i);
                     stepsG[i] = start['G'] + ((diffG / steps) * i);
                     stepsB[i] = start['B'] + ((diffB / steps) * i);
                     stepsHex[i] = '#' + Math.round(stepsR[i]).toString(16) + '' + Math.round(stepsG[i]).toString(16) + '' + Math.round(stepsB[i]).toString(16);
             }
             return stepsHex;

         }
like image 177
John Doe Avatar answered Nov 02 '22 14:11

John Doe


Well you can do it simply by this way:

var incrementColor = function(color, step){
    var colorToInt = parseInt(color.substr(1), 16),                     // Convert HEX color to integer
        nstep = parseInt(step);                                         // Convert step to integer
    if(!isNaN(colorToInt) && !isNaN(nstep)){                            // Make sure that color has been converted to integer
        colorToInt += nstep;                                            // Increment integer with step
        var ncolor = colorToInt.toString(16);                           // Convert back integer to HEX
        ncolor = '#' + (new Array(7-ncolor.length).join(0)) + ncolor;   // Left pad "0" to make HEX look like a color
        if(/^#[0-9a-f]{6}$/i.test(ncolor)){                             // Make sure that HEX is a valid color
            return ncolor;
        }
    }
    return color;
};

For steps:

  • 1 by 1 to 256 increment last color
  • 256 by 256 increment middle color
  • 65536 by 65536 increment first color

A running example here: http://jsfiddle.net/a3JbB/

like image 11
Code-Source Avatar answered Nov 02 '22 12:11

Code-Source


Use setInterval to remove exception(stack overflow). jsfiddle

 var start = 0x000000,
    end = 0xFFFFFF, temp;
    var intervalId = setInterval(function(){
       if(start== end){clearInterval(intervalId )};
       temp = (start).toString(16);                  
             if(temp.length < 8){

                 temp = "0000000".substring(0, 8-temp.length)+temp; 
             } 
                       start++;
            console.log(temp ); 
     }, 10);   
like image 1
Anoop Avatar answered Nov 02 '22 14:11

Anoop