2010-06-20 13 views
36

Jquery के साथ या उसके बिना जावास्क्रिप्ट का उपयोग करके, मुझे स्टार्ट और फिनिश रंग के आधार पर रंगों का ढाल बनाना होगा। क्या प्रोग्रामेटिक रूप से ऐसा करना संभव है?जावास्क्रिप्ट रंग ढाल

अंत रंग केवल स्टार्ट रंग की गहरा छाया होने जा रहा है और यह एक अनियमित सूची के लिए है जिसका मेरे पास ली आइटमों की संख्या पर कोई नियंत्रण नहीं है। मैं एक ऐसे समाधान की तलाश में हूं जो मुझे प्रारंभ और अंत रंग चुनने की अनुमति देता है, हेक्स मान को आरजीबी में परिवर्तित कर देता है ताकि इसे कोड में छेड़छाड़ की जा सके। शुरुआती आरजीबी मूल्यों की संख्या के आधार पर गणना की गई एक चरण मूल्य से वृद्धि हुई है।

इसलिए यदि सूची में 8 आइटम थे तो अंतिम रंग प्राप्त करने के लिए इसे 8 चरणों में अलग लाल ग्रीन ब्लू मानों को बढ़ाने की आवश्यकता है। क्या ऐसा करने का कोई बेहतर तरीका है और यदि ऐसा है तो मुझे कुछ नमूना कोड कहां मिल सकता है?

+1

क्या आप का वर्णन जिस तरह से मैं यह कर देगी: सिर्फ तीन रंग घटकों से प्रत्येक के लिए प्रारंभ और अंत बिंदु के बीच एक रैखिक प्रक्षेप है। – Pointy

+2

कृपया ध्यान दें कि विभिन्न प्रकार के ढाल हैं: यदि आप जो ग्रेडियेंट को लाल -> पीले -> हरे -> नीले रंग से गुजरते हैं, तो आपको शायद आरजीबी मूल्यों के बजाय एचएसएल मान प्राप्त करने की आवश्यकता होगी। – vaab

उत्तर

20

हां, बिल्कुल।

मैं जावा में ऐसा करता हूं, जावास्क्रिप्ट में भी करना काफी सरल होना चाहिए।

सबसे पहले, आपको रंगों को आरजीबी घटकों में तोड़ने की आवश्यकता होगी।

फिर घटकों की शुरुआत और समाप्ति के बीच मतभेदों की गणना करें।

अंत में, प्रतिशत अंतर की गणना करें और प्रत्येक घटक के प्रारंभ रंग से गुणा करें, फिर इसे प्रारंभ रंग में जोड़ें।

मान लिया जाये कि आप आरजीबी मूल्यों को प्राप्त कर सकते हैं, यह यह करना चाहिए:

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; 

"percentFade" एक अस्थायी दशमलव, वाचक कितनी दूर "endColor" में फीका करने के लिए है। 1 एक पूर्ण फीका होगा (इस प्रकार अंत रंग बना रहा है)। 0 कोई फीका नहीं होगा (प्रारंभिक रंग)।

+1

कि असाइनमेंट का दूसरा सेट नए रंगों का सेट है – alxndr

0

आप तत्वों की सूची पुनर्प्राप्त कर सकते हैं। मैं jQuery से परिचित नहीं हूं, लेकिन prototypejs में Element.childElements() है जो एक सरणी लौटाएगा। एक बार जब आप सरणी की लंबाई जानते हैं, तो आप निर्धारित कर सकते हैं कि प्रत्येक चरण के लिए पिक्सेल घटकों को कितना बदला जाए। निम्न में से कुछ कोड मैंने उस फॉर्म में परीक्षण नहीं किया है जिसे मैं प्रस्तुत कर रहा हूं, लेकिन उम्मीद है कि आपको एक विचार देना चाहिए।

function hex (c) { 
    var s = "abcdef"; 
    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); 
} 


/* The start of your code. */ 
var start = convertToRGB ('#000000'); /* The beginning of your gradient */ 
var end = convertToRGB ('#ffffff'); /* The end of your gradient */ 
var arr = $('.gradientList').childElements(); 
var len = arr.length();     /* The number of colors to compute */ 
var alpha = 0.5;       /* Alpha blending amount */ 

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

    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]; 

    /* Set the background color of this element */ 
    arr[i].setStyle ({ 'background-color': convertToHex (c) }); 
} 
+2

अपने 'हेक्स' फ़ंक्शन को बस' .toString (16) 'के साथ बदलने पर विचार करें। – haylem

+1

इसमें कई त्रुटियां हैं। उदाहरण के लिए कनवर्ट टीओआरजीबी वास्तव में कुछ भी वापस नहीं करता है :) –

67

