element-ui+js+vue——实现图片的放大缩小拖动等功能——技能提升

news2024/11/24 8:25:26

elementui+js+vue——实现图片组件的封装

1. 实现图片的放大缩小
2. 实现图片的拖动功能
3. 实现图片的预览

最近同事在写一个关于 图片放大缩小拖动的功能,其实不止是图片,只要是在以下组件中的内容,都是可以支持放大缩小拖动的。
功能:

1.鼠标拖动:拖动改变位置
2.鼠标滚动:实现放大缩小功能
3.根据是否有图片,展示三种不同的效果

一:先上效果图:

1.没有内容的时候

在这里插入图片描述

2.有一张图片的时候

在这里插入图片描述

3.有两张图片的时候

在这里插入图片描述

二:分析组件

首先是一个弹层,可以使用el-dialog组件才处理,其次,根据图片的数量,分为 0张图片/1张图片/2张图片等。

三: inc_imgsvg.vue组件的封装

1.html部分的代码

<template>
  <div class="drag-outer"
       ref="dragWrap"
       :style="'width:'+(imgWidth=='auto'?'calc(50% - 10px)':imgWidth)"
       @mouseenter="isHover = true"
       @mouseleave="isHover = isMousedown = false"
       @mousemove="dragMousemove">
    <div class="drag-inner"
         ref="dragElement"
         @mousedown="dragMousedown"
         @mouseup.stop="isMousedown = false">
      <slot></slot>
    </div>
  </div>
</template>

2.script部分的代码

