关于 CSS 中的 transform: rotate,我的需求如此简单,却找不到优雅的解法

2019-01-20 20:05:11 +08:00
 autoxbc

CSS 中的 transform 属性允许你旋转,缩放,倾斜或平移给定元素

我要写个脚本给图片添加旋转功能,用来快速处理那些方向错误的贴图

示例代码

<!DOCTYPE html>
  <head>
    <script>
      window.onload = () => {
        [].slice.call(document.images).forEach( img => {
          let degree = 0 ;
          img.onclick = () => {
            degree = ( degree + 90 ) % 360 ;
            img.style = `transform: rotate(${ degree }deg);`;
          };
        } );
      };
    </script>
  </head>
  <body>
    <div>
      <img src="https://www.v2ex.com/static/img/v2ex@2x.png" />
    </div>
    <div>
      <img src="https://www.v2ex.com/static/img/v2ex@2x.png" />
    </div>
    <div>
      <img src="http://gzimg.focus.cn/upload/photos/20718/OoQdAPDw.jpg" />
    </div>
    <div>
      <img src="http://gzimg.focus.cn/upload/photos/20718/OoQdAPDw.jpg" />
    </div>
  </body>
</html>

图片点击旋转后的效果图

简单的说就是,希望旋转的图片,能够像真的在数据层面旋转过一样,正确占据容器中的空间

实际情况是,CSS 旋转的图片被绘制在一个单独的层中,排版上独立于 DOM

没有没什么简单优雅的做法可以实现这个需求?

2933 次点击
所在节点    前端开发
4 条回复
hackyuan
2019-01-20 20:51:40 +08:00
只能说并不简单...
1. 决定旋转方向的是 `transform-origin` 这个属性, 而你这四个图形的设定的值都不一样
2. transform 会改变层叠顺序, 也就不会像你想的那样
iNaru
2019-01-20 21:09:21 +08:00
transform 不会触发 reflow,改变的只是视觉上的渲染。
img 外层加一个父节点,根据图片旋转角度动态计算设置父节点的高度和宽度。
transform-origin 可以改变其中心原点。
1OF7G
2019-01-23 20:13:24 +08:00
transform 肯定是不行的,不会改变元素所占空间。

也许你可以用 js 处理一下图片( canvas 或图像二进制数据),生成一张旋转后的图片,用生成的新 blob url, 替换当前图片地址。
autoxbc
2019-01-24 00:05:30 +08:00
@1OF7G #3 我确实试了一下,在 32 位系统上,用 gridjs 载入一张 4000*3000 的图片,还没开始旋转就爆内存了,可能还是手工计算父节点宽高省力一点

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/528872

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX