我如何强制这个函数总是返回六个字符十六进制颜色代码?



这段代码应该提供对比的fg和bg颜色代码,但是有一个bug:

function randomColorPair() {
const bg = '#' + Math.floor(Math.random() * 16777215).toString(16);
let fg = '#' + Math.floor(Math.random() * 16777215).toString(16);
while (Math.abs(parseInt(bg.substring(1), 16) - parseInt(fg.substring(1), 16)) < 0x777777) {
fg = '#' + Math.floor(Math.random() * 16777215).toString(16);
}
return [bg, fg];
}
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());
console.log(randomColorPair());

所以这个函数工作得很好,除了偶尔bg或fg只有4或5个字符。有些bug,但是十六进制颜色代码需要六个字符

如果需要,在.toString(16)生成的字符串的左侧填充0。将其放入函数中以实现可重用性。

const randomColor = () => (
'#' + Math.floor(Math.random() * 16777215).toString(16).padStart(0, 6)
);
function randomColorPair() {
const bg = randomColor();
let fg = randomColor();

while (Math.abs(parseInt(bg.substring(1), 16) - parseInt(fg.substring(1), 16)) < 0x777777) {
fg = randomColor();
}
return [bg, fg];
}
for (let i = 0; i < 5; i++) {
console.log(randomColorPair());
}

最新更新