vue 图片放大、缩小、旋转、滚轮操作图片放大缩小

news2024/12/25 14:00:43

在这里插入图片描述

组件

<template>
  <!--  -->
  <div class="imgCont"
       ref="imgCont"
       @mousewheel.prevent="rollImg($event)"
       >
    <div class="iconBtn">
      <span class="refreshBtn">
        <i class="el-icon-zoom-out"
           @click.stop="outImg('out')"></i>
        <i class="el-icon-zoom-in"
           @click.stop="outImg('in')"></i>

        <i class="el-image-viewer__actions__divider"></i>
          <i :class="mode.icon" @click="toggleMode"></i>
          <i class="el-image-viewer__actions__divider"></i>
        <i @click.stop="rotate('left')"
           class="el-icon-refresh-left"></i>
        <i @click.stop="rotate('right')"
           class="el-icon-refresh-right right"></i>
        <slot name="addIcon"></slot>
      </span>
    </div>
    <img class="bigImage"
         ref="imgDiv"
         @mousedown.stop.prevent="moveImg($event)"
         id="img"
         :src="url" />
  </div>
</template>

<script>
const Mode = {
  CONTAIN: {
    name: "contain",
    icon: "el-icon-full-screen"
  },
  ORIGINAL: {
    name: "original",
    icon: "el-icon-c-scale-to-original"
  }
};
export default {
  name: 'imgDeal',
  props: {
    url: {},
  },
  components: {},
  data () {
    return {
      mode: Mode.CONTAIN,
      // 图片参数
      params: {
        zoomVal: 1,
        left: 0,
        top: 0,
        currentX: 0,
        currentY: 0,
      },
      deg: 0,
    };
  },
  computed: {

  },
  watch: {

  },
  created () {
    this.restImg();
  },
  mounted () {

  },
  methods: {
    //1:1自适应
    toggleMode () {
      const modeNames = Object.keys(Mode);
      const modeValues = Object.values(Mode);
      const index = modeValues.indexOf(this.mode);
      const nextIndex = (index + 1) % modeNames.length;
      this.mode = Mode[modeNames[nextIndex]];
      if (this.mode.name == 'original') {
        this.originalFunc();
      } else {
        this.restImg();
      }
    },
    // mode==original 默认放大图片
    originalFunc () {
      this.params.zoomVal = 2;
      this.restFunc();
    },
    // 初始化数据,重置数据
    restImg () {
      this.params.zoomVal = 1;
      this.restFunc();
      this.mode = Mode['CONTAIN'];
    },
    restFunc () {
      this.params.left = 0;
      this.params.top = 0;
      this.params.currentX = 0;
      this.params.currentY = 0;
      this.deg = 0;
      if (this.$refs.imgDiv) {
        let img = this.$refs.imgDiv;
        img.style.transform = `translate(-50%, -50%) scale(${this.params.zoomVal}) rotate(${this.deg}deg)`;
        img.style.left = '50%';
        img.style.top = '50%';
      }
    },
    // 图片滚动放大
    rollImg (event) {
      this.params.zoomVal += event.wheelDelta / 1200;
      this.rollFunc()
    },
    outImg (flag) {
      if (flag == 'out') {
        this.params.zoomVal -= 0.2;
      } else {
        this.params.zoomVal += 0.2;
      }
      this.rollFunc()
    },
    rollFunc () {
      let e = this.$refs.imgDiv;
      if (this.params.zoomVal >= 0.2) {
        e.style.transform = `translate(-50%, -50%) scale(${this.params.zoomVal}) rotate(${this.deg}deg)`;
      } else {
        this.params.zoomVal = 0.2;
        e.style.transform = `translate(-50%, -50%) scale(${this.params.zoomVal}) rotate(${this.deg}deg)`;
        return false;
      }
    },
    
    // 图片旋转
    rotate (type) {
      let res = this.$refs.imgDiv;
      this.deg = type == 'right' ? this.deg + 90 : this.deg - 90
      res.style.transform = `translate(-50%, -50%) scale(${this.params.zoomVal}) rotate(${this.deg}deg)`
    },
    // 图片移动
    moveImg (e) {
      // 获得该时间触发的时间戳
      let mouseDate = new Date().getTime();
      this.$emit('getMouseDate',mouseDate)
      e.preventDefault()
      // 获取元素
      let imgWrap = this.$refs.imgCont
      let img = this.$refs.imgDiv
      let x = e.pageX - img.offsetLeft
      let y = e.pageY - img.offsetTop
      // 添加鼠标移动事件
      imgWrap.addEventListener('mousemove', move)
      function move (e) {
        img.style.left = e.pageX - x + 'px'
        img.style.top = e.pageY - y + 'px'
      }
      // 添加鼠标抬起事件,鼠标抬起,将事件移除
      img.addEventListener('mouseup', () => {
        imgWrap.removeEventListener('mousemove', move)
      })
      // 鼠标离开父级元素,把事件移除
      imgWrap.addEventListener('mouseout', () => {
        imgWrap.removeEventListener('mousemove', move)
      })
    },
  },
};
</script>

