【问题标题】:CSS JQuery Rotate image inside containerCSS JQuery在容器内旋转图像
【发布时间】:2019-11-04 09:05:42
【问题描述】:

我正在尝试旋转容器内的图像。

容器的宽度必须有限制,高度也必须有限制。

我可以使用以下代码完成此操作,但其中一张图片存在问题。

当图像 2 侧向旋转或旋转 45 度时,它会跳出边界。

它适用于其他图像。

我做错了什么?

var   degrees = 0;

function x () {

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('testImg'),
    rotator = setRotator(testImg);

 degrees += 45;
 if (degrees >= 360) {
        degrees = 0;
    }
rotator.rotate(degrees);
}

$('#btn1').click(function(){
x()
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button onclick=document.getElementById('testImg').src='https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/smile.svg'>Img1</button>
<button onclick=document.getElementById('testImg').src='https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/juanmontoya_lingerie.svg'>Img2</button>
<button onclick=document.getElementById('testImg').src='https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/php.svg'>Img3</button>
<button type="button" id="btn1" >Rotate Div</button>

<DIV id="container" style=" width:60%;">

  <DIV id="outer" width="100%" style=" position: relative;border-style:dotted;">
    <img id ="testImg" src="https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/smile.svg"   style="width:100%;height:100%;border-style:dotted;border-color:red;">
  </DIV>
</DIV>

【问题讨论】:

  • 你有 CSS 吗?同样按 Img1/Img 2 没有结果,只有错误
  • 它不应该给出错误。试试小提琴版jsfiddle.net/0spv56uk/4
  • 谢谢。我修复了代码。看起来像'TIDY'代码按钮打破了它:/。尝试刷新
  • JSFiddle 代码?
  • 上面的固定代码

标签: javascript jquery html css transform


【解决方案1】:

您需要将图像绝对定位在 div 内并编辑比例,使其为正且永远不会大于 1。我在这里有一个工作版本:https://jsfiddle.net/e9h30w1z/

我已经添加了这个 CSS

img {
    max-width: 100%;
    max-height: 100%;
    height: auto;
    width: auto;
    position: absolute;
    object-fit: contain;
    left: 50%;
    transform: translate(-50%);
}

#outer {
  height: 0;
  padding-bottom: 100%;
}

我编辑了在 setRotation 方法中添加的 CSS 规则以包含 translate(-50%)(这是图像定位的一部分)

我把getScale方法的return语句改成如下:

scale = (originalHeight / Math.cos(sum)) / originalFactor;
return (Math.abs(scale) > 1) ? 1 : Math.abs(scale);

请注意,负比例会翻转图像,这就是我的一次尝试开始跳过位置的原因。

【讨论】:

  • 你能发布一个 jsfiddle 例子吗?我似乎无法让它工作
  • jsfiddle.net/70y2kexf 请注意,如果您有一个旋转的图像(45 度)然后交换图像,它仍然会溢出容器,但这是另一个我不确定您是否想解决的问题.您编写的 jQuery 会在旋转时调整图像大小,但添加一点来检查 img 变化应该不难。
  • 好吧,我不想添加太多代码,这只是一个刷新问题。交换图像时,它应该真正刷新,但举例来说,它不是必需的。 我看到的这个问题,是它使图像失去其原始比例,(通过使其成为方形)这是我试图避免的
  • 啊……你能检查一下,让我知道这是否更好吗? jsfiddle.net/t3jz9fhd/3
  • 终于有机会坐下来,希望这个能解决问题;它将图像旋转到大约 360 度的每 45 度间隔。 jsfiddle.net/e9h30w1z 告诉我,我会将此链接添加到总体答案中