使用javascript旋转图像

IT技术 javascript jquery
2021-02-13 17:45:13

我需要以 90 度的间隔使用 javascript 旋转图像。我尝试了一些库,如jQuery rotateRaphaël,但它们有同样的问题 - 图像围绕其中心旋转。我在图像的四面都有一堆内容,如果图像不是完美的方形,它的一部分最终会出现在该内容之上。我希望图像保留在其父 div 内,该 div 设置了 max-with 和 max-height。

像这样使用 jQuery 旋转(http://jsfiddle.net/s6zSn/1073/):

var angle = 0;
$('#button').on('click', function() {
    angle += 90;
    $("#image").rotate(angle);
});

结果如下:

jQuery 旋转的工作原理

这是我想要的结果:

我希望它如何工作

任何人都知道如何实现这一目标?

6个回答

您使用CSS 的transform组合(根据需要使用供应商前缀)和transform-origin,如下所示:(也在 jsFiddle 上)

var angle = 0,
  img = document.getElementById('container');
document.getElementById('button').onclick = function() {
  angle = (angle + 90) % 360;
  img.className = "rotate" + angle;
}
#container {
  width: 820px;
  height: 100px;
  overflow: hidden;
}
#container.rotate90,
#container.rotate270 {
  width: 100px;
  height: 820px
}
#image {
  transform-origin: top left;
  /* IE 10+, Firefox, etc. */
  -webkit-transform-origin: top left;
  /* Chrome */
  -ms-transform-origin: top left;
  /* IE 9 */
}
#container.rotate90 #image {
  transform: rotate(90deg) translateY(-100%);
  -webkit-transform: rotate(90deg) translateY(-100%);
  -ms-transform: rotate(90deg) translateY(-100%);
}
#container.rotate180 #image {
  transform: rotate(180deg) translate(-100%, -100%);
  -webkit-transform: rotate(180deg) translate(-100%, -100%);
  -ms-transform: rotate(180deg) translateX(-100%, -100%);
}
#container.rotate270 #image {
  transform: rotate(270deg) translateX(-100%);
  -webkit-transform: rotate(270deg) translateX(-100%);
  -ms-transform: rotate(270deg) translateX(-100%);
}
<button id="button">Click me!</button>
<div id="container">
  <img src="http://i.stack.imgur.com/zbLrE.png" id="image" />
</div>

请注意,如果您希望边框正常工作,您应该真正将其应用于图像容器。
2021-03-23 17:45:13
这几乎可以正常工作,但是请看一下:jsfiddle.net/bhN6e我希望图像下方的文字保持在图像下方,即使在旋转后也是如此。就像现在一样,图像最终位于文本之上。
2021-03-25 17:45:13
添加filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);对 IE8 和 IE7 的支持。rotation=190 度、2180 度、3270 度。
2021-03-26 17:45:13
不!这种转换使 OP 解决了同样的问题。应用了转换,但不是 OP 想要的方式
2021-03-29 17:45:13
@OmShankar 我认为它仍然给 OP 足够的支持。
2021-04-07 17:45:13
var angle = 0;
$('#button').on('click', function() {
    angle += 90;
    $('#image').css('transform','rotate(' + angle + 'deg)');
});

试试这个代码。

不再需要 jQuery 和大量 CSS(请注意,某些浏览器需要额外的 CSS

类似于@Abinthaha 发布的内容,但是纯 JS,不需要 jQuery。

let rotateAngle = 90;

function rotate(image) {
  image.setAttribute("style", "transform: rotate(" + rotateAngle + "deg)");
  rotateAngle = rotateAngle + 90;
}
#rotater {
  transition: all 0.3s ease;
  border: 0.0625em solid black;
  border-radius: 3.75em;
}
<img id="rotater" onclick="rotate(this)" src="https://upload.wikimedia.org/wikipedia/en/e/e0/Iron_Man_bleeding_edge.jpg"/>

我知道应该避免它,但钢铁侠形象+1。
2021-03-27 17:45:13
谢谢你;讨厌 jquery 被迫回答我的其他问题。
2021-03-27 17:45:13
最初接受的答案仍然适用于我的用例,因为我需要文本在图像下方正确流动,并适应图像的大小。jsfiddle.net/soqkrbut是原始答案的更新版本,完全符合我的要求。使用此代码不起作用,请参阅jsfiddle.net/uzhoy6pm
2021-04-05 17:45:13
我超前于我的时间(现在已经玩了 50 多个小时:)
2021-04-11 17:45:13

可以应用 CSS,您必须transform-origin正确设置才能以您想要的方式获得应用的转换

见小提琴:

http://jsfiddle.net/OMS_/gkrsz/

主要代码

/* assuming that the image's height is 70px */

img.rotated {
    transform: rotate(90deg);
    -webkit-transform: rotate(90deg);
    -moz-transform: rotate(90deg);
    -ms-transform: rotate(90deg);

    transform-origin: 35px 35px;
    -webkit-transform-origin: 35px 35px;
    -moz-transform-origin: 35px 35px;
    -ms-transform-origin: 35px 35px;
}

jQuery 和 JS

$(img)
    .css('transform-origin-x', imgWidth / 2)
    .css('transform-origin-y', imgHeight / 2);

// By calculating the height and width of the image in the load function

// $(img).css('transform-origin', (imgWidth / 2) + ' ' + (imgHeight / 2) );

逻辑

将图像的高度除以 2。transform-xtransform-y值应该是这个值

链接

CSS 中的transform-origin | MDN

@科linq。凉爽的。不管怎样,你在页面上有 jQuery 和 JS。可以即时计算和应用此 CSS。我正在编辑 JS 的答案。谢谢指出!
2021-03-19 17:45:13
问题是你不能有一个单一的原点来处理所有四个位置。这就是为什么我坚持一个原点并调整位置以正确放置它。
2021-03-20 17:45:13
好像有点绕。我更喜欢我的解决方案 :p 它完全独立于图像的大小。
2021-04-07 17:45:13
如果图像的大小发生变化,或者只是不固定怎么办?那会是一团糟。请注意,这是 180 度和 270 度旋转的混乱;)
2021-04-08 17:45:13
@Kolink,我将按照从 Mozilla DN 中读取的概念进行操作。在您的解决方案中(这当然很好),您正在进行额外的翻译。这是作弊 :) 此外,从概念上讲,翻译是通过使用transform-origin来实现的- 只是它们翻译了变换的原点,而不是元素本身
2021-04-12 17:45:13

希望这可以帮到你!

<input type="button" id="left"  value="left" />
<input type="button" id="right" value="right" />
<img src="https://www.google.com/images/srpr/logo3w.png" id="image">

<script>
 var angle = 0;
    $('#left').on('click', function () {  
        angle -= 90;
        $("#image").rotate(angle);
    });

    $('#right').on('click', function () {  
        angle += 90;
        $("#image").rotate(angle);
    });
</script>

试试看