Skip to content

Instantly share code, notes, and snippets.

@adammw
Created December 27, 2011 08:16
Show Gist options
  • Save adammw/1523009 to your computer and use it in GitHub Desktop.
Save adammw/1523009 to your computer and use it in GitHub Desktop.
Nodester over-the-top 404...
<!doctype html>
<html class="no-js">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>404 - File not found</title>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">
<style>
html, body { width: 100%; height: 100%; margin: 0px; text-align: center; -webkit-user-select: none; }
html { background: #333; color: #fff; }
@-webkit-keyframes rocket {
from {
-webkit-transform: rotate(30deg);
height: 265px;
width: 268px;
left: 10%;
top: 0px;
margin-top: -265px;
}
to {
margin-top: -148px;
}
}
@-webkit-keyframes text {
from {
top: 50%;
opacity: 0;
}
50% {
opacity: 1;
}
to {
top: 90%;
opacity: 0;
}
}
#nebula, #nebulabg {
position: absolute;
width: 100%;
height: 100%;
z-index: -1;
top: 0;
left: 0;
}
.js.canvas #nebulabg {
display: none;
}
.js.cssanimations #rocket {
display: none;
}
.js.cssanimations .audio-ready #rocket,
.js.cssanimations .audio-timeout #rocket {
display: block;
-webkit-animation: rocket 2s 1 ease-out;
}
#rocket {
position: absolute;
height:295px;
width:298px;
background-image: url('http://nodester.com/images/rocket-down.png');
background-size: cover;
top: 40%;
margin-left: -149px;
margin-top: -148px;
left: 50%;
}
#rocket img {
display: none;
}
#audio {
display: none;
}
h1, .js.cssanimations p.description span {
font-family:sans-serif;
font-size:38px;
font-weight:bold;
padding:0 0 5px;
margin:0;
text-align: center;
top: 70%;
position: absolute;
text-shadow: 0 0 3px #000;
}
.js.cssanimations p.description {
display: block;
height: 0;
margin: 0;
padding: 0;
}
.js.cssanimations .audio-ready p.description span,
.js.cssanimations .audio-timeout p.description span {
-webkit-animation: text 5s infinite ease-in;
}
.js.cssanimations p.description span {
position: absolute;
opacity: 0;
display: block;
width: 100%;
}
.js.cssanimations p.description span:nth-child(2) {
-webkit-animation-delay: 1s;
}
.js.cssanimations p.description span:nth-child(3) {
-webkit-animation-delay: 2s;
}
.js.cssanimations h1 {
top: 40%;
margin-left: 128px;
margin-top: 132px;
left: 50%;
opacity: 0;
-webkit-transform: scale(0.5);
-webkit-transition: opacity 200ms, -webkit-transform 200ms linear;
-webkit-transition-delay: 1.8s;
}
.js.cssanimations .audio-ready h1, .js.cssanimations .audio-timeout h1 {
opacity: 1;
-webkit-transform: rotate(-20deg);
}
</style>
<script src="modernizr.js"></script>
<script>
Modernizr.load({
test: Modernizr.canvas,
yep: 'nebula.js'
});
Modernizr.load({
test: Modernizr.postmessage,
yep: 'http://www.youtube.com/player_api'
});
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("rocket").title = "Click to Mute";
document.getElementById("rocket").addEventListener("click", function() {
player.setVolume(0);
});
});
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('audio', {
videoId: '75V4ClJZME4',
events: {
'onReady': function(e) {
e.target.playVideo();
},
'onStateChange': function(e) {
if (e.data == YT.PlayerState.PLAYING) {
document.body.className += " audio-ready";
}
},
}
});
}
setTimeout(function() {
document.body.className += " audio-timeout";
}, 2000);
</script>
</head>
<body>
<div id="audio">
</div>
<img src="http://nodester.com/images/nebula.jpg" id="nebulabg" />
<div id="rocket"><img src="http://nodester.com/images/rocket-down.png" alt="Nodester" /></div>
<h1>404</h1>
<p class="description"><span>File</span> <span>Not</span> <span>Found</span></p>
</body>
</html>
/* Modernizr 2.0.6 (Custom Build) | MIT & BSD
* Build: http://www.modernizr.com/download/#-cssanimations-csstransitions-canvas-audio-video-localstorage-postmessage-sessionstorage-iepp-cssclasses-teststyles-testprop-testallprops-domprefixes-load
*/
;window.Modernizr=function(a,b,c){function B(a,b){var c=a.charAt(0).toUpperCase()+a.substr(1),d=(a+" "+n.join(c+" ")+c).split(" ");return A(d,b)}function A(a,b){for(var d in a)if(k[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function z(a,b){return!!~(""+a).indexOf(b)}function y(a,b){return typeof a===b}function x(a,b){return w(prefixes.join(a+";")+(b||""))}function w(a){k.cssText=a}var d="2.0.6",e={},f=!0,g=b.documentElement,h=b.head||b.getElementsByTagName("head")[0],i="modernizr",j=b.createElement(i),k=j.style,l,m=Object.prototype.toString,n="Webkit Moz O ms Khtml".split(" "),o={},p={},q={},r=[],s=function(a,c,d,e){var f,h,j,k=b.createElement("div");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:i+(d+1),k.appendChild(j);f=["&shy;","<style>",a,"</style>"].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},t,u={}.hasOwnProperty,v;!y(u,c)&&!y(u.call,c)?v=function(a,b){return u.call(a,b)}:v=function(a,b){return b in a&&y(a.constructor.prototype[b],c)},o.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},o.postmessage=function(){return!!a.postMessage},o.cssanimations=function(){return B("animationName")},o.csstransitions=function(){return B("transitionProperty")},o.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType){c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"');var d='video/mp4; codecs="avc1.42E01E';c.h264=a.canPlayType(d+'"')||a.canPlayType(d+', mp4a.40.2"'),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"')}}catch(e){}return c},o.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"'),c.mp3=a.canPlayType("audio/mpeg;"),c.wav=a.canPlayType('audio/wav; codecs="1"'),c.m4a=a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")}catch(d){}return c},o.localstorage=function(){try{return!!localStorage.getItem}catch(a){return!1}},o.sessionstorage=function(){try{return!!sessionStorage.getItem}catch(a){return!1}};for(var C in o)v(o,C)&&(t=C.toLowerCase(),e[t]=o[C](),r.push((e[t]?"":"no-")+t));w(""),j=l=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="<elem></elem>";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b<g)a.createElement(f[b])}a.iepp=a.iepp||{};var d=a.iepp,e=d.html5elements||"abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",f=e.split("|"),g=f.length,h=new RegExp("(^|\\s)("+e+")","gi"),i=new RegExp("<(/*)("+e+")","gi"),j=/^\s*[\{\}]\s*$/,k=new RegExp("(^|[^\\n]*?\\s)("+e+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),l=b.createDocumentFragment(),m=b.documentElement,n=m.firstChild,o=b.createElement("body"),p=b.createElement("style"),q=/print|all/,r;d.getCSS=function(a,b){if(a+""===c)return"";var e=-1,f=a.length,g,h=[];while(++e<f){g=a[e];if(g.disabled)continue;b=g.media||b,q.test(b)&&h.push(d.getCSS(g.imports,b),g.cssText),b="all"}return h.join("")},d.parseCSS=function(a){var b=[],c;while((c=k.exec(a))!=null)b.push(((j.exec(c[1])?"\n":c[1])+c[2]+c[3]).replace(h,"$1.iepp_$2")+c[4]);return b.join("\n")},d.writeHTML=function(){var a=-1;r=r||b.body;while(++a<g){var c=b.getElementsByTagName(f[a]),d=c.length,e=-1;while(++e<d)c[e].className.indexOf("iepp_")<0&&(c[e].className+=" iepp_"+f[a])}l.appendChild(r),m.appendChild(o),o.className=r.className,o.id=r.id,o.innerHTML=r.innerHTML.replace(i,"<$1font")},d._beforePrint=function(){p.styleSheet.cssText=d.parseCSS(d.getCSS(b.styleSheets,"all")),d.writeHTML()},d.restoreHTML=function(){o.innerHTML="",m.removeChild(o),m.appendChild(r)},d._afterPrint=function(){d.restoreHTML(),p.styleSheet.cssText=""},s(b),s(l);d.disablePP||(n.insertBefore(p,n.firstChild),p.media="print",p.className="iepp-printshim",a.attachEvent("onbeforeprint",d._beforePrint),a.attachEvent("onafterprint",d._afterPrint))}(a,b),e._version=d,e._domPrefixes=n,e.testProp=function(a){return A([a])},e.testAllProps=B,e.testStyles=s,g.className=g.className.replace(/\bno-js\b/,"")+(f?" js "+r.join(" "):"");return e}(this,this.document),function(a,b,c){function k(a){return!a||a=="loaded"||a=="complete"}function j(){var a=1,b=-1;while(p.length- ++b)if(p[b].s&&!(a=p[b].r))break;a&&g()}function i(a){var c=b.createElement("script"),d;c.src=a.s,c.onreadystatechange=c.onload=function(){!d&&k(c.readyState)&&(d=1,j(),c.onload=c.onreadystatechange=null)},m(function(){d||(d=1,j())},H.errorTimeout),a.e?c.onload():n.parentNode.insertBefore(c,n)}function h(a){var c=b.createElement("link"),d;c.href=a.s,c.rel="stylesheet",c.type="text/css";if(!a.e&&(w||r)){var e=function(a){m(function(){if(!d)try{a.sheet.cssRules.length?(d=1,j()):e(a)}catch(b){b.code==1e3||b.message=="security"||b.message=="denied"?(d=1,m(function(){j()},0)):e(a)}},0)};e(c)}else c.onload=function(){d||(d=1,m(function(){j()},0))},a.e&&c.onload();m(function(){d||(d=1,j())},H.errorTimeout),!a.e&&n.parentNode.insertBefore(c,n)}function g(){var a=p.shift();q=1,a?a.t?m(function(){a.t=="c"?h(a):i(a)},0):(a(),j()):q=0}function f(a,c,d,e,f,h){function i(){!o&&k(l.readyState)&&(r.r=o=1,!q&&j(),l.onload=l.onreadystatechange=null,m(function(){u.removeChild(l)},0))}var l=b.createElement(a),o=0,r={t:d,s:c,e:h};l.src=l.data=c,!s&&(l.style.display="none"),l.width=l.height="0",a!="object"&&(l.type=d),l.onload=l.onreadystatechange=i,a=="img"?l.onerror=i:a=="script"&&(l.onerror=function(){r.e=r.r=1,g()}),p.splice(e,0,r),u.insertBefore(l,s?null:n),m(function(){o||(u.removeChild(l),r.r=r.e=o=1,j())},H.errorTimeout)}function e(a,b,c){var d=b=="c"?z:y;q=0,b=b||"j",C(a)?f(d,a,b,this.i++,l,c):(p.splice(this.i++,0,a),p.length==1&&g());return this}function d(){var a=H;a.loader={load:e,i:0};return a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=r&&!s,u=s?l:n.parentNode,v=a.opera&&o.call(a.opera)=="[object Opera]",w="webkitAppearance"in l.style,x=w&&"async"in b.createElement("script"),y=r?"object":v||x?"img":"script",z=w?"img":y,A=Array.isArray||function(a){return o.call(a)=="[object Array]"},B=function(a){return Object(a)===a},C=function(a){return typeof a=="string"},D=function(a){return o.call(a)=="[object Function]"},E=[],F={},G,H;H=function(a){function f(a){var b=a.split("!"),c=E.length,d=b.pop(),e=b.length,f={url:d,origUrl:d,prefixes:b},g,h;for(h=0;h<e;h++)g=F[b[h]],g&&(f=g(f));for(h=0;h<c;h++)f=E[h](f);return f}function e(a,b,e,g,h){var i=f(a),j=i.autoCallback;if(!i.bypass){b&&(b=D(b)?b:b[a]||b[g]||b[a.split("/").pop().split("?")[0]]);if(i.instead)return i.instead(a,b,e,g,h);e.load(i.url,i.forceCSS||!i.forceJS&&/css$/.test(i.url)?"c":c,i.noexec),(D(b)||D(j))&&e.load(function(){d(),b&&b(i.origUrl,h,g),j&&j(i.origUrl,h,g)})}}function b(a,b){function c(a){if(C(a))e(a,h,b,0,d);else if(B(a))for(i in a)a.hasOwnProperty(i)&&e(a[i],h,b,i,d)}var d=!!a.test,f=d?a.yep:a.nope,g=a.load||a.both,h=a.callback,i;c(f),c(g),a.complete&&b.load(a.complete)}var g,h,i=this.yepnope.loader;if(C(a))e(a,0,i,0);else if(A(a))for(g=0;g<a.length;g++)h=a[g],C(h)?e(h,0,i,0):A(h)?H(h):B(h)&&b(h,i);else B(a)&&b(a,i)},H.addPrefix=function(a,b){F[a]=b},H.addFilter=function(a){E.push(a)},H.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",G=function(){b.removeEventListener("DOMContentLoaded",G,0),b.readyState="complete"},0)),a.yepnope=d()}(this,this.document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
//////////////////////////////////////////////////////////////////////////////////
// A demonstration of a Canvas nebula effect
// (c) 2010 by R Cecco. <http://www.professorcloud.com>
// MIT License
//
// Please retain this copyright header in all versions of the software if
// using significant parts of it
//////////////////////////////////////////////////////////////////////////////////
// Modified by Adam Malcontenti-Wilson
(function() {
// Request Animation Frame shim
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
var requestAnimationFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function( callback ){
window.setTimeout(callback, 1000 / 60);
};
})();
// Create canvases
var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d'),
canvas2 = document.createElement('canvas'),
ctx2 = canvas2.getContext('2d'),
canvas3 = document.createElement('canvas'),
ctx3 = canvas3.getContext('2d');
var w = canvas.width = 285;
var h = canvas.height = 285;
canvas2.id = "nebula";
canvas2.width = canvas2.height = 570;
canvas3.width = canvas3.height = 570;
// A puff.
var Puff = function(p) {
var opacity,
sy = (Math.random()*285)>>0,
sx = (Math.random()*285)>>0;
this.p = p;
this.move = function(timeFac) {
p = this.p + 0.3 * timeFac;
opacity = (Math.sin(p*0.05)*0.5);
if(opacity <0) {
p = opacity = 0;
sy = (Math.random()*285)>>0;
sx = (Math.random()*285)>>0;
}
this.p = p;
ctx.globalAlpha = opacity;
ctx.drawImage(canvas3, sy+p, sy+p, 285-(p*2),285-(p*2), 0,0, w, h);
};
};
var puffs = [];
var sortPuff = function(p1,p2) { return p1.p-p2.p; };
puffs.push( new Puff(0) );
puffs.push( new Puff(20) );
puffs.push( new Puff(40) );
var newTime, oldTime = 0, timeFac;
var animate = function()
{
newTime = new Date().getTime();
if(oldTime === 0 ) {
oldTime=newTime;
}
timeFac = (newTime-oldTime) * 0.1;
if(timeFac>3) {timeFac=3;}
oldTime = newTime;
puffs.sort(sortPuff);
for(var i=0;i<puffs.length;i++)
{
puffs[i].move(timeFac);
}
ctx2.drawImage( canvas ,0,0,570,570);
requestAnimationFrame( animate );
};
// Load nebula image into canvas3
var img = new Image();
img.onload = function() {
ctx3.drawImage(img, 0,0, 570, 570);
animate();
document.body.className += " nebula-ready";
};
img.src = 'http://nodester.com/images/nebula.jpg';
document.body.appendChild(canvas2);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment