var canvas = null; var context = null; var rotateAngle = null; var showGuideGrid = false; // set to false to hide the drawing assistance grid var animateTheLoader = true; // set to false to disable animation and see the static drawing $(document).ready(function () { canvas = document.getElementById("myCanvas"); context = canvas.getContext("2d"); rotateAngle = 0; if (animateTheLoader) { loadingAnimation(); } else { loadingDrawing(); } }); function renderGuideGrid(gridPixelSize, color) { context.save(); context.lineWidth = 0.5; context.strokeStyle = color; // horizontal grid lines for(var i = 0; i <= canvas.height; i = i + gridPixelSize) { context.beginPath(); context.moveTo(0, i); context.lineTo(canvas.width, i); context.closePath(); context.stroke(); } // vertical grid lines for(var j = 0; j <= canvas.width; j = j + gridPixelSize) { context.beginPath(); context.moveTo(j, 0); context.lineTo(j, canvas.height); context.closePath(); context.stroke(); } context.restore(); } function loadingDrawing() { context.save(); if (showGuideGrid) { renderGuideGrid(20, "red"); } context.translate(37.5, 37.5); context.rotate(rotateAngle * Math.PI/180); context.translate(-37.5, -37.5); context.save(); context.beginPath(); context.strokeStyle = "rgba(255,255,255,0.3)"; context.lineWidth = 4; context.lineCap = "round"; context.moveTo(37.5, 26.5); context.lineTo(37.5, 13.5); context.stroke(); context.moveTo(31.5, 31.5); context.lineTo(20, 20); context.stroke(); context.moveTo(29, 37.5); context.lineTo(12.5, 37.5); context.stroke(); context.moveTo(32.5, 43.5); context.lineTo(20, 55); context.stroke(); context.moveTo(37.5, 46); context.lineTo(37.5, 62.5); context.stroke(); context.closePath(); context.save(); context.restore(); } function loadingAnimation() { canvas.width = canvas.width; // redraw canvas for animation effect loadingDrawing(); rotateAngle += 5; if (rotateAngle > 360) { rotateAngle = 5; } setTimeout(loadingAnimation, 16); } //simple script to rotate all spinners 45 degrees on each tick //this works differently from the css transforms, which is smooth var count = 0; function rotate() { var elem3 = document.getElementById('loader'); elem3.style.MozTransform = 'scale(0.5) rotate('+count+'deg)'; elem3.style.WebkitTransform = 'scale(0.5) rotate('+count+'deg)'; if (count==360) { count = 0 } count+=45; window.setTimeout(rotate, 100); } if (animateTheLoader) { window.setTimeout(rotate, 100); }
<div id="sandbox"> <div id="canvas_test"> <h2>Canvas Loader</h2> <canvas id="myCanvas" width="75" height="75"> <p>Canvas not supported.</p> </canvas> </div> <div id="css3_test"> <h2>CSS3 Loader</h2> <div id="loader"> <div class="bar1"></div> <div class="bar2"></div> <div class="bar3"></div> <div class="bar4"></div> <div class="bar5"></div> </div> </div> </div>
/* main */ body { background-color: #000; padding-top: 20px; color: #fff; } #css3_test { padding-top: 20px; } h2 { font: 30px Georgia,Utopia,'Palatino Linotype',Palatino,serif; font-size: 16px; } #sandbox { text-align: center; } /* CSS3 styles */ /* position the bars and balls correctly (rotate them and translate them outward)*/ .bar1 { -moz-transform:rotate(0deg) translate(0, -40px); -webkit-transform:rotate(0deg) translate(0, -40px);opacity:1; } .bar2 { -moz-transform:rotate(315deg) translate(0, -40px); -webkit-transform:rotate(315deg) translate(0, -40px);opacity:.8; } .bar3 { -moz-transform:rotate(270deg) translate(0, -40px); -webkit-transform:rotate(270deg) translate(0, -40px);opacity:0.5; } .bar4 { -moz-transform:rotate(225deg) translate(0, -40px); -webkit-transform:rotate(225deg) translate(0, -40px);opacity:0.35; } .bar5 { -moz-transform:rotate(180deg) translate(0, -40px); -webkit-transform:rotate(180deg) translate(0, -40px);opacity:0.2; } /* set up the three bar spinners */ #loader { position:relative; width:100px; height:100px; -moz-border-radius:100px; -moz-transform:scale(0.5); -webkit-transform:scale(0.5); margin: auto; } #loader div { width:10px; height:30px; background:#FFFFFF; position:absolute; top:35px; left:45px; -moz-border-radius:20px; -webkit-border-radius:20px; border-radius:20px; }