66 votes

Dégradé de couleurs en Javascript

En utilisant javascript avec ou sans Jquery, je dois créer un gradient de couleurs à partir d'une couleur de départ et d'arrivée. Est-ce possible de le faire par programme ?

La couleur finale ne sera jamais qu'une nuance plus foncée de la couleur de départ et c'est pour une liste non ordonnée dont je n'ai aucun contrôle sur le nombre d'éléments. Je cherche une solution qui me permette de choisir une couleur de début et de fin, de convertir la valeur hexadécimale en RVB afin de pouvoir la manipuler dans le code. Les valeurs RVB de départ sont incrémentées d'une valeur progressive calculée en fonction du nombre d'éléments.

Ainsi, si la liste comporte 8 éléments, il faut incrémenter les valeurs rouge, vert et bleu en 8 étapes pour obtenir la couleur finale. Existe-t-il une meilleure façon de procéder et si oui, où puis-je trouver un exemple de code ?

1 votes

Ce que vous décrivez est la façon dont je le ferais : il suffit de faire une interpolation linéaire entre les points de départ et d'arrivée pour chacune des trois composantes de couleur.

2 votes

Veuillez noter qu'il existe différents types de dégradés : si vous souhaitez réaliser un dégradé qui passe par le rouge -> jaune -> vert -> bleu, vous devrez probablement obtenir les valeurs HSL plutôt que les valeurs RGB.

111voto

anomal Points 758

J'ai créé une bibliothèque JS, RainbowVis-JS pour résoudre ce problème général. Il suffit de définir le nombre d'éléments à l'aide de la fonction setNumberRange et définir la couleur de début et de fin en utilisant setSpectrum . Vous obtenez alors le code couleur hexagonal avec colourAt .

var numberOfItems = 8;
var rainbow = new Rainbow(); 
rainbow.setNumberRange(1, numberOfItems);
rainbow.setSpectrum('red', 'black');
var s = '';
for (var i = 1; i <= numberOfItems; i++) {
    var hexColour = rainbow.colourAt(i);
    s += '#' + hexColour + ', ';
}
document.write(s); 
// gives:
// #ff0000, #db0000, #b60000, #920000, #6d0000, #490000, #240000, #000000, 

Vous pouvez consulter le code source de la bibliothèque :)

4 votes

Parfait ! C'est exactement ce que je cherchais. Merci

2 votes

Merci, très utile. Je l'utilise pour les prochaines élections en Iran ;)

3 votes

Votre bibliothèque est vraiment géniale !

54voto

Euler Junior Points 441

Fonction correcte pour générer un tableau de couleurs !

function hex (c) {
  var s = "0123456789abcdef";
  var i = parseInt (c);
  if (i == 0 || isNaN (c))
    return "00";
  i = Math.round (Math.min (Math.max (0, i), 255));
  return s.charAt ((i - i % 16) / 16) + s.charAt (i % 16);
}

/* Convert an RGB triplet to a hex string */
function convertToHex (rgb) {
  return hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]);
}

/* Remove '#' in color hex string */
function trim (s) { return (s.charAt(0) == '#') ? s.substring(1, 7) : s }

/* Convert a hex string to an RGB triplet */
function convertToRGB (hex) {
  var color = [];
  color[0] = parseInt ((trim(hex)).substring (0, 2), 16);
  color[1] = parseInt ((trim(hex)).substring (2, 4), 16);
  color[2] = parseInt ((trim(hex)).substring (4, 6), 16);
  return color;
}

function generateColor(colorStart,colorEnd,colorCount){

    // The beginning of your gradient
    var start = convertToRGB (colorStart);    

    // The end of your gradient
    var end   = convertToRGB (colorEnd);    

    // The number of colors to compute
    var len = colorCount;

    //Alpha blending amount
    var alpha = 0.0;

    var saida = [];

    for (i = 0; i < len; i++) {
        var c = [];
        alpha += (1.0/len);

        c[0] = start[0] * alpha + (1 - alpha) * end[0];
        c[1] = start[1] * alpha + (1 - alpha) * end[1];
        c[2] = start[2] * alpha + (1 - alpha) * end[2];

        saida.push(convertToHex (c));

    }

    return saida;

}

// Exemplo de como usar

var tmp = generateColor('#000000','#ff0ff0',10);

for (cor in tmp) {
  $('#result_show').append("<div style='padding:8px;color:#FFF;background-color:#"+tmp[cor]+"'>COLOR "+cor+"° - #"+tmp[cor]+"</div>")

}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result_show"></div>

0 votes

Exactement ce que je recherchais. Merci.

1 votes

Pouvez-vous faire cela avec plusieurs couleurs ? j'ai essayé mais je n'y arrive pas stackoverflow.com/questions/51659031/

