Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CSS在容器内旋转元素_Javascript_Css_Rotation_Transform - Fatal编程技术网

Javascript CSS在容器内旋转元素

Javascript CSS在容器内旋转元素,javascript,css,rotation,transform,Javascript,Css,Rotation,Transform,如果你看一下: 在这个演示中,您可以清楚地看到内部元素由于旋转而到达外部元素的外部。请求是缩小内部元素的比例(同时保持纵横比和中心位置),使其适合其容器 用例是用户可以手动旋转这样的内部元素,同时确保它保持在外部元素内。(因此,简单地缩小尺寸直到适合眼睛不是解决方案) 这是一个我的数学技能明显缺乏的场景。在现阶段,发布我尝试过的内容不会有多大好处。有人能给我指出正确的方向吗 谢谢 另一个要求是,内部元件仅在需要时缩小,而在不需要时从不缩小(如果需要,则意味着离开外部元件的边界) 要保存文件,请单

如果你看一下:

在这个演示中,您可以清楚地看到内部元素由于旋转而到达外部元素的外部。请求是缩小内部元素的比例(同时保持纵横比和中心位置),使其适合其容器

用例是用户可以手动旋转这样的内部元素,同时确保它保持在外部元素内。(因此,简单地缩小尺寸直到适合眼睛不是解决方案)

这是一个我的数学技能明显缺乏的场景。在现阶段,发布我尝试过的内容不会有多大好处。有人能给我指出正确的方向吗

谢谢

另一个要求是,内部元件仅在需要时缩小,而在不需要时从不缩小(如果需要,则意味着离开外部元件的边界)

要保存文件,请单击:

.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>        
.outer{
边框:1px纯黑;
宽度:100px;
高度:50px;
利润率:100像素;
}
.内部{
背景:蓝色;
宽度:100px;
高度:50px;
变换:旋转(-40度);
-webkit变换:旋转(-40度);
}

这很有趣。以下是我的解决方案:

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);

}());
(函数(){
变量setRotator=(函数(){
var setRotation,
设置刻度,
偏移角,
原始高度,
起源因子;
设置旋转=功能(度、刻度、元素){
element.style.WebKittTransform='旋转('+度+'度)比例('+比例+');
element.style.transform='rotate('+degrees+'deg)scale('+scale+');
};
getScale=函数(度){
var弧度=度*Math.PI/180,
总和
如果(度<90度){
总和=弧度-偏移角度;
}否则,如果(度<180度){
总和=弧度+偏移角;
}否则,如果(度<270){
总和=弧度-偏移角度;
}否则{
总和=弧度+偏移角;
}
返回值(原始高度/数学cos(总和))/originalFactor;
};
返回函数(内部){
offsetAngle=Math.atan(inner.offsetWidth/inner.offsetHeight);
原始高度=内。离视;
originalFactor=Math.sqrt(Math.pow(inner.offsetHeight,2)+Math.pow(inner.offsetWidth,2));
返回{
旋转:功能(度){
设置旋转(度,getScale(度),内部);
}
}
};
}());
var outer=document.getElementById('outer'),
内部=document.getElementById('inner'),
旋转器=设置旋转器(内部),
度=0;
window.setInterval(函数(){
度+=1;
如果(度>=360){
度=0;
}
旋转器。旋转(度);
}, 50);
}());
编辑:这是一幅试图解释我的代码逻辑的图片。:)


马蒂答案的简化版本

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+ ')';
}
var scaler=函数(id,度){
var internal=document.getElementById(id);
offsetAngle=Math.atan(inner.offsetWidth/inner.offsetHeight);
原始高度=内。离视;
originalFactor=Math.sqrt(Math.pow(inner.offsetHeight,2)+Math.pow(inner.offsetWidth,2));
var弧度=度*Math.PI/180,
总和、结果;
如果(度<90度){
总和=弧度-偏移角度;
}否则,如果(度<180度){
总和=弧度+偏移角;
}否则,如果(度<270){
总和=弧度-偏移角度;
}否则{
总和=弧度+偏移角;
}
var结果=(originalHeight/Math.cos(sum))/originalFactor;
internal.style.webkitttransform='scale('+result+');
internal.style.transform='scale('+result+');
}

好吧,如果你想先发制人地缩小尺寸,使它永远不会离开容器,那么你需要的是斜边与短边的比率。50/sqrt(100^2+50^2)当用户旋转物品时,内部块应该改变大小吗?类似这样的吗?所以,它是在旋转时缩放的,如果确定旋转会使它离开外框的边界?我在JS中已经提出了这个。我知道这还不是100%(老实说,更像是50%),但应该给你一个开始。现在不能再花时间了。你似乎已经把它钉好了,先生!我很乐意接受这个答案。你能解释一下你的解决方案吗?虽然它很容易从发布的代码中派生出来,但它将帮助我和未来的读者理解逻辑!当然添加了一个图像进行解释,因为我不擅长用文字进行解释。:)你的形象做得很好!