vue 中利用js完成等比例缩放图片和点位跟着移动

需要等比例缩放的内容 html

<div class="boxImg" ref="cont" style="position: absolute; top: 0; left: 0">
  <!-- 这里放上需要等比例缩放的内容 -->    
</div>

在vue中 methods 中写

methods: {
  updateScaleRatio(ImgObj, maxWidth, maxHeight) {
     var image = new Image();
     //原图片原始地址(用于获取原图片的真实宽高,当<img>标签指定了宽、高时不受影响)
     image.src = ImgObj.src;
     // 用于设定图片的宽度和高度
     var tempWidth;
     var tempHeight;

     if (image.width > 0 && image.height > 0) {
       //原图片宽高比例 大于 指定的宽高比例,这就说明了原图片的宽度必然 > 高度
       if (image.width / image.height >= maxWidth / maxHeight) {
         if (image.width > maxWidth) {
           tempWidth = maxWidth;
           // 按原图片的比例进行缩放
           tempHeight = (image.height * maxWidth) / image.width;
         } else {
           // 按原图片的大小进行缩放
           tempWidth = image.width;
           tempHeight = image.height;
         }
       } else {
         // 原图片的高度必然 > 宽度
         if (image.height > maxHeight) {
           tempHeight = maxHeight;
           // 按原图片的比例进行缩放
           tempWidth = (image.width * maxHeight) / image.height;
         } else {
           // 按原图片的大小进行缩放
           tempWidth = image.width;
           tempHeight = image.height;
         }
       }
       // 设置页面图片的宽和高
        ImgObj.height = tempHeight;
       ImgObj.width = tempWidth;
       // 提示图片的原来大小
       ImgObj.alt = image.width + "×" + image.height;
     }
    <!-- 下面代码是等比例缩放的时候小圆点跟着移动,若不需要删除即可-->
     // 获取所有点位
     let point = this.$refs.one;
     // 循环判断点位的位置
     this.itme.forEach((itme, index) => {
       // x 除以 图片最大宽度
       let left = itme.x / 1708;
       // y 除以 图片最大的高度
       let top = itme.y / 961;
        // 小圆点的缩放比例 屏幕除以1920
       let w = maxWidth / 1920;
       // this.$refs.one.width = 18 * w;
       // 小圆点基准值乘以小圆点的缩放比
       point[index].width = 18 * w;
       // 获取每一个点位
       let pointPosition = point[index];
        // 让图片的宽度乘以比例
       pointPosition.style.left = ImgObj.width * left + "px";
       // 让图片的高度乘以比例
       pointPosition.style.top = ImgObj.height * top + "px";
     });
     <!-- 到这里结束 -->
   },
 },

在 mounted中设置一个事实监听调度函数

 mounted() {
    window.addEventListener("resize", () => {
      this.updateScaleRatio(
        this.$refs.conten,
        window.innerWidth,
        window.innerHeight
      );
    });
    this.updateScaleRatio(
      this.$refs.conten,
      window.innerWidth,
      window.innerHeight
    );
  },

 如果有很多一样的点位则可以循环渲染

在data中写入数据 需要多少就写多少

data() {
    return {
      // 需要循环渲染的点位位置数据
      itme: [
        {
          // left值
          x: 560,
          // top值 
          y: 600,
        },
        {
        // left值
        x: 560,
        // top值 
        y: 600,
         },
      ],
    };
  },

 在需要渲染的点位中加上 v-for进行循环渲染

<img
  class="Point-one"
  src="@/assets/images/monitor.state.w.png"
  ref="one"
  v-for="item in itme"
  :key="item.x"
/>

 

posted @ 2022-09-22 09:14  生活在北极的企鹅  阅读(1544)  评论(0编辑  收藏  举报