【发布时间】:2016-02-01 15:06:02
【问题描述】:
在我的 javascript 文件中,我有一组由字母和数字组成的情侣,例如:{(A,5), (B,7), ..., (Z,3)}。
对于每一对 (A,x),我的 html 中有 x div 和 style = "background-color: {{object.color}}"。
我想写一个方法来随机计算每对 (A,x) 的 x 颜色,这样:
- 每种颜色都足以区分所有颜色。
- 同一对情侣的每种颜色都足够接近来识别这对情侣。
例如:我有这对夫妇:{(A,5), (B,4), (C,10)} 所以我的 html 中有 19 个 div。对于集合 A 的所有 5 个 div,我计算出蓝色,对于集合 B 的所有 4 个 div,我计算出绿色,对于集合 C 的所有 10 个 div,我计算出红色。
当然,你不知道这对夫妇是提前认识的:)
有没有办法做到这一点,也许使用 css 上每种颜色的 RGB 值或类似的东西?
目前我只做了一个方法,我完全随机选择每种颜色,只避免颜色太深或太白,并且有一个循环来保证已经拍摄的颜色不能被拍摄两次:
function(){
var cb=0;
var cr=0;
var cg=0;
var minEcart=40;
var testB=true;
var cptI=0;
while(testB){
testB=false;
cr=Math.round(Math.random()*170) + 85;
cb=Math.round(Math.random()*170) + 85;
cg=Math.round(Math.random()*170) + 85;
for(var j=0; j<$scope.colorAlreadyGiven.length;j++){
if(($scope.colorAlreadyGiven[j][0]-cb>=-minEcart)&&
($scope.colorAlreadyGiven[j][0]-cb<=minEcart)&&
($scope.colorAlreadyGiven[j][1]-cg>=-minEcart)&&
($scope.colorAlreadyGiven[j][1]-cg<=minEcart)&&
($scope.colorAlreadyGiven[j][2]-cr>=-minEcart)&&
($scope.colorAlreadyGiven[j][2]-cr<=minEcart)){
testB=true;
cptI++;
if(cptI>=50){
testB=false;
}
}
}
}
$scope.colorAlreadyGiven.push([cb,cg,cr]);
return "#"+(cb+cg*256+cr*65536).toString(16);
}
感谢您的关注。
【问题讨论】:
-
目前我有一种方法可以选择随机颜色,避免颜色太深或太白,并使用循环确保不能再次选择已经选择的任何颜色,但我没有发现任何东西可以将颜色保持在特定范围内,从而可以知道我来自哪个集合。
-
@LyxtheLyxos - 提示:不要在 RGBA 色彩空间中工作。在 HSLA 工作。这样,只有一个组件负责色相或颜色,另一个负责颜色的饱和度或数量,三分之一负责亮度或亮度/暗度,最后一个负责 Alpha 值,这可能是 100%(完全不透明)适用于您的用例。这是一个 HSLA 颜色选择器示例:standardista.com/webkit/ch7/hsla.html 请注意它比 RGBA 更人性化多少? ;)
标签: javascript css angularjs random background-color