Javascript 用代码片段生成渐变,一个问题就解决了

Javascript 用代码片段生成渐变,一个问题就解决了,javascript,algorithm,gradient,Javascript,Algorithm,Gradient,我使用我自己的库来处理很多东西,最近我决定添加渐变功能,但我遇到了一个问题,我似乎记得不久前也遇到过这个问题,这就是我的渐变在接近尾声时稍微偏离的问题。首先,有关守则: gradient = function(l, g) { var r = [], s = [], f = g.length - 1; for (var x = 0; x < g.length; x++) g[x] = (typeof(g[x]) == 'string' ? g[x] : g[x].join(',')

我使用我自己的库来处理很多东西,最近我决定添加渐变功能,但我遇到了一个问题,我似乎记得不久前也遇到过这个问题,这就是我的渐变在接近尾声时稍微偏离的问题。首先,有关守则:

gradient = function(l, g)
 {
var r = [], s = [], f = g.length - 1;
for (var x = 0; x < g.length; x++)
    g[x] = (typeof(g[x]) == 'string' ? g[x] : g[x].join(','))._replace(['#', ' ', 'rgb(', ')'], ''),
    g[x] = (g[x].indexOf(',') != -1
        ? g[x].split(',')
        : g[x].chunk(2).map(function(_)
         {
            return _.fromBase('hex');
         }));
for (var x = 0; x < f; x++)
    s[x] = [(g[x][0] - g[x + 1][0]) / (l - 1) * f, (g[x][1] - g[x + 1][2]) / (l - 1) * f, (g[x][2] - g[x + 1][2]) / (l - 1) * f];
for (var x = 0; x < l; x++)
    r[x] = '', ([0, 1, 2]).map(function(_)
     {
        var c = Math.floor(x / (l / (g.length - 1)));
        r[x] += (g[c][_] - s[c][_] * (x - (l / (g.length - 1)) * c)).toBase('hex').pad('0', 2);
     });
return r;
 };
gradient=函数(l,g)
{
var r=[],s=[],f=g.length-1;
对于(变量x=0;x
当然,还有我的图书馆:

在那里玩得开心!:)如果您认为您可以提供任何帮助,我在渐变代码段中使用的自定义函数是_replace()、chunk()、map()、toBase()和fromBase()。。。正如您在上所看到的,一切都很正常(至少在Opera和Firefox中是如此),除了渐变在结尾处稍微偏离(悬停以显示十六进制值)。例如,调用
gradient(50,['ffffffff','ffffff00','00ff00'])
确实创建了一个长度为50的数组,其中包含十六进制颜色值,从红色逐渐变为黄色,然后变为淡黄色,但是最后一种颜色并不完全是淡黄色(在本例中,它是05ff00);这意味着在数学上有点不对劲,而不是在方法论上

所以。。。有人愿意涉过丛林吗?这是我觉得非常美妙的代码,可以帮助我找到解决方案?非常感谢您的帮助。

梯度=功能(l,g)
gradient = function(l, g)
 {
var r = [], s = [], f = g.length - 1;
for (var x = 0; x < g.length; x++)
    g[x] = (typeof(g[x]) == 'string' ? g[x] : g[x].join(','))._replace(['#', ' ', 'rgb(', ')'], ''),
    g[x] = (g[x].indexOf(',') != -1
        ? g[x].split(',')
        : g[x].chunk(2).map(function(_)
         {
            return _.fromBase('hex');
         }));
for (var x = 0; x < f; x++)
    s[x] = [(g[x][0] - g[x + 1][0]) / (l - 1) * f, (g[x][1] - g[x + 1][1]) / (l - 1) * f, (g[x][2] - g[x + 1][2]) / (l - 1) * f];
for (var x = 0; x < l; x++)
    r[x] = '', ([0, 1, 2]).map(function(_)
     {
        var c = Math.floor(x / (l / (g.length - 1)));
        r[x] += (g[c][_] - s[c][_] * (x - ((l-1) / (g.length - 1)) * c)).toBase('hex').pad('0', 2);
     });
return r;
 };
{ var r=[],s=[],f=g.length-1; 对于(变量x=0;x 在最后一个计算行中使用(l-1)而不是l,因为您已经为l-1步骤而不是l准备了s数组


顺便说一句,你的代码真的很难理解,试着编写更容易理解和标准化的代码。不要为循环而写[0,1,2]。映射(sth)。

在FF 3.0.8中,演示页面链接对我不起作用。要澄清,正如apphacker所说,当我单击“生成”时,演示似乎没有做任何事情。你的代码是不可读的,请使用有意义的完整变量名,而不是仅仅用一个随机字母来命名;我将指向我的库的链接保留为用于我自己的服务器的链接。现在应该可以工作了……:)而且,Pim,它们不是完全随机的;图书馆是我个人使用的,所以我倾向于选择对我有意义的字母:[r]eturn,[s]teps,[g]radient,[f]ade count…是的,看看它给了你多少答案/