<style scoped lang="scss">
.imgCont {
  text-align: center;
  vertical-align: middle;
  position: relative;
  overflow: hidden;
  width: 100%;
  height: 100%;
  .iconBtn {
    position: absolute;
    left: 0;
    bottom: 0;
    height: 35px;
    line-height: 35px;
    background-color: rgba(0, 0, 0, 0.2);
    color: #fff;
    width: 100%;
    z-index: 100;
    font-size: 20px;
    .refreshBtn {
      i {
        cursor: pointer;
        margin: 0 10px;
      }
    }
  }
  .bigImage {
    max-width: 100%;
    max-height: 100%;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    cursor: move;
    margin: 0 auto;
  }
}
</style>

组件使用

import ImgDeal from "@/components/imgDeal.vue";
components: {
    ImgDeal 
  },
<ImgDeal ref="imgDeal" :url="imgUrl"></ImgDeal>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

16S全长测序揭示绿头虻肠道微生物及共生细菌

论文题目&#xff1a;Greenhead (Tabanus nigrovittatus) Wolbachia and Its Microbiome: A Preliminary Study 期刊&#xff1a;Microbiol Spectrum 研究背景 绿头虻&#xff08;Tabanus nigrovittatus&#xff09;的雌虫刺吸牲畜的血液&#xff0c;危害家畜&#xff0c;是美…

2022年NPDP新版教材知识集锦--【第五章节】(1)

《产品经理认证(NPDP)知识体系指南(第2版)》已于2022年4月正式上架发行&#xff0c;新版教材自2022年11月NPDP考试起使用。将新版NPDP教材中的相关知识点进行了整理汇总&#xff0c;包括详细设计与规格阶段相关内容&#xff0c;快来看看吧。 【市场调研】(全部内容获取文末) 市…

基于Python实现的五子棋游戏设计(alpha-beta剪枝技术)

目录 第1章 问题描述 3 第2章 问题分析 3 第3章 算法设计 4 3.1 算法概述 4 3.2 极大极小树 4 3.3 α-β剪枝算法 5 3.3总体设计 6 3.3.1 系统流程图 7 3.3.2 基本设计 7 3.4 预处理 8 第4章 算法实现 11 4.1 估价函数 11 4.2 alpha-beta剪枝算法 15 4.2.1 算法流程图 15 4.2.2…

issac gym安装与运行 (一)

目录 1.安装 1.1 下载 ​编辑 1.2 安装 .2 初步运行 2.1 demo1 .3 官方demo 3.1 下载及安装 3.2 demo启动 3.3 加载训练好的模型 其他 References&#xff1a; nIsaac-gym(1): 安装及官方demo内容_hongliyu_lvliyu的博客-CSDN博客_isaac安装 NVIDIA Isaac Gym安装…

安卓宿舍管理系统源码

开发环境及工具&#xff1a; 大等于jdk1.8&#xff0c;大于mysql5.5&#xff0c;idea&#xff08;eclipse&#xff09;&#xff0c;Android Studio 技术说明&#xff1a; springboot mybatis android 代码注释齐全&#xff0c;没有多余代码&#xff0c;适合学习&#xff08…

孤儿进程与终端的关系

孤儿进程与终端的关系 孤儿进程 在本篇文章当中主要给大家介绍一下有关孤儿进程和终端之间的关系。 首先我们的需要知道什么是孤儿进程&#xff0c;简单的来说就是当一个程序还在执行&#xff0c;但是他的父进程已经退出了&#xff0c;这种进程叫做孤儿进程&#xff0c;因为…

C#中Convert与强制转换之间的区别

Reference Source Convert与强转最大的区别是 增加了范围校验&#xff0c;如果不在范围内&#xff0c;直接抛出异常 Convert 类 (System) | Microsoft Learn 小数转化为整数 使用基本数据类型强制转化原理&#xff1a;小数转化为整数&#xff0c;舍弃小数点后的所有数字。 …

HTTP响应是什么?