<script>
export default {
  name: 'inc_imgsvg',
  props: {
    imgWidth: {
      type:String,
      default () {
        return '400px'
      }
    },
    scaleZoom: {
      type: Object,
      default () {
        return {
          max: 5,
          min: 0.2
        }
      }
    }
  },
  data() {
    return {
      isMousedown: false,
      isHover: false,
      moveStart: {},
      translate: {x: 0, y: 0},
      scale: 1
    }
  },
  methods: {
    handleScroll(e) {
      if(this.isHover) {
        let speed = e.wheelDelta/120
        if(e.wheelDelta > 0 && this.scale < this.scaleZoom.max) {
          this.scale+=0.2*speed
          this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`
        }else if(e.wheelDelta < 0 && this.scale > this.scaleZoom.min){
          this.scale+=0.2*speed
          this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`
        }
      }
    },
    dragMousedown() {
      this.moveStart.x = event.clientX
      this.moveStart.y = event.clientY
      this.isMousedown = true
    },
    dragMousemove() {
      if(this.isMousedown) {
        this.translate.x += (event.clientX - this.moveStart.x) / this.scale
        this.translate.y += (event.clientY - this.moveStart.y) / this.scale
        this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`
        this.moveStart.x = event.clientX
        this.moveStart.y = event.clientY
      }
    }
  },
  mounted() {
    window.addEventListener('mousewheel',this.handleScroll,false)
  }
}
</script>

3.css部分的代码

<style lang="scss" scoped>
.drag-outer {
  overflow: hidden;
  height:500px; float: left;
  display: flex;
  background-color:#fff;
  justify-content: center;
  align-items: center;
  .drag-inner {
    transform-origin: center center;
    display: flex;
    justify-content: center;
    align-items: center;
    cursor: move;
    user-select: none;
    width:100%;
    height:100%;
    >* {
      -webkit-user-drag: none;
      user-drag: none;
    }
    img{object-fit:contain; width:100%; height:100%}
  }
}
</style>

四:组件的使用

1.弹层的代码——html部分

<template>
  <el-dialog class="boxEDA" title="查看EDA模型信息" :visible.sync="show" width="80%" :before-close="handleClose">
    <div class="imgs" :class="{no:!showImg}" v-loading="load">
      <template v-if="showImg">
        <inc_imgsvg v-if="this.edaInfo.thumbnail" :imgWidth="this.edaInfo.ethumbnail?'auto':'100%'">
          <img :src="edaInfo.thumbnail" alt="">
        </inc_imgsvg>
        <inc_imgsvg v-if="this.edaInfo.ethumbnail" :imgWidth="this.edaInfo.thumbnail?'auto':'100%'">
          <img :src="edaInfo.ethumbnail" alt="">
        </inc_imgsvg>
      </template>
      <el-empty v-if="!showImg" description="暂无信息"></el-empty>
    </div>
    <p class="note" v-if="showImg">支持鼠标点击拖拽、鼠标滚轮放大缩小操作</p>
  </el-dialog>
</template>

2.弹层的代码——script部分

<script>
import {searchSvc} from "@/api";
import inc_imgsvg from "@/pages/componentDetailCloud/inc_imgsvg";

export default {
  name: "inc_showeda",
  components: {inc_imgsvg},
  props:['show','currentId'],
  data(){
    return{
      load:false,pid:'',
      edaInfo:{},
      showImg:false,
    }
  },
  mounted() {
    this.load = true;
    searchSvc.componentApi.getComponentFindSchById(this.currentId).then(res=>{
      this.edaInfo = res.data;
      this.showImg = res.data.thumbnail || res.data.ethumbnail;
    }).finally(()=>{
      this.load = false;
    })
  },
  methods: {
    handleClose() {
      this.$parent.showEDA = false;
    },
  }
}
</script>

3.弹层的代码——css部分

<style scoped lang="scss">
.boxEDA ::v-deep .el-dialog__body{background-color:#eee;
  .imgs{overflow: hidden; display:flex; justify-content:space-between;}
  .imgs.no{background-color:#fff; justify-content: center}
}
.note{display: block; padding:1em 0 0 0; margin:0; color:#999; text-align: center}
</style>

完成!!!多多积累,多多收获!!!

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

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

相关文章

Web前端项目的跨平台桌面客户端打包方案之——CEF框架

文章目录1、什么是CEF2、测测你电脑里的CEF3、从0开始的CEF入门实例1、什么是CEF CEF是什么 概念 Chromium Embedded Framework (CEF)是个基于Google Chromium项目的开源Web browser控件。 CEF的目标是为第三方应用提供可嵌入浏览器支持。CEF隔离底层Chromium和Blink的复杂代码…

靠着数套的Java刷题PDF,成功“混进”腾讯T3

昨晚半夜&#xff0c;一个学Java的老弟突然打电话告诉我他拿到了腾讯T3的offer&#xff0c;说实话&#xff0c;我有点诧异。。。 这老弟也是渣硕一枚&#xff0c;去投岗了腾讯的Java后台开发岗位。等了一个星期后简历被放回池子里了&#xff0c;眼看着提前批马上就要截止了&am…

jsp+ssm计算机毕业设计多媒体课程精品课程网站【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

海量数据小内存!从未出现过的数在哪里

文章目录题目要求1&#xff09;内存 1G2&#xff09;内存 3 KB3&#xff09;内存 有限变量举例题目 现在有 40 亿个无符号整数&#xff0c;无符号整数的范围是 0 ~ 232-1&#xff08;42亿&#xff09;&#xff0c;哪怕 40 亿个数完全不同&#xff0c;在该范围中也总有没有出现…

傻白探索Chiplet,关于EPYC Zen2 的一些理解记录(五)

目录 一、知识铺垫 &#xff08;1&#xff09;Chiplet &#xff08;2&#xff09;Zen架构 &#xff08;3&#xff09;EPYC和Ryzen &#xff08;4&#xff09;EPYC Zen2 二、关于EPYC Zen2里的部件 &#xff08;1&#xff09;内存控制器 &#xff08;2&#xff…

Python本地下载-实例的SQL审计日志

简介&#xff1a;使用阿里云的RDS数据库&#xff0c;开启DAS的数据库治理服务。会产生大量的审计日志。 我们有2T的审计日志数据&#xff0c;保留180天&#xff0c;每小时收费空间&#xff1a;0.008元/GB/小时 计算下来&#xff1a;2x1024x 24x 30 x 0.008 11796 元 解决&…

分类预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络分类预测(语音分类)

分类预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络分类预测(语音分类) 目录 分类预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络分类预测(语音分类)基本描述模型结构设计过程参考资料基本描述 传统的语音识别技术,主要在隐马尔可夫模型和高斯混合模型两大”神器“的加持…

[element plus] 分页组件使用 - vue

学习关键语句: 饿了么加组件分页组件 element分页组件 vue3 饿了么分页组件 写在前面 必须要说明的是 , 这篇文章使用的分页组件样式包含了饿了么官方给出警告以后会弃用的部分 但是问题是什么呢? 问题就是我还没找到这个用 vmodel 绑定的使用方法 , 再加上现在也算是有点…

C++代码简化之道

1. 善用emplace C11开始STL容器出现了emplace&#xff08;置入&#xff09;的语义。比如 vector、map、unordered_map&#xff0c;甚至 stack和 queue都有。 emplace方便之处在于&#xff0c;可以用函数参数自动构造对象&#xff0c;而不是向vector的push_back&#xff0c;ma…

论文投稿指南——中文核心期刊推荐(电工技术2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

机器人开发--霍尔元件

机器人开发--霍尔元件1 霍尔效应2 霍尔元件特点3 霍尔传感器的典型应用电流传感器位移测量测转速或转数参考1 霍尔效应 霍尔效应是电磁效应的一种&#xff0c;这一现象是美国物理学家霍尔于1879年在研究金属的导电机制时发现的。当电流垂直于外磁场通过半导体时&#xff0c;载…

ORB-SLAM2 --- Tracking::SearchLocalPoints函数解析

1.函数作用 用局部地图点进行投影匹配&#xff0c;得到更多的匹配关系。 局部地图点中已经是当前帧地图点的不需要再投影&#xff0c;只需要将此外的并且在视野范围内的点和当前帧进行投影匹配。 2.函数流程 Step 1&#xff1a;遍历当前帧的地图点&#xff0c;标记这些地图点不…

Mycat(6):mycat简单配置

1 找到conf/schema.xml并备份 2 配置虚拟表table[在schema里面] 其中 sharding-by-intfile 为rule.xml中的规则 规则文件为conf文件夹中的partition-hash-int.txt 3 配置数据节点dataNode 现在数据库新建3个数据库&#xff0c;skywalking&#xff0c;skywalking1&#xff0c;s…

[附源码]计算机毕业设计Python的低碳生活记录网站(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

MapReduce 排序

文章目录WritableComparable 排序一、排序概述1、排序分类2、自定义排序(1)、原理分析二、WritableComparable 排序案例(全排序)1、需求WritableComparable 排序 一、排序概述 排序是MapReduce框架中最重要的操作之一 MapTask和ReduceTask均会对数据按照key进行排序&#xff…

使用c++部署tensorrt加速yolov7

先放上一张我运行成功的截图,只要跟着我的教程一步一步按操作,下载好匹配的软件是一定可以成功的! 我相信想要在C++平台使用tensorrt加速的朋友们也是有很强的计算机基础的,那么简单的部分我们就跳过,重点是和大家介绍模型转换的部分以及环境的搭建。 一. 环境 我的cudn…

docker-compose安装部署

一、前言 docker compose 给容器做单机编排的。Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 docker compose是docker的独立产品&#xff0c;因此安装docker compose之前需要安装docker&#xff0c;Centos部署Docker_crazyK.的博…

高斯信号的贝叶斯步长最小均方算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

云原生爱好者周刊 | 使用 WASM 来写博客是什么感觉?

开源项目推荐 zzhack zzhack 是一个静态博客框架&#xff0c;是一个纯正的 WASM 应用&#xff0c;它由 Rust & Yew 来作为技术栈进行搭建&#xff0c;UI 设计比较美观&#xff0c;大家也可以直接使用该项目的设计模板零成本构建 WASM 应用。 Tracee Tracee 是一个运行时…

数据结构与算法之双向链表的设计与实现

文章目录前言一、双向链表1.1 概念1.2 双向链表的应用1.3 双向链表的node方法1.4 双向链表的add方法1.5 双向链表的remove方法1.6 整体代码1.7 接口测试二、对比学习2.1 单向链表 vs 双向链表2.2 双向链表 vs 动态数组2.3 ArrayList和LinkedList的区别前言 文章链接之前所介绍…