0 votes

@FussinHussin oui j'ai créé une autre fonction qui utilise essentiellement deux tableaux générés à partir de generateColor où je saisis une couleur de début, de milieu et de fin. Puis je combine les tableaux et c'est un dégradé de 3 couleurs.

31voto

desau Points 1585

Oui, absolument.

Je fais cela en Java, cela devrait être assez simple à faire en JavaScript aussi.

Tout d'abord, vous devez décomposer les couleurs en composantes RVB.

Calculez ensuite les différences entre le début et la fin des composants.

Enfin, calculez la différence en pourcentage et multipliez-la par la couleur de départ de chaque composant, puis ajoutez-la à la couleur de départ.

En supposant que vous puissiez obtenir les valeurs RVB, ça devrait le faire :

var diffRed = endColor.red - startColor.red;
var diffGreen = endColor.green - startColor.green;
var diffBlue = endColor.blue - startColor.blue;

diffRed = (diffRed * percentFade) + startColor.red;
diffGreen = (diffGreen * percentFade) + startColor.green;
diffBlue = (diffBlue * percentFade) + startColor.blue;

Le "percentFade" est une valeur décimale flottante, qui indique le degré de fondu dans la "endColor". 1 correspond à un fondu complet (créant ainsi la couleur finale). 0 signifie aucun fondu (la couleur de départ).

1 votes

Ce deuxième ensemble d'affectations est l'ensemble des nouvelles couleurs

21voto

drinor Points 730

J'utilise cette fonction en me basant sur la réponse de @desau :

 getGradientColor = function(start_color, end_color, percent) {
   // strip the leading # if it's there
   start_color = start_color.replace(/^\s*#|\s*$/g, '');
   end_color = end_color.replace(/^\s*#|\s*$/g, '');

   // convert 3 char codes --> 6, e.g. `E0F` --> `EE00FF`
   if(start_color.length == 3){
     start_color = start_color.replace(/(.)/g, '$1$1');
   }

   if(end_color.length == 3){
     end_color = end_color.replace(/(.)/g, '$1$1');
   }

   // get colors
   var start_red = parseInt(start_color.substr(0, 2), 16),
       start_green = parseInt(start_color.substr(2, 2), 16),
       start_blue = parseInt(start_color.substr(4, 2), 16);

   var end_red = parseInt(end_color.substr(0, 2), 16),
       end_green = parseInt(end_color.substr(2, 2), 16),
       end_blue = parseInt(end_color.substr(4, 2), 16);

   // calculate new color
   var diff_red = end_red - start_red;
   var diff_green = end_green - start_green;
   var diff_blue = end_blue - start_blue;

   diff_red = ( (diff_red * percent) + start_red ).toString(16).split('.')[0];
   diff_green = ( (diff_green * percent) + start_green ).toString(16).split('.')[0];
   diff_blue = ( (diff_blue * percent) + start_blue ).toString(16).split('.')[0];

   // ensure 2 digits by color
   if( diff_red.length == 1 ) diff_red = '0' + diff_red
   if( diff_green.length == 1 ) diff_green = '0' + diff_green
   if( diff_blue.length == 1 ) diff_blue = '0' + diff_blue

   return '#' + diff_red + diff_green + diff_blue;
 };

Ejemplo:

getGradientColor('#FF0000', '#00FF00', 0.4);
=> "#996600"

6voto

Fidel Points 844

La réponse de Desau est génial. Le voici en javascript :

function hexToRgb(hex) {
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

function map(value, fromSource, toSource, fromTarget, toTarget) {
  return (value - fromSource) / (toSource - fromSource) * (toTarget - fromTarget) + fromTarget;
}

function getColour(startColour, endColour, min, max, value) {
  var startRGB = hexToRgb(startColour);
  var endRGB = hexToRgb(endColour);
  var percentFade = map(value, min, max, 0, 1);

  var diffRed = endRGB.r - startRGB.r;
  var diffGreen = endRGB.g - startRGB.g;
  var diffBlue = endRGB.b - startRGB.b;

  diffRed = (diffRed * percentFade) + startRGB.r;
  diffGreen = (diffGreen * percentFade) + startRGB.g;
  diffBlue = (diffBlue * percentFade) + startRGB.b;

  var result = "rgb(" + Math.round(diffRed) + ", " + Math.round(diffGreen) + ", " + Math.round(diffBlue) + ")";
  return result;
}

function changeBackgroundColour() {
  var count = 0;
  window.setInterval(function() {
    count = (count + 1) % 200;

    var newColour = getColour("#00FF00", "#FF0000", 0, 200, count);

    document.body.style.backgroundColor = newColour;
  }, 20);
}

changeBackgroundColour();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X