Example:
drawCircle(500, 500, 150, "red", 50, 1);
This will draw a red circle, 50% transparent, with 150 px radius at the point (500,500). The circle will be drawn using 1px-fine pen (granularity).
The wider is the "pen" the faster is the routine. I usually increase granularity to 4px while dragging/sizing for speed and then re-render with 1px granularity upon drag grip release.
Here is the self-sufficient(does not rely on any libs) procedural source code:
//classic one
function isIE()
{
return (navigator.appName.indexOf("Microsoft")!=-1);
}
function drawCircle(cx, cy, r, clr, op, gran)
{
var x = 0;
var div;
var dc = document.createElement("DIV");//aka "Device Context" wich is a DIV in doc tree
dc.style.position="absolute";
dc.innerHTML = " ";
dc.style.left = cx - r;
dc.style.top = cy - r;
cx = r; cy = r;
if (gran<1) gran = 1;
if ((r/gran)> 280) gran = Math.round(r / 280);
for(var y=0; y<=r; y+=gran)
{
x = Math.sqrt((r*r) - (y*y));
div = document.createElement("DIV");
div.style.position="absolute";
div.style.background = clr;
div.style.left = cx - x;
div.style.top = cy+y;
div.style.width= x*2;
div.style.height=gran;
div.style.fontSize=1;
div.innerHTML = " ";
setObjectOpacity(div, op);
dc.appendChild(div);
div = document.createElement("DIV");
div.style.position="absolute";
div.style.background = clr;
div.style.left = cx - x;
div.style.top = cy-y-gran;
div.style.width= x*2;
div.style.height=gran;
div.style.fontSize=1;
div.innerHTML = " ";
setObjectOpacity(div, op);
dc.appendChild(div);
}
return dc;
}//drawCircle
//semi-transparent through CSS/filter
function setObjectOpacity(obj, opacity)
{
//IE
if (isIE())
obj.style.filter = "alpha(opacity:"+opacity+")";
else
{
opacity = (opacity == 100)?99.999:opacity;//99.9 for Firefox flicker bug
// Konqueror, Safari
obj.style.KHTMLOpacity = opacity / 100;
// Old Mozilla and Firefox
obj.style.MozOpacity = opacity / 100;
// CSS3, Safari , new Firefox (Gecko)
obj.style.opacity = opacity / 100;
}//else
}//setObjectOpacity
As you can see, this approach uses DIVs as a vehicle for graphics delivery. Also, one may ask why I did not use squares to reduce
the number of DIVs - the answer is - flicker - squares would have overlapped and would have worked slower than interlaced DIVs.
Use as you please!
3 comments:
Cool, HTML5 will not come for some time yet
you forgot
document.body.appendChild(drawCircle(...))
This is obsolete, but great post though. One of my clients uses ie6 and plans to keep it till Xp supporting hardware is available bummmmmmr
Post a Comment