<!doctype html>
<html>
<head>
<link rel="stylesheet" href="lib/style.css">
</head>
<body>
<div id="bg"></div>
</body>
<script src="lib/script.js"></script>
</html>
html {
background: radial-gradient(ellipse at center, #0869ad 0%, black 100%);
overflow: hidden;
}
var refreshDuration = 10000;
var refreshTimeout;
var numPointsX;
var numPointsY;
var unitWidth;
var unitHeight;
var points;
function onLoad() {
var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttribute('width', window.innerWidth);
svg.setAttribute('height', window.innerHeight);
document.querySelector('#bg').appendChild(svg);
var unitSize = (window.innerWidth + window.innerHeight) / 20;
numPointsX = Math.ceil(window.innerWidth / unitSize) + 1;
numPointsY = Math.ceil(window.innerHeight / unitSize) + 1;
unitWidth = Math.ceil(window.innerWidth / (numPointsX - 1));
unitHeight = Math.ceil(window.innerHeight / (numPointsY - 1));
points = [];
for (var y = 0; y < numPointsY; y++) {
for (var x = 0; x < numPointsX; x++) {
points.push({
x: unitWidth * x,
y: unitHeight * y,
originX: unitWidth * x,
originY: unitHeight * y,
});
}
}
randomize();
for (var i = 0; i < points.length; i++) {
if (
points[i].originX != unitWidth * (numPointsX - 1) &&
points[i].originY != unitHeight * (numPointsY - 1)
) {
var topLeftX = points[i].x;
var topLeftY = points[i].y;
var topRightX = points[i + 1].x;
var topRightY = points[i + 1].y;
var bottomLeftX = points[i + numPointsX].x;
var bottomLeftY = points[i + numPointsX].y;
var bottomRightX = points[i + numPointsX + 1].x;
var bottomRightY = points[i + numPointsX + 1].y;
var rando = Math.floor(Math.random() * 2);
for (var n = 0; n < 2; n++) {
var polygon = document.createElementNS(svg.namespaceURI, 'polygon');
if (rando == 0) {
if (n == 0) {
polygon.point1 = i;
polygon.point2 = i + numPointsX;
polygon.point3 = i + numPointsX + 1;
polygon.setAttribute(
'points',
topLeftX +
',' +
topLeftY +
' ' +
bottomLeftX +
',' +
bottomLeftY +
' ' +
bottomRightX +
',' +
bottomRightY
);
} else if (n == 1) {
polygon.point1 = i;
polygon.point2 = i + 1;
polygon.point3 = i + numPointsX + 1;
polygon.setAttribute(
'points',
topLeftX +
',' +
topLeftY +
' ' +
topRightX +
',' +
topRightY +
' ' +
bottomRightX +
',' +
bottomRightY
);
}
} else if (rando == 1) {
if (n == 0) {
polygon.point1 = i;
polygon.point2 = i + numPointsX;
polygon.point3 = i + 1;
polygon.setAttribute(
'points',
topLeftX +
',' +
topLeftY +
' ' +
bottomLeftX +
',' +
bottomLeftY +
' ' +
topRightX +
',' +
topRightY
);
} else if (n == 1) {
polygon.point1 = i + numPointsX;
polygon.point2 = i + 1;
polygon.point3 = i + numPointsX + 1;
polygon.setAttribute(
'points',
bottomLeftX +
',' +
bottomLeftY +
' ' +
topRightX +
',' +
topRightY +
' ' +
bottomRightX +
',' +
bottomRightY
);
}
}
polygon.setAttribute('fill', 'rgba(0,0,0,' + Math.random() / 3 + ')');
var animate = document.createElementNS(
'http://www.w3.org/2000/svg',
'animate'
);
animate.setAttribute('fill', 'freeze');
animate.setAttribute('attributeName', 'points');
animate.setAttribute('dur', refreshDuration + 'ms');
animate.setAttribute('calcMode', 'linear');
polygon.appendChild(animate);
svg.appendChild(polygon);
}
}
}
refresh();
}
function randomize() {
for (var i = 0; i < points.length; i++) {
if (
points[i].originX != 0 &&
points[i].originX != unitWidth * (numPointsX - 1)
) {
points[i].x =
points[i].originX + Math.random() * unitWidth - unitWidth / 2;
}
if (
points[i].originY != 0 &&
points[i].originY != unitHeight * (numPointsY - 1)
) {
points[i].y =
points[i].originY + Math.random() * unitHeight - unitHeight / 2;
}
}
}
function refresh() {
randomize();
for (
var i = 0;
i < document.querySelector('#bg svg').childNodes.length;
i++
) {
var polygon = document.querySelector('#bg svg').childNodes[i];
var animate = polygon.childNodes[0];
if (animate.getAttribute('to')) {
animate.setAttribute('from', animate.getAttribute('to'));
}
animate.setAttribute(
'to',
points[polygon.point1].x +
',' +
points[polygon.point1].y +
' ' +
points[polygon.point2].x +
',' +
points[polygon.point2].y +
' ' +
points[polygon.point3].x +
',' +
points[polygon.point3].y
);
animate.beginElement();
}
refreshTimeout = setTimeout(function () {
refresh();
}, refreshDuration);
}
function onResize() {
document.querySelector('#bg svg').remove();
clearTimeout(refreshTimeout);
onLoad();
}
window.onload = onLoad;
window.onresize = onResize;