मैंने इस सामान्य समस्या को हल करने के लिए एक जेएस लाइब्रेरी, RainbowVis-JS बनाया है। आपको बस setNumberRange का उपयोग करके आइटमों की संख्या निर्धारित करनी है और setSpectrum का उपयोग करके प्रारंभ और अंत रंग सेट करना होगा। फिर आपको हेक्स रंग कोड 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, 

लाइब्रेरी के स्रोत कोड को देखने के लिए आपका स्वागत है। :) काम कर

+3

बिल्कुल सही! यही वही है जो मैं ढूंढ रहा था। धन्यवाद –

+0

यह वास्तव में उपयोगी लिपि, अच्छा काम है। –

+1

धन्यवाद, बहुत उपयोगी है। ईरान में आने वाले चुनावों के लिए इसका इस्तेमाल करना। ;) – pp19dd

1

ऐसे नहीं पराक्रमी लेकिन ज्यादातर मामलों में और आपको निम्न कोड के लिए jQuery को छोड़कर किसी भी अन्य पुस्तकालयों को शामिल करने की जरूरत नहीं है:

HTML:

<div id="colors"></div> 

जावास्क्रिप्ट:

function rainbow(value, s, l, max, min, start, end) { 
    value = ((value - min) * (start - end)/max)+end; 
    return 'hsl(' + value + ','+s+'%,'+l+'%)'; 
} 

function createRainbowDiv(start,end){ 
    var gradient = $("<div>").css({display:"flex", "flex-direction":"row",height:"100%"}); 
    for (var i = start; ((i <= end) && (i >= start)) || ((i >= end) && (i <= start)); 
     i += (end-start)/Math.abs(end-start)){ 
      gradient.append($("<div>").css({float:"left","background-color":rainbow(i, 100,50, Math.max(start,end), Math.min(start,end), start,end),flex:1})); 
    } 

    return gradient; 
} 

$("#colors").append(createRainbowDiv(0,150)); 
$("#colors").css("width","100%").css("height","10px"); 

यह एक div बनाना चाहिए जिसमें इंद्रधनुष शामिल है।देखें http://jsfiddle.net/rootandy/54rV7/

10

मैं इस समारोह @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; 
}; 

उदाहरण:

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

सही समारोह रंग की सरणी उत्पन्न करने के लिए!

function hex (c) { 
 
    var s = "abcdef"; 
 
    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){ 
 

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

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

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

 
\t //Alpha blending amount 
 
\t var alpha = 0.0; 
 

 
\t var saida = []; 
 
\t 
 
\t for (i = 0; i < len; i++) { 
 
\t \t var c = []; 
 
\t \t alpha += (1.0/len); 
 
\t \t 
 
\t \t c[0] = start[0] * alpha + (1 - alpha) * end[0]; 
 
\t \t c[1] = start[1] * alpha + (1 - alpha) * end[1]; 
 
\t \t c[2] = start[2] * alpha + (1 - alpha) * end[2]; 
 

 
\t \t saida.push(convertToHex (c)); 
 
\t \t 
 
\t } 
 
\t 
 
\t return saida; 
 
\t 
 
} 
 

 
// 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>") 
 
    
 
} 
 
\t
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="result_show"></div>

+1

आप एक आधुनिक दिन पिकासो हैं। यह नशा है!!! – lol

+0

ठीक वही मैंने देखा। धन्यवाद। – DolceVita

1

मैं एक समाप्ति के रंग गतिशील तत्वों में से एक अज्ञात सेट के लिए रंग विकल्पों में से एक बहुत बड़ी सरणी बनाने के लिए आवश्यक है, लेकिन मैं एक शुरुआत रंग के माध्यम से अपनी तरह से बढ़ाने के लिए प्रत्येक तत्व की जरूरत है और । इस प्रकार का तर्क "प्रतिशत फीका" दृष्टिकोण का पालन करता है सिवाय इसके कि मुझे उस तर्क के बाद एक कठिन समय था। इस प्रकार मैंने दो आरजीबी रंग मानों के इनपुट का उपयोग करके और पृष्ठ पर तत्वों की संख्या की गणना करके इसका संपर्क किया।

यहां एक link to a codepen है जो अवधारणा को प्रदर्शित करता है।

नीचे समस्या का एक कोड स्निपेट है।

<style> 
     #test { 
      width:200px; 
      height:100px; 
      border:solid 1px #000; 
     } 

     .test { 
      width:49%; 
      height:100px; 
      border:solid 1px #000; 
      display: inline-block; 
     } 
    </style> 
</head> 
<body> 

<div id="test"></div> 

<div class="test"></div> 

<div class="test"></div> 

<div class="test"></div> 

<div class="test"></div> 

<div class="test"></div> 

<div class="test"></div> 

<div class="test"></div> 

<div class="test"></div> 

<div class="test"></div> 

