我有一个非常奇怪的例子可以继续...... 我需要填充1x1像素的圆圈,在浏览器中使用不同的颜色。
我尝试的是这样的
function getRandomColor() {
var letters = '0123456789ABCDEF'.split('');
var color = '#';
for (var i = 0; i < 6; i++ ) {
color += letters[Math.round(Math.random() * 15)];
}
return color;
}
function createRandomSqaure(destination) {
var size = destination.height() * destination.width();
for (var i = 0; i < size; i += 1) {
destination.append('<div class="pixel" style="background: ' + getRandomColor() + '"></div>');
}
}
createRandomSqaure($('.pic'));
案例是,它超级慢(你可以想象,200x200图像的循环次数为40k),我想也许更好的方法是在画布上绘制它? 我需要在最后绘制一个充满这些像素的圆圈......
我不知道如何以更优化的方式做这样的事情,我也可以使用nodejs服务器,但我认为在heroku上生成类似服务器端的东西太多了。
我只是好奇你们有什么想法,做这样的事情最好的方法是什么?
答案 0 :(得分:7)
你可以使用这样一个简单的方法:
结果:
示例:强>
var canvas = document.getElementById('canvas'), // get canvas element
ctx = canvas.getContext('2d'), // get context
x, y = 0, // initialize
dia = canvas.width,
radius = dia * 0.5;
ctx.translate(0.5, 0.5); // to make pixels sharper
for(; y < dia; y++) { // walk x/y grid
for(x = 0; x < dia; x++) {
ctx.fillStyle = getRndColor(); // set random color
ctx.fillRect(x, y, 1, 1); // draw a pixel
}
}
// create circle
// removes pixels outside next shape
ctx.globalCompositeOperation = 'destination-in';
ctx.arc(radius, radius, radius, 0, 2*Math.PI);
ctx.fill();
// reset
ctx.globalCompositeOperation = 'source-over';
function getRndColor() {
var r = 255*Math.random()|0,
g = 255*Math.random()|0,
b = 255*Math.random()|0;
return 'rgb(' + r + ',' + g + ',' + b + ')';
}
答案 1 :(得分:0)
我会为此使用canvas,因为你通过使用实际的DOM元素来增加大量的开销。
function drawRect(x,y) {
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
ctx.rect(x,y,1,1);
ctx.strokeStyle = getRandomColor();
ctx.stroke();
}
它仍然会很糟糕,但无论如何,除非你有一台服务器生成图像或其他东西,否则它很糟糕,所以客户端不会被束缚。
答案 2 :(得分:0)
当然,添加40000 div非常慢,应该始终避免。像这样的技巧以旧的方式用于在div上获得动态圆角,这使得页面变得非常慢。
所以是的,你应该使用画布。顺便说一下,你可以优化获得随机颜色的方式:
var r = Math.floor(Math.Random()* 256);
var g = Math.floor(Math.Random()* 256);
var b = Math.floor(Math.Random()* 256);
var cssColor = 'rgb(' + r +', ' + g + ',' + b +')';