如果你看一下:http://jsfiddle.net/KA4dz/
在此演示中,您可以清楚地看到内部元素由于其旋转而到达外部元素的外部。请求是缩小内部元素(同时保持纵横比和中心定位),使其适合其容器。
用例是用户可以手动旋转这样的内部元件,同时确保它保持在外部元件内。 (所以简单地缩小直到它适合眼睛不是解决方案)。
这是一个我的数学技能显然缺乏的场景。发布我试过的东西在这个阶段不会做得很好。有人能指出我正确的方向吗?
谢谢!
另外一个要求是内部元素只在需要时缩小,但在不需要时不会缩小(必要时意味着离开外部元素的边界)
保存点击次数:
.outer{
border: 1px solid black;
width: 100px;
height: 50px;
margin: 100px;
}
.inner{
background: blue;
width: 100px;
height: 50px;
transform: rotate(-40deg);
-webkit-transform: rotate(-40deg);
}
<div class="outer">
<div class="inner">
</div>
</div>
答案 0 :(得分:15)
这很有意思。这是我的解决方案:http://jsfiddle.net/fletiv/jrHTe/
javascript看起来像这样:
(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);
}());
编辑:这是一个试图解释我的代码逻辑的图像。 :)
答案 1 :(得分:0)
Matti回答的简化版
var scaler = function (id, degrees) {
var inner = document.getElementById(id);
offsetAngle = Math.atan(inner.offsetWidth / inner.offsetHeight);
originalHeight = inner.offsetHeight;
originalFactor = Math.sqrt(Math.pow(inner.offsetHeight, 2) + Math.pow(inner.offsetWidth, 2));
var radians = degrees * Math.PI / 180,
sum, result;
if (degrees < 90) {
sum = radians - offsetAngle;
} else if (degrees < 180) {
sum = radians + offsetAngle;
} else if (degrees < 270) {
sum = radians - offsetAngle;
} else {
sum = radians + offsetAngle;
}
var result = (originalHeight / Math.cos(sum)) / originalFactor;
inner.style.webkitTransform = 'scale(' + result+ ')';
inner.style.transform = 'scale(' + result+ ')';
}