使用javascript分配随机选取的颜色
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用javascript分配随机选取的颜色,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3221字,纯文字阅读大概需要5分钟。
内容图文
我的页面中有一个网格,我想通过带有200个元素的javascript填充.填充.grid元素的实际代码如下:
$(function () {
var $gd = $(".grid");
var blocks="";
for(i=0; i < 200; i++){
blocks += '<div class="block"></div>';
}
$gd.append(blocks);
});
我现在要做的是为每个元素分配从列表中随机选取的颜色.让我们说红色,蓝色,黄色,绿色(意外的呃?).我希望这些值是最随机的,也可以避免相应的颜色再次被选中两次(只是为了清楚,它可以是像红 – 蓝 – 红 – 绿 – 蓝等等,不是红 – 红 – 绿 – 黄).
也许这可以在随机化过程中提供帮助,Fisher–Yates Shuffle,但我不知道如何实现上述非两次相邻规则(如果可以应用的话).
实现这一结果的最佳方法是什么?我也想知道我是否可以对每个.block应用渐变而不是扁平的十六进制颜色;我想更好的方法是为CSS中映射的渐变等每个元素分配一个随机类,依此类推.
如果上面的脚本可以在性能方面进行优化,我会提出任何建议!
附加信息:
>我正在使用jQuery
>网格由每行20个元素组成,共10行
>颜色应该是4,但是可以提高到5-7,如果有帮助的话可以添加一些中性灰色调
这是一支试验http://codepen.io/Gruber/pen/lDxBw/的笔
奖金功能要求:如上所述,我希望避免重复的相邻颜色.是否有可能避免这种“上下”?我觉得如果不是不可能完全避免这种情况很难,但如果有人能找到解决方案那就太棒了!
像这样的东西,防止“nope”标记元素,而标记的“yep”对角线是允许的:
解决方法:
我想介绍的第一件事是过滤索引功能.
给定一个数组:
var options = ['red', 'green', 'blue', 'purple', 'yellow']; // never less than 3!
还有一个过滤器:
function filterFunc(val) {
var taken = { 'red': 1, 'blue': 1 };
return taken[val] ? 0 : 1;
}
我们可以通过过滤器从允许的值(== 1)中获取第n个项目(不是快速的方法,但是直到存在性能约束……):
// filteredIndex returns nth (0-index) element satisfying filterFunc
// returns undefined if insufficient options
function filteredIndex(options, filterFunc, n) {
var i=-1, j=0;
for(;j<options.length && i<n; ++j) {
i += filterFunc(options[j]);
if(i==n)
break;
}
return options[j];
}
所以现在我们可以在筛选列表中选择索引为2的值.如果我们没有足够的选择这样做,我们应该未定义.
如果您填充左上角的颜色,则可以使用少至3种颜色,因为您只受上方和左侧单元格的约束.
要随机选择,我们需要设置过滤器.我们可以从已知值列表中做到这一点:
function genFilterFunc(takenValues) {
var takenLookup = {};
for(var i=0; i < takenValues.length; ++i) {
takenLookup[takenValues[i]] = 1;
}
var filterFunc = function(val) {
return takenLookup[val] ? 0 : 1;
};
return filterFunc;
}
我们可以选择随机颜色,然后,对于网格中的单元格[rows] [cols]:
function randomColourNotUpOrLeft(grid, row, col, options, ignoreColour) {
var takenlist = [];
if(row > 0 && grid[row-1][col] != ignoreColour) {
takenlist.push(grid[row-1][col]);
}
if(col > 0 && grid[row][col-1] != ignoreColour) {
takenlist.push(grid[row][col-1]);
}
var filt = genFilterFunc(takenlist);
var randomIndex = Math.floor(Math.random()*(options.length-takenlist.length));
var randomColour = filteredIndex(options, filt, randomIndex);
return randomColour;
}
请注意,使用的随机索引取决于滤出的颜色数量;如果有4个左边我们可以有0-3,但如果只剩下2个则必须是0-1等.当相邻的单元格是相同的颜色和/或我们在边界附近时,对其中的约束较少选择颜色.最后填写一个网格:
function fillGridSpeckled(grid, options, nullColour) {
for(var row=0; row<grid.length; ++row) {
for(var col=0; col<grid[row].length; ++col) {
grid[row][col] = randomColourNotUpOrLeft(grid,row,col,options,nullColour);
}
}
}
我已经把它全部放在了this jsbin,还有几位来演示代码工作.
内容总结
以上是互联网集市为您收集整理的使用javascript分配随机选取的颜色全部内容,希望文章能够帮你解决使用javascript分配随机选取的颜色所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。