<div class="test"></div> 

    <script> 

     var GColor = function(r,g,b) { 
      r = (typeof r === 'undefined')?0:r; 
      g = (typeof g === 'undefined')?0:g; 
      b = (typeof b === 'undefined')?0:b; 
      return {r:r, g:g, b:b}; 
     }; 


     // increases each channel by the difference of the two 
     // divided by 255 (the number of colors stored in the range array) 
     // but only stores a whole number 
     // This should respect any rgb combinations 
     // for start and end colors 

     var createColorRange = function(c1) { 
      var colorList = [], tmpColor, rr = 0, gg = 0, bb = 0; 
      for (var i=0; i<255; i++) { 
      tmpColor = new GColor(); 
       if (rExp >= 0) { 

       tmpColor.r = Math.floor(c1.r - rr); 
       rr += rAdditive; 

       } else { 

       tmpColor.r = Math.floor(c1.r + rr); 
       rr += rAdditive; 
       } 

       if (gExp >= 0) { 

       tmpColor.g = Math.floor(c1.g - gg); 
       gg += gAdditive; 

       } else { 

       tmpColor.g = Math.floor(c1.g + gg); 
       gg += gAdditive; 
       } 

       if (bExp >= 0) { 

       tmpColor.b = Math.floor(c1.b - bb); 
       bb += bAdditive; 

       } else { 

       tmpColor.b = Math.floor(c1.b + bb); 
       bb += bAdditive; 

       } 

       console.log(tmpColor); 


       colorList.push(tmpColor); 
      } 
      return colorList; 
     }; 

     /* ================== 
     Testing Code Below 
     ================== */ 


     var firstColor = new GColor(255, 24, 0); 
     var secondColor = new GColor(255, 182, 0); 

     // Determine the difference 
     var rExp = firstColor.r - secondColor.r; 

     // Divide that difference by length of the array 
     // you would like to create (255 in this case) 
     var rAdditive = Math.abs(rExp)/255; 

     var gExp = firstColor.g - secondColor.g; 
     var gAdditive = Math.abs(gExp)/255; 

     var bExp = firstColor.b - secondColor.b; 
     var bAdditive = Math.abs(bExp)/255; 

     var range = createColorRange(firstColor, secondColor); 
     console.log(range); 
     var pointer = 0; 


     // This gently cycles through 
     // all the colors on a single element 
     function rotateColors() { 
      var currentColor = range[pointer]; 
      document.getElementById("test").style.backgroundColor = "rgb("+currentColor.r+","+currentColor.g+","+currentColor.b+")"; 
      pointer++; 
      if (pointer < range.length) window.setTimeout(rotateColors, 5); 
     } 

     rotateColors(); 

     // say I have 5 elements 
     // so I need 5 colors 
     // I already have my first and last colors 
     // but I need to locate the colors between 
     // my start color and my end color 
     // inside of this range 
     // so I divide the range's length by the 
     // number of colors I need 
     // and I store the index values of the middle values 

     // those index numbers will then act as my keys to retrieve those values 
     // and apply them to my element 

     var myColors = {}; 
     var objects = document.querySelectorAll('.test'); 
     myColors.num = objects.length; 


     var determineColors = function(numOfColors, colorArray) { 
     var colors = numOfColors; 

     var cRange = colorArray; 
     var distance = Math.floor(cRange.length/colors); 
     var object = document.querySelectorAll('.test'); 

     var j = 0; 
     for (var i = 0; i < 255; i += distance) { 

      if ((i === (distance*colors))) { 
      object[j].style.backgroundColor = "rgb(" + range[255].r + ", " + range[255].g + ", " + range[255].b + ")"; 

      j = 0; 
      // console.log(range[i]); 
      } else { 

       // Apply to color to the element 
       object[j].style.backgroundColor = "rgb(" + range[i].r + ", " + range[i].g + ", " + range[i].b + ")"; 


        // Have each element bleed into the next with a gradient 
       // object[j].style.background = "linear-gradient(90deg, rgb(" + range[i].r + ", " + range[i].g + ", " + range[i].b + "), rgb(" + range[i+distance].r + ", " + range[i+distance].g + ", " + range[i+distance].b + "))"; 

      j++; 
      } 

     } 
     }; 


     setTimeout(determineColors(myColors.num, range), 2000); 

    </script> 
</body> 
1

xolor library एक ढाल समारोह है। यह एक अंत रंग के लिए एक शुरुआत रंग से एक ढाल में 8 रंगों के साथ एक सरणी पैदा करेगा:

var gradientColors = [] 
var startColor = "rgb(100,200,50)", endColor = "green" 
var start = xolor(startColor) 
for(var n=0; n<8; n++) { 
    gradientColors.push(start.gradient(endColor, n/8)) 
} 

GitHub पर अधिक देखें: https://github.com/fresheneesz/xolor

0

desau's answer महान है। यहाँ यह जावास्क्रिप्ट में है:

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();

संबंधित मुद्दे