Logo for the 404 page of my website.
Using svg.js library and Perlin noise generator.
Inspirations:
Colorful Tiles by mistic100
SVG error 404 by jorgeatgu
Glitchy 404 Page by kaypooma
Logo for the 404 page of my website.
Using svg.js library and Perlin noise generator.
Inspirations:
Colorful Tiles by mistic100
SVG error 404 by jorgeatgu
Glitchy 404 Page by kaypooma
<p> | |
Logo for the 404 page of <a href="http://www.strangeplanet.fr/">my website</a> | |
</p> | |
<div id="notfound"></div> | |
<p class="small"> | |
<b>Inspirations:</b><br> | |
<a href="http://codepen.io/mistic100/pen/GFHkm">Colorful Tiles</a> by mistic100<br> | |
<a href="http://codepen.io/jorgeatgu/pen/zmAnr">SVG error 404</a> by jorgeatgu<br> | |
<a href="http://codepen.io/kaypooma/pen/ehfjC">Glitchy 404 Page</a> by kaypooma<br> | |
</p> |
if (!SVG.supported) { | |
alert('SVG not supported !'); | |
} | |
else { | |
// parameters | |
var a = 40, | |
speed = 50, | |
points = [ | |
[ , ,1,1, , ,1,1, , ,1,1,1,1,1,1, , ,1,1, , ,1,1], | |
[ ,1,1, , ,1,1, , ,1,1, , ,1,1, , ,1,1, , ,1,1, ], | |
[1,1,1,1,1,1, , ,1,1, , ,1,1, , ,1,1,1,1,1,1, , ], | |
[ , , ,1,1, , ,1,1, , ,1,1, , , , , , ,1,1, , , ], | |
[ , ,1,1, , ,1,1,1,1,1,1, , , , , , ,1,1, , , , ] | |
], | |
colors = [ | |
'#ED1156', '#ED194E', '#ED2247', '#ED2B3F', '#EE3438', | |
'#EE3D31', '#EE4529', '#EF4E22', '#EF571A', '#EF6013', | |
'#F0690C', '#E8720E', '#E17B10', '#D98512', '#D28E14', | |
'#CB9816', '#C3A118', '#BCAA1A', '#B4B41C', '#ADBD1E', | |
'#A6C721', '#96C62F', '#87C53E', '#78C44D', '#69C35C', | |
'#5AC26B', '#4AC17A', '#3BC089', '#2CBF98', '#1DBEA7', | |
'#0EBDB6', '#0EBAB0', '#0EB8AA', '#0EB5A4', '#0EB39E', | |
'#0EB098', '#0EAE92', '#0EAB8C', '#0EA986', '#0EA680', | |
'#0EA47B', '#269376', '#3F8372', '#58736E', '#71626A', | |
'#895266', '#A24262', '#BB315E', '#D4215A' | |
], | |
shadowColors = ['#0055ff', '#ff0000'], | |
textColors = ['#012C33', '#12575E']; | |
// computed parameters | |
var a2 = a/2, | |
h = Math.round(a2*Math.sqrt(3) *100)/100, | |
grid = [points[0].length, points.length], | |
size = [(grid[0]/2+0.5)*a+a*2, grid[1]*h+a*3], | |
nb_colors = colors.length, | |
objects = [], | |
groups = []; | |
// init canvas | |
var container = document.getElementById('notfound'); | |
container.style.width = size[0]+'px'; | |
container.style.height = size[1]+'px'; | |
var simplex = new SimplexNoise(), | |
paper = SVG(container).size(size[0], size[1]).viewbox(0, 0, size[0], size[1]); | |
up = paper.defs().path('M'+ a2 +',0 l'+ a2 +','+ h +' l-'+ a +',0 l'+ a2 +',-'+ h), | |
down = paper.defs().path('M0,0 l'+ a +',0 l-'+ a2 +','+ h +' -'+ a2 +',-'+ h), | |
shadow = [paper.group(), paper.group()]; | |
// draw objects | |
for (var l=0; l<grid[1]; l++) { | |
objects[l] = []; | |
groups[l] = paper.group(); | |
for (var c=0; c<grid[0]; c++) { | |
if (!points[l][c]) { | |
continue; | |
} | |
var rnd = Math.round((simplex.noise(c/10, l/10)+1) / 2 * nb_colors), | |
cid = rnd - Math.floor(rnd/nb_colors)*nb_colors, | |
pos = [c*a2+a, l*h+a], | |
use; | |
if ((l%2==0 && c%2==0) || (l%2==1 && c%2==1)) { | |
use = up; | |
} | |
else { | |
use = down; | |
} | |
var el = paper.use(use) | |
.move(pos[0], pos[1]) | |
.style('fill:'+colors[cid]) | |
.data('i', rnd); | |
groups[l].add(el); | |
objects[l][c] = el; | |
shadow[0].use(use).move(pos[0], pos[1]); | |
shadow[1].use(use).move(pos[0], pos[1]); | |
} | |
} | |
// draw text | |
var text = paper.text('Page not found!') | |
.font({ | |
family: 'Ubuntu, Calibri', | |
size: a | |
}) | |
.opacity(0.7) | |
.cx(size[0]/2-a2) | |
.y(size[1]-a-a2); | |
shadow[0].add(text.clone()); | |
shadow[1].add(text.clone()); | |
text.fill( | |
paper.gradient('linear', function(stop) { | |
stop.at(0, textColors[0]); | |
stop.at(1, textColors[1]); | |
}).from(0,0).to(0,1) | |
); | |
// animate shadows | |
shadow[0].back() | |
.fill(shadowColors[0]) | |
.animate(speed*4).loop() | |
.during(function(i) { | |
if (i<0.1) | |
this.move(-a/4, 0); | |
else if (i>=0.8) | |
this.move(a/12, 0); | |
if (i<0.1) | |
this.opacity(0.1); | |
else if (i>=0.4 && i<0.5) | |
this.opacity(0.5); | |
else if (i>=0.7 && i<0.8) | |
this.opacity(0.3) | |
else if (i>=0.9) | |
this.opacity(0.6); | |
else | |
this.opacity(0); | |
}); | |
shadow[1].back() | |
.fill(shadowColors[1]) | |
.animate(speed*6).loop() | |
.during(function(i) { | |
if (i<0.1) | |
this.move(a/4, 0); | |
else if (i>=0.8) | |
this.move(-a/12, 0); | |
if (i<0.1) | |
this.opacity(0.1); | |
else if (i>=0.4 && i<0.5) | |
this.opacity(0.5); | |
else if (i>=0.7 && i<0.8) | |
this.opacity(0.3) | |
else if (i>=0.9) | |
this.opacity(0.6); | |
else | |
this.opacity(0); | |
}); | |
var counter = 0; | |
setInterval(function() { | |
// animate position | |
for (var l=0, i=groups.length; l<i; l++) { | |
if (Math.random()<0.5) { | |
groups[l].x(Math.round(Math.random()*a/5)); | |
} | |
} | |
// animate colors | |
for (var l=0, i=objects.length; l<i; l++) { | |
for (var c=0, j=objects[l].length; c<j; c++) { | |
if (!objects[l][c]) { | |
continue; | |
} | |
var cid = objects[l][c].data('i') + counter; | |
cid-= Math.floor(cid/nb_colors)*nb_colors; | |
objects[l][c].style('fill:'+colors[cid]); | |
} | |
} | |
counter++; | |
if (counter == nb_colors) { | |
counter = 0; | |
} | |
}, speed); | |
} |
<script src="http://cdnjs.cloudflare.com/ajax/libs/svg.js/1.0.0-rc.8/svg.min.js"></script> | |
<script src="http://strangeplanet.fr/files/misc/perlin-noise-simplex.js"></script> |
@font-face { | |
font-family:'Ubuntu'; | |
font-style:normal; | |
font-weight:700; | |
src:local('Ubuntu Bold'), local('Ubuntu-Bold'), url('http://themes.googleusercontent.com/static/fonts/ubuntu/v4/0ihfXUL2emPh0ROJezvraD8E0i7KZn-EPnyo3HZu7kw.woff') format('woff'); | |
} | |
html, body { | |
padding:0; margin:0; | |
height:100%; width:100%; | |
} | |
body { | |
font-family:"Calibri",sans-serif; | |
background:radial-gradient(#fff, #ccc); | |
background:radial-gradient(#ffffff, #fdfdfd 16%, #fbfbfb 33%, #f8f8f8 49%, #efefef 66%, #dfdfdf 82%, #bfbfbf 100%); | |
} | |
#notfound { | |
margin:0 auto; | |
} | |
#notfound svg { | |
-webkit-animation: noise 2s linear infinite; | |
animation: noise 2s linear infinite; | |
} | |
@-webkit-keyframes noise { | |
0%, 3%, 5%, 42%, 44%, 100% { -webkit-transform: scaleY(1); } | |
4.3% { -webkit-transform: scaleY(1.7); } | |
43% { -webkit-transform: scaleX(1.5); } | |
} | |
@keyframes noise { | |
0%, 3%, 5%, 42%, 44%, 100% { transform: scaleY(1); } | |
4.3% { transform: scaleY(1.7); } | |
43% { transform: scaleX(1.5); } | |
} | |
p { | |
text-align:center; | |
} | |
p.small { | |
font-size:0.8em; | |
opacity:0.5; | |
} |