<html>
<head>
<link href="//code.jquery.com/ui/jquery-ui-git.css" rel="stylesheet" type="text/css" />
<script src="//code.jquery.com/jquery-git.js"></script>
<script src="//code.jquery.com/ui/jquery-ui-git.js"></script>
<script src="//remy.github.io/twitterlib/twitterlib.min.js"></script>
<link href="//vjs.zencdn.net/4.6/video-js.css" rel="stylesheet" type="text/css" />
<script src="//vjs.zencdn.net/4.6/video.js"></script>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta charset="utf-8">
<title>Transforming video</title>
<link rel="stylesheet" href="mainstyles.css" type="text/css">
<style type="text/css" media="screen">
* {margin:0;padding:0;}
html,body{font-size:14px;font-family:Helvetica,arial,sans-serif;}
header,video,footer,nav{display:block;}
body{padding:3em;}
nav{padding:.5em;background:#ccc;border-radius:5px;border-radius:5px;
border-radius:5px;}
h1{font-size:20px;margin:0 0 1em 0;color:#393;}
h2{font-size:18px;margin:1em 0;color:#363;}
nav li{display:inline;padding-right:2em;}
a{color:#369;font-weight:bold;}
nav a{ color:#333;}
nav strong{color:#030;}
footer{font-size:80%;margin:5em 0;text-align:center;}
footer a img{border:none;display:block;margin:.5em auto;}
#stage{background:#eee;width:400px;height:300px;overflow:hidden;
position:relative;margin:2em 0;}
#stage span{font-size:20px;color:#666;display:block;padding:2em;}
video{width:400px;height:300px;position:absolute;top:0;left:0;}
#controls{position:relative;width:400px;}
#change{position:absolute;right:-100px;top:-300px;width:100px;}
button{font-size:150%;text-align:center;display:block;}
#change button{width:60px;border:none;background:#fff;}
</style>
</head>
<body>
<div id="boundary">
<header><h1>Transforming HTML5 video with CSS3</h1></header>
<nav>
<ul>
<li><strong>Video Player with zoom and rotate</strong></li>
</ul>
</nav>
<div id="stage">
<video>
<source src="http://www.archive.org/download/AnimatedMechanicalArtPiecesAtMit/P1120973_512kb.mp4" type="video/mp4">
<source src="http://www.archive.org/download/AnimatedMechanicalArtPiecesAtMit/P1120973.ogv" type="video/ogg">
<p>Your browser doesn't support the HTML5 video tag it seems.
You can see this video as part of a collection
<a href="http://www.archive.org/download/AnimatedMechanicalArtPiecesAtMit/">
at archive.org</a>.
</p>
</video>
</div>
<div id="controls"></div>
<footer>Written by <a href="http://wait-till-i.com">Chris Heilmann</a>, powered by HTML5 and <a href="http://archive.org">Archive.org</a>
<span class="mark"><a href="http://www.w3.org/html/logo/">
<img src="html5-badge-h-css3-multimedia-semantics.png" width="197" height="64" alt="HTML5 Powered with CSS3 / Styling, Multimedia, and Semantics" title="HTML5 Powered with CSS3 / Styling, Multimedia, and Semantics"></a></span>
</footer>
</div>
</body>
</html>
video {
width: 100px;
transition: all 0.5s ease-in-out;
transition: all 0.5s ease-in-out;
transition: all 0.5s ease-in-out;
transition: all 0.5s ease-in-out;
}
video:hover,video:focus {
width:600px;
transform:rotate(45deg);
transform:rotate(45deg);
transform:rotate(45deg);
transform:rotate(45deg);
}
/*
Zooming and rotating HTML5 video player
Homepage: http://github.com/codepo8/rotatezoomHTML5video
Copyright (c) 2011 Christian Heilmann
Code licensed under the BSD License:
http://wait-till-i.com/license.txt
*/
(function(){
/* predefine zoom and rotate */
var zoom = 1,
rotate = 0;
/* Grab the necessary DOM elements */
var stage = document.getElementById('stage'),
v = document.getElementsByTagName('video')[0],
controls = document.getElementById('controls');
/* Array of possible browser specific settings for transformation */
var properties = ['transform', 'WebkitTransform', 'MozTransform',
'msTransform', 'OTransform'],
prop = properties[0];
/* Iterators and stuff */
var i,j,t;
/* Find out which CSS transform the browser supports */
for(i=0,j=properties.length;i<j;i++){
if(typeof stage.style[properties[i]] !== 'undefined'){
prop = properties[i];
break;
}
}
/* Position video */
v.style.left = 0;
v.style.top = 0;
/* If there is a controls element, add the player buttons */
/* TODO: why does Opera not display the rotation buttons? */
if(controls){
controls.innerHTML = '<button class="play">play</button>'+
'<div id="change">' +
'<button class="zoomin">+</button>' +
'<button class="zoomout">-</button>' +
'<button class="left">⇠</button>' +
'<button class="right">⇢</button>' +
'<button class="up">⇡</button>' +
'<button class="down">⇣</button>' +
'<button class="rotateleft">↻</button>' +
'<button class="rotateright">↺</button>' +
'<button class="reset">reset</button>' +
'</div>';
}
/* If a button was clicked (uses event delegation)...*/
controls.addEventListener('click',function(e){
t = e.target;
if(t.nodeName.toLowerCase()==='button'){
/* Check the class name of the button and act accordingly */
switch(t.className){
/* Toggle play functionality and button label */
case 'play':
if(v.paused){
v.play();
t.innerHTML = 'pause';
} else {
v.pause();
t.innerHTML = 'play';
}
break;
/* Increase zoom and set the transformation */
case 'zoomin':
zoom = zoom + 0.1;
v.style[prop]='scale('+zoom+') rotate('+rotate+'deg)';
break;
/* Decrease zoom and set the transformation */
case 'zoomout':
zoom = zoom - 0.1;
v.style[prop]='scale('+zoom+') rotate('+rotate+'deg)';
break;
/* Increase rotation and set the transformation */
case 'rotateleft':
rotate = rotate + 5;
v.style[prop]='rotate('+rotate+'deg) scale('+zoom+')';
break;
/* Decrease rotation and set the transformation */
case 'rotateright':
rotate = rotate - 5;
v.style[prop]='rotate('+rotate+'deg) scale('+zoom+')';
break;
/* Move video around by reading its left/top and altering it */
case 'left':
v.style.left = (parseInt(v.style.left,10) - 5) + 'px';
break;
case 'right':
v.style.left = (parseInt(v.style.left,10) + 5) + 'px';
break;
case 'up':
v.style.top = (parseInt(v.style.top,10) - 5) + 'px';
break;
case 'down':
v.style.top = (parseInt(v.style.top,10) + 5) + 'px';
break;
/* Reset all to default */
case 'reset':
zoom = 1;
rotate = 0;
v.style.top = 0 + 'px';
v.style.left = 0 + 'px';
v.style[prop]='rotate('+rotate+'deg) scale('+zoom+')';
break;
}
e.preventDefault();
}
},false);
})();
Output
This bin was created anonymously and its free preview time has expired (learn why). — Get a free unrestricted account
Dismiss xKeyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |