Bild um 90° drehen:
<!DOCTYPE html> <html> <head> <title>Canvas-Rotation</title> <meta charset="UTF-8" /> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="box" width="158" height="158"></canvas> <script> var canvas = document.getElementById('box'); var context = ctx = canvas.getContext('2d'); var rotation = function(image){ context.clearRect(0, 0, 300, 300); context.translate(canvas.width/2, canvas.height/2); context.rotate(90*Math.PI/180); context.translate(-(image.width/2), -(image.height/2)); context.drawImage(image, 0, 0); }; var cardImage = new Image(); cardImage.src = 'images/card.png'; cardImage.width = 114; cardImage.height = 158; cardImage.onload = function() { window.setTimeout(function() { rotation(cardImage); }, 100); }; </script> </body> </html> |
Mit window.setInterval wird das Canvas gleich flippiger. 😉
Drehung eines Bildes um sich selbst:
<!DOCTYPE html> <html> <head> <title>Canvas-Rotation</title> <meta charset="UTF-8" /> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="box" width="114" height="158"></canvas> <script> var canvas = document.getElementById('box'); var context = ctx = canvas.getContext('2d'); var rotation = function(image){ context.clearRect(0, 0, 300, 300); context.translate(image.width/2, image.height/2); context.rotate(1*Math.PI/180); context.translate(-(image.width/2), -(image.height/2)); context.drawImage(image, 0, 0); }; var cardImage = new Image(); cardImage.src = 'images/card.png'; cardImage.width = 114; cardImage.height = 158; cardImage.onload = function() { window.setInterval(function() { rotation(cardImage); }, 100); }; </script> </body> </html> |
Animation mit 60fps. SetInterval von 1000/60 = ~16,67ms und entspricht 60fps (https://hacks.mozilla.org/2011/08/animating-with-javascript-from-setinterval-to-requestanimationframe/). Alle ~16,67ms wird 1 Grad gedreht, d.h. 360 Grad durch 60fps = 6 Sekunden für eine volle Drehung. Dieses Beispiel zieht im IE10 jedoch Schleifen:
<!DOCTYPE html> <html> <head> <title>Canvas-Rotation</title> <meta charset="UTF-8" /> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="box" width="114" height="158"></canvas> <script> var canvas = document.getElementById('box'); var context = ctx = canvas.getContext('2d'); var rotation = function(image){ context.clearRect(0, 0, 300, 300); context.translate(image.width/2, image.height/2); context.rotate(1*Math.PI/180); context.translate(-(image.width/2), -(image.height/2)); context.drawImage(image, 0, 0); }; var cardImage = new Image(); cardImage.src = 'images/card.png'; cardImage.width = 114; cardImage.height = 158; cardImage.onload = function() { window.setInterval(function() { rotation(cardImage); }, 1000/60); }; </script> </body> </html> |
Request Animation Frame benutzen:
<!DOCTYPE html> <html> <head> <title>Canvas-Rotation</title> <meta charset="UTF-8" /> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="box" width="114" height="158"></canvas> <script> var canvas = document.getElementById('box'); var context = ctx = canvas.getContext('2d'); var rotation = function(){ context.clearRect(0, 0, 300, 300); context.translate(image.width/2, image.height/2); context.rotate(1*Math.PI/180); context.translate(-(image.width/2), -(image.height/2)); context.drawImage(image, 0, 0); window.mozRequestAnimationFrame(rotation); }; var image = new Image(); image.src = 'images/card.png'; image.width = 114; image.height = 158; image.onload = function() { window.mozRequestAnimationFrame(rotation); }; </script> </body> </html> |
Cross-Browser-Request Animation Frame
Thanks to Paul Irish:
<!DOCTYPE html> <html> <head> <title>Canvas-Rotation</title> <meta charset="UTF-8" /> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="box" width="114" height="158"></canvas> <script> window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60); }; })(); var canvas = document.getElementById('box'); var context = ctx = canvas.getContext('2d'); var rotation = function(){ context.clearRect(0, 0, 300, 300); context.translate(image.width/2, image.height/2); context.rotate(1*Math.PI/180); context.translate(-(image.width/2), -(image.height/2)); context.drawImage(image, 0, 0); window.requestAnimFrame(rotation); }; var image = new Image(); image.src = 'images/card.png'; image.width = 114; image.height = 158; image.onload = function() { window.requestAnimFrame(rotation); }; </script> </body> </html> |
JavaScript Hoisting ausnutzen:
<!DOCTYPE html> <html> <head> <title>Canvas-Rotation</title> <meta charset="UTF-8" /> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="box" width="114" height="158"></canvas> <script> var canvas = document.getElementById('box'); var context = ctx = canvas.getContext('2d'); var rotation = function(){ context.clearRect(0, 0, image.width, image.height); context.translate(image.width/2, image.height/2); context.rotate(1*Math.PI/180); context.translate(-(image.width/2), -(image.height/2)); context.drawImage(image, 0, 0); }; var image = new Image(); image.src = 'images/card.png'; image.width = 114; image.height = 158; image.onload = function() { window.setInterval(function() { rotation(); }, 1000/60); }; </script> </body> </html> |
Rotate something in the middle of a canvas:
ctx.save(); ctx.translate( canvasRotationCenterX, canvasRotationCenterY ); ctx.rotate( rotationAmountInRadians ); ctx.translate( -objectRotationCenterX, -objectRotationCenterY ); ctx.drawImage( myImageOrCanvas, 0, 0 ); ctx.restore(); |
Rotate something around itself in the middle of a canvas:
<!DOCTYPE html> <html> <head> <title>Canvas-Rotation</title> <meta charset="UTF-8" /> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="box" width="400" height="400"></canvas> <script> var canvas = document.getElementById('box'); var context = ctx = canvas.getContext('2d'); var angle = 0; var rotation = function(){ context.clearRect(0, 0, canvas.width, canvas.height); context.save(); context.translate(canvas.width/2, canvas.height/2); context.rotate(angle+=1*Math.PI/180); context.translate(-(image.width/2), -(image.height/2)); context.drawImage(image, 0, 0); context.restore(); }; var image = new Image(); image.src = 'images/card.png'; image.width = 114; image.height = 158; image.onload = function() { window.setInterval(function() { rotation(); }, 1000/60); }; </script> </body> </html> |
Optimierte Variante:
<!DOCTYPE html> <html> <head> <title>Canvas-Rotation</title> <meta charset="UTF-8" /> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="box" width="200" height="200"></canvas> <script> var canvas = document.getElementById('box'); var context = ctx = canvas.getContext('2d'); var angle = 0; var rotation = function(){ context.clearRect(0, 0, canvas.width, canvas.height); context.save(); context.translate(canvas.width/2, canvas.height/2); context.rotate(angle += Math.PI/180); context.translate(-(image.width/2), -(image.height/2)); context.drawImage(image, 0, 0); context.restore(); }; var image = new Image(); image.src = 'images/card.png'; image.width = 114; image.height = 158; image.onload = function() { window.setInterval(function() { rotation(); }, 1000/60); }; </script> </body> </html> |
Das gleiche Beispiel mit CSS3:
<!DOCTYPE html> <html> <head> <title>CSS3-Rotation</title> <meta charset="UTF-8" /> <style> #box { display: table-cell; vertical-align: middle; text-align: center; width: 200px; height: 200px; border: 1px solid black; } #card { display: inline-block; width: 114px; height: 158px; background-image: url('images/card.png'); animation: rotate 6s linear infinite; } @keyframes rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } </style> </head> <body> <div id="box"> <div id="card"></div> </div> </body> </html> |
Cross-Browser-CSS3
<!DOCTYPE html> <html> <head> <title>CSS3-Rotation</title> <meta charset="UTF-8" /> <style> #box { display: table-cell; vertical-align: middle; text-align: center; width: 200px; height: 200px; border: 1px solid black; } #card { display: inline-block; width: 114px; height: 158px; background-image: url('images/card.png'); animation: rotate 6s linear infinite; -webkit-animation: rotate 6s linear infinite; } @keyframes rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @-webkit-keyframes rotate { from { -webkit-transform: rotate(0deg); } to { -webkit-transform: rotate(360deg); } } </style> </head> <body> <div id="box"> <div id="card"></div> </div> </body> </html> |
Dasselbe mit SVG (animateTransform wird vom IE nicht unterstützt -> http://msdn.microsoft.com/en-us/library/gg193979%28VS.85%29.aspx):
<!DOCTYPE html> <html> <head> <title>SVG-Translation</title> <meta charset="UTF-8" /> <style> #box { border: 1px solid black; } </style> </head> <body> <svg id="box" width="200" height="200"> <image width="114" height="158" x="43" y="21" xlink:href="images/card.png" > <animateTransform attributeName="transform" repeatCount="indefinite" type="rotate" begin="0" dur="6" from="0 100 100" to="360 100 100" /> </image> </svg> </body> </html> |
Etwas kompplizierter aber auch mit SVG:
<!DOCTYPE html> <html> <head> <title>SVG-Translation</title> <meta charset="UTF-8" /> <style> #box { border: 1px solid black; } </style> </head> <body> <svg id="box" width="200" height="200"> <svg width="114" height="158" x="43" y="21" overflow="visible"> <image width="100%" height="100%" xlink:href="images/card.png" > <animateTransform attributeName="transform" repeatCount="indefinite" type="rotate" begin="0" dur="6" from="0 57 79" to="360 57 79" /> </image> </svg> <!-- <image width="114" height="158" xlink:href="images/card.png" > <animateTransform attributeName="transform" repeatCount="indefinite" type="rotate" begin="0" dur="6" from="0 100 100" to="360 100 100" /> </image>--> </svg> </body> </html> |