文章目录HTTP响应1. 响应行2. 响应头3. 空行与响应体4. HTTP响应示例HTTP响应 当客户端发起一个请求后&#xff0c;一般都会得到一个服务器的响应&#xff0c;断网或者服务器宕机的情况下除外。服务器发送给客户端的 HTTP 响应用于向客户端提供其请求的资源&#xff0c;以及客…

开源项目-绩效管理系统

开源项目-绩效管理系统 哈喽&#xff0c;今天给大家带来一个开源系统-绩效管理系统 源码下载​​​​​​​ 系统介绍 本系统为绩效考核系统&#xff0c;系统分为三大模块&#xff1a;考核设置&#xff0c;绩效考核&#xff0c;系统管理。 可满足小企业对员工进行考核。本系…

自定义maven骨架的添加与删除——完整详细介绍

目录一、创建好自己所需的目录结构二、命令配置2.1 配置总览2.2 指令配置说明2.3 指令配置详情三、配置Idea中maven新模板3.1 找到信息文件3.2 创建实例模板四、删除自定义模板4.1 删除本地仓库中的文件4.2 删除archetype-catalog.xml文件中的配置4.3 删除idea中的配置一、创建…

傻白入门芯片设计,指令集架构、微架构、处理器内核(十一)

早期计算机出现时&#xff0c;软件的编写都是直接面向硬件系统的&#xff0c;即使是同一计算机公司的不同计算机产品&#xff0c;它们的软件都是不能通用的,这个时代的软件和硬件紧密的耦合在一起&#xff0c;不可分离。 IBM为了让自己的一系列计算机能使用相同的软件,免去重复…

毕业设计-深度学习机器视觉铝型材表面缺陷识别

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

excel表格怎么换行?单元格内换行的4个方法

今天分享一个excel单元格内换行的小技巧&#xff0c;希望对大家有用。我们在编辑excel文本时经常会遇到这样的情况&#xff1a;将文字内容用一种方式快速从中间插入。比如我们在制作表格时&#xff0c;要将区域内的数据全部合并到一张表格中&#xff08;即单元格区域&#xff0…

破茧化蝶,从Ring Bus到Mesh网络,CPU片内总线的进化之路

文章目录**为什么需要片内总线&#xff1f;****星型连接****环形总线&#xff08;Ring Bus&#xff09;****Mesh网络****结论**转载于&#xff1a;https://zhuanlan.zhihu.com/p/32216294 在大多数普通用户眼里&#xff0c;CPU也许就是一块顶着铁盖子的电路板而已。但是如果我…

【基于Tansformer的融合方法:感知损失:传递-感知损失】

HyperTransformer: A Textural and Spectral Feature Fusion Transformer for Pansharpening &#xff08;超级Transformer&#xff1a;一种用于全色锐化的纹理和光谱特征融合Transformer&#xff09; 先看这一篇简单了解Transformer &#xff08;是一篇高光谱图像融合&#x…

[附源码]计算机毕业设计JAVA疫情背景下叮当买菜管理系统

[附源码]计算机毕业设计JAVA疫情背景下叮当买菜管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

postgresql_internals-14 记录

梳理一下之前理解不太清楚的知识点&#xff0c;重点内容可能会再拆出来单独研究。 原书链接&#xff1a;Index of / 一、 数据组织 1. pg系统库 template0&#xff1a;用于从逻辑备份还原&#xff0c;或创建不同字符集的数据库&#xff0c;不可以修改template1&#xff1a;真…

i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

一、概述 Linux 内核编译流程如下&#xff1a; 1、配置 Linux 内核。 2、编译 Linux 内核。 说明&#xff1a;进入 Linux 内核源码&#xff0c;使用 make help 参看相关配置。 二、make menuconfig 工作原理 1、menuconfig 它本身是一个软件&#xff0c;只提供图形界面配…

Android App 秒开实践方案~

一、背景 启动速度可以说是一个 APP 的门面&#xff0c;对用户体验至关重要。随着业务不断增加&#xff0c;需要初始化的任务也越来越多&#xff0c;如果放任不管&#xff0c;启动时长会逐步增加&#xff0c;为此雪球客户端针对应用启动时长做了大量优化工作。本文从应用启动基…

[读论文] Monocular 3D Object Reconstruction with GAN inversion (ECCV2022)

概述 项目主页&#xff1a;https://www.mmlab-ntu.com/project/meshinversion/ 方法名称&#xff1a;MeshInversion 输入&#xff1a;单目图像 &#xff08;in the wild&#xff0c;有背景的&#xff0c;没有抠图的&#xff09; 输出&#xff1a;textured 3D mesh key challen…