That was interesting. Here is my solution: http://jsfiddle.net/fletiv/jrHTe/
And javascript looks like this:
(function () { var setRotator = (function () { var setRotation, setScale, offsetAngle, originalHeight, originalFactor; setRotation = function (degrees, scale, element) { element.style.webkitTransform = 'rotate(' + degrees + 'deg) scale(' + scale + ')'; element.style.transform = 'rotate(' + degrees + 'deg) scale(' + scale + ')'; }; getScale = function (degrees) { var radians = degrees * Math.PI / 180, sum; if (degrees < 90) { sum = radians - offsetAngle; } else if (degrees < 180) { sum = radians + offsetAngle; } else if (degrees < 270) { sum = radians - offsetAngle; } else { sum = radians + offsetAngle; } return (originalHeight / Math.cos(sum)) / originalFactor; }; return function (inner) { offsetAngle = Math.atan(inner.offsetWidth / inner.offsetHeight); originalHeight = inner.offsetHeight; originalFactor = Math.sqrt(Math.pow(inner.offsetHeight, 2) + Math.pow(inner.offsetWidth, 2)); return { rotate: function (degrees) { setRotation (degrees, getScale(degrees), inner); } } }; }()); var outer = document.getElementById('outer'), inner = document.getElementById('inner'), rotator = setRotator(inner), degrees = 0; window.setInterval(function () { degrees += 1; if (degrees >= 360) { degrees = 0; } rotator.rotate(degrees); }, 50); }());
Edit: Here is an image that is trying to explain the logic of my code. :)

source share