外层元素旋转,其包括在内的子元素一并旋转(不改变旋转中心),单元测试

思路:外层旋转后坐标,元素旋转后坐标,计算偏移坐标

复制代码
<template>
  <div class="outbox">
    <label>角度: <input v-model.number="rotate" type="number" /></label><br>
    <div class="resizebox" :style="{
      width: `${resize.w}px`, 
      height: `${resize.h}px`, 
      transform: `translate(${resize.x}px, ${resize.y}px) rotate(${rotate}deg)`}"
    >
    </div>
    <div :class="['itxm', `itxm-${idx}`]" v-for="(item, idx) in points" :key="idx" :style="{
      width: `${item.w}px`, 
      height: `${item.h}px`, 
      transform: `translate(${item.x}px, ${item.y}px) rotate(${rotate}deg)`}">
      {{idx+1}}
    </div>
  </div>
</template>
<script>

export default {
  name: 'HelloWorld',
  data() {
    return {
      rotate: 15,
      resize: {
        x: 200,
        y: 200,
        w: 500,
        h: 300,
        r: 60
      },
      points: [
        {
          x: 200,
          y: 200,
          w: 50,
          h: 30,
          r: 0
        },
        {
          x: 650,
          y: 200,
          w: 50,
          h: 30,
          r: 0
        },
        {
          x: 300,
          y: 300,
          w: 50,
          h: 30,
          r: 0
        },
        {
          x: 200,
          y: 470,
          w: 50,
          h: 30,
          r: 0
        },
        {
          x: 650,
          y: 470,
          w: 50,
          h: 30,
          r: 0
        }
      ]
    };
  },
  watch: {
    rotate() {
      this.watchRotate();
    }
  },
  mounted() {
    this.watchRotate();
  },
  methods: {
    watchRotate() {
      const cx = this.resize.x+this.resize.w/2
      const cy = this.resize.y+this.resize.h/2

      this.points.forEach(v => {
        if (!v.oldx) v.oldx = v.x
        if (!v.oldy) v.oldy = v.y
        // resize旋转为矩形参考
        const rotateEnd = this.recaculateXY({x: v.oldx || v.x, y: v.oldy || v.y, cx, cy, rotate: this.rotate})
        const rotateThis = this.recaculateXY({x: v.x, y: v.y, cx: v.x+v.w/2, cy: v.y+v.h/2, rotate: this.rotate})
        // 外层旋转坐标偏移 - 自身旋转坐标偏移
        const rangex = rotateEnd.x - rotateThis.x
        const rangey = rotateEnd.y - rotateThis.y
        v.x += rangex
        v.y += rangey
      })

    },
    recaculateXY({x, y, cx, cy, rotate}) {
      // 矩阵公式
      const rad = (rotate * Math.PI) / 180;
      const rotatedX = (x - cx) * Math.cos(rad) - (y - cy) * Math.sin(rad) + cx
      const rotatedY = (x - cx) * Math.sin(rad) + (y - cy) * Math.cos(rad) + cy
      return {x: rotatedX, y: rotatedY}
    },
  },
};
</script>

<style scoped>
.outbox {
  position: relative;
}
.resizebox {
  width: 500px;
  height: 300px;
  border: 1px dotted blue;
  position: absolute;
  left: 0;
  top: 0;
  &::after {
    content: '';
    width: 100%;
    height: 1px;
    background: red;
    display: block;
    position: absolute;
    top: 50%;
  }
  &::before {
    content: '';
    width: 1px;
    height: 100%;
    background: red;
    display: block;
    position: absolute;
    left: 50%;
  }
}
.itxm {
  background: green;
  position: absolute;
  left: 0;
  top: 0;
}
.itxm-1 {
  background: orange;
}
.itxm-2 {
  background: rebeccapurple;
}
</style>

--end

相关推荐
哎呦你好2 分钟前
【CSS】Grid 布局基础知识及实例展示
开发语言·前端·css·css3
路光.13 天前
加载动画
css·html·css3
年纪轻轻就扛不住14 天前
css3 文本效果(text-shadow、text-overflow、word-wrap、word-break)文本阴影、文本换行、文本溢出并隐藏显示省略号
前端·word·css3
陶甜也14 天前
threejs 实现720°全景图,;两种方式:环境贴图、CSS3DRenderer渲染
前端·vue.js·css3·threejs
sunshine64115 天前
【CSS】实现文本颜色渐变
css·html·css3
青鸾@15 天前
照片墙html
css·html·css3
JiaLin_Denny15 天前
css3 背景色渐变
css3·背景色·线性渐变·linear-gradient·背景色渐变
yt9483216 天前
jquery和CSS3圆形倒计时特效
前端·css3·jquery
teeeeeeemo16 天前
CSS3 动画基础与技巧
前端·css·笔记·css3
年纪轻轻就扛不住16 天前
CSS3 渐变效果
前端·css·css3