Randomly generated SVG polygons with CSS opacity animations.
Should have called this "BattDrain MemHog 5000"
A Pen by Jake Albaugh on CodePen.
Randomly generated SVG polygons with CSS opacity animations.
Should have called this "BattDrain MemHog 5000"
A Pen by Jake Albaugh on CodePen.
var w = window.innerWidth, h = window.innerHeight, | |
radius_ratio = 1, | |
radius_x = w * radius_ratio, radius_y = h * radius_ratio, | |
fill = "rgba(0,0,0,0.03)", | |
min_polygon = 3, max_polygon = 6, | |
polygons = 200; | |
function randomXY(plot_area) { | |
var x = (Math.random() * (plot_area.max_x - plot_area.min_x)) + plot_area.min_x, | |
y = (Math.random() * (plot_area.max_y - plot_area.min_y)) + plot_area.min_y; | |
return x + "," + y + " "; | |
} | |
function randomPolygon() { | |
var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"), | |
svgNS = svg.namespaceURI; | |
// svg attributes | |
svg.setAttribute("id", "svg"); | |
svg.setAttribute("width", w); | |
svg.setAttribute("height", h); | |
// polygon loop | |
for(var p = 0; p < polygons; p ++) { | |
// create the polygon | |
var polygon = document.createElementNS(svgNS, "polygon"), | |
// random center for the polygon | |
center_x = Math.random() * w, | |
center_y = Math.random() * h, | |
plot_area = { | |
min_x: (center_x - radius_x < 0) ? 0 : center_x - radius_x, | |
max_x: (center_x + radius_x > w) ? w : center_x + radius_x, | |
min_y: (center_y - radius_y < 0) ? 0 : center_y - radius_y, | |
max_y: (center_y + radius_y > h) ? h : center_y + radius_y | |
}, | |
// polygon points must be between min and max points | |
point_count = Math.round(Math.random() * (max_polygon - min_polygon)) + min_polygon, | |
points = ""; | |
// generate points | |
for(var i = 0; i < point_count; i++) { points += randomXY(plot_area); } | |
// apply points | |
polygon.setAttribute("points", points); | |
// style polygon fill and stroke | |
polygon.setAttribute("fill", fill); | |
polygon.setAttribute("stroke", "none"); | |
// append polygon to svg | |
svg.appendChild(polygon); | |
} | |
// append svg to body | |
document.body.appendChild(svg); | |
} | |
randomPolygon(); |
$polygon-count: 200; | |
body { background: #CCC; } | |
#svg { | |
position: absolute; | |
left: 50%; top: 50%; | |
transform: translate3d(-50%,-50%, 0); | |
} | |
#svg polygon { | |
opacity: 0; | |
animation: polygon 2s linear infinite; | |
@for $i from 1 through $polygon-count { | |
&:nth-child(#{$i}) { animation-delay: 10ms * $i; } | |
} | |
} | |
@keyframes polygon { | |
0%, 100% { opacity: 0; } | |
50% { opacity: 1; } | |
} |