我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue后台如何实现点击图片放大功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue后台如何实现点击图片放大功能

本文小编为大家详细介绍“Vue后台如何实现点击图片放大功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue后台如何实现点击图片放大功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

需求

点击小图可以放大,放大后,通过手势等比例放大缩小、左右切换图、旋转、关闭。由于element-ui版本较低不支持使用图片放大的image组件。

代码

父组件

<template><div><!-- 放大图 --><el-image-viewer v-if="showImg" :on-close="closeViewer"                     :class="lazy" data-src="currItem"                     :url-list="baseInfo.pictureUrlList"/><!-- 小图 --><div class="baseBoxPic">          <div v-for="(item, index) in baseInfo.pictureUrlList" :key="index" class="picBox">            <img :class="lazy" data-src="item" class="litPic" @click="bigImg(item)"/>          </div>         </div></div></template><script>import ElImageViewer from 'base/image/image-viewer'export default {data() {return {baseInfo: {pictureUrlList: []},showImg: false,     currItem: ''}},components: {   'ElImageViewer': ElImageViewer }, methods: {  // 放大  bigImg(e) {    this.currItem = e    this.showImg = true  },  // 关闭  closeViewer() {    this.showImg = false  },  }}</script>

子组件

base/image/image-viewer.vue

<template>  <transition name="viewer-fade">    <div class="el-image-viewer__wrapper" :>      <div class="el-image-viewer__mask"></div>      <!-- CLOSE -->      <span class="el-image-viewer__btn el-image-viewer__close" @click="hide">        <i class="el-icon-circle-close"></i>      </span>      <!-- ARROW -->      <template v-if="!isSingle">        <span class="el-image-viewer__btn el-image-viewer__prev" :class="{ 'is-disabled': !infinite && isFirst }" @click="prev">          <i class="el-icon-arrow-left" />        </span>        <span class="el-image-viewer__btn el-image-viewer__next" :class="{ 'is-disabled': !infinite && isLast }" @click="next">          <i class="el-icon-arrow-right" />        </span>      </template>      <!-- ACTIONS -->      <div class="el-image-viewer__btn el-image-viewer__actions">        <div class="el-image-viewer__actions__inner">          <i class="el-icon-zoom-out"  @click="handleActions('zoomOut')"></i>          <i class="el-icon-zoom-in"  @click="handleActions('zoomIn')"></i>          <i class="el-icon-refresh" @click="handleActions('clocelise')"></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 class="el-icon-refresh-left" @click="handleActions('anticlocelise')"></i>          <i class="el-icon-refresh-right" @click="handleActions('clocelise')"></i>        </div>      </div>      <!-- CANVAS -->      <div class="el-image-viewer__canvas">        <div v-for="(url, i) in urlList" v-if="i === index">          <div v-if="isPdf">            <a target="_blank" :href="currentImg" rel="external nofollow"  >点击新页面查看</a>          </div>          <img v-else ref="img" class="el-image-viewer__img" :key="url" :class="lazy" data-src="currentImg" : @load="handleImgLoad" @error="handleImgError" @mousedown="handleMouseDown">        </div>      </div>    </div>  </transition></template><script>import { on, off } from './dom';import { rafThrottle, isFirefox } from './util';import pdf from 'vue-pdf'const Mode = {  CONTAIN: {    name: 'contain',    icon: 'el-icon-full-screen'  },  ORIGINAL: {    name: 'original',    icon: 'el-icon-c-scale-to-original'  }};const mousewheelEventName = isFirefox() ? 'DOMMouseScroll' : 'mousewheel';export default {  name: 'elImageViewer',  props: {    urlList: {      type: Array,      default: () => []    },    zIndex: {      type: Number,      default: 2300    },    onSwitch: {      type: Function,      default: () => { }    },    onClose: {      type: Function,      default: () => { }    }  },  data () {    return {      index: 0,      isShow: false,      infinite: true,      loading: false,      mode: Mode.CONTAIN,      transform: {        scale: 1,        deg: 0,        offsetX: 0,        offsetY: 0,        enableTransition: false      }    };  },  components: {    pdf  },  computed: {    isSingle () {      return this.urlList.length <= 1;    },    isFirst () {      return this.index === 0;    },    isLast () {      return this.index === this.urlList.length - 1;    },    isPdf() {      return this.urlList[this.index] && this.urlList[this.index].toString().indexOf('.pdf') !== -1;    },    currentImg () {      return this.urlList[this.index]    },    isPdf() {      return this.urlList[this.index] &&  this.urlList[this.index].toString().indexOf('.pdf')!== -1;    },    imgStyle () {      const { scale, deg, offsetX, offsetY, enableTransition } = this.transform;      const style = {        transform: `scale(${scale}) rotate(${deg}deg)`,        transition: enableTransition ? 'transform .3s' : '',        'margin-left': `${offsetX}px`,        'margin-top': `${offsetY}px`      };      if (this.mode === Mode.CONTAIN) {        style.maxWidth = style.maxHeight = '100%';      }      return style;    }  },  watch: {    index: {      handler: function (val) {        this.reset();        this.onSwitch(val);      }    },    currentImg (val) {      this.$nextTick(_ => {        const $img = this.$refs.img[0];        if (!$img.complete) {          this.loading = true;        }      });    }  },  methods: {    hide () {      this.deviceSupportUninstall();      this.onClose();    },    deviceSupportInstall () {      this._keyDownHandler = rafThrottle(e => {        const keyCode = e.keyCode;        switch (keyCode) {          // ESC          case 27:            this.hide();            break;          // SPACE          case 32:            this.toggleMode();            break;          // LEFT_ARROW          case 37:            this.prev();            break;          // UP_ARROW          case 38:            this.handleActions('zoomIn');            break;          // RIGHT_ARROW          case 39:            this.next();            break;          // DOWN_ARROW          case 40:            this.handleActions('zoomOut');            break;        }      });      this._mouseWheelHandler = rafThrottle(e => {        const delta = e.wheelDelta ? e.wheelDelta : -e.detail;        if (delta > 0) {          this.handleActions('zoomIn', {            zoomRate: 0.015,            enableTransition: false          });        } else {          this.handleActions('zoomOut', {            zoomRate: 0.015,            enableTransition: false          });        }      });      on(document, 'keydown', this._keyDownHandler);      on(document, mousewheelEventName, this._mouseWheelHandler);    },    deviceSupportUninstall () {      off(document, 'keydown', this._keyDownHandler);      off(document, mousewheelEventName, this._mouseWheelHandler);      this._keyDownHandler = null;      this._mouseWheelHandler = null;    },    handleImgLoad (e) {      this.loading = false;    },    handleImgError (e) {      this.loading = false;      e.target.alt = '加载失败';    },    handleMouseDown (e) {      if (this.loading || e.button !== 0) return;      const { offsetX, offsetY } = this.transform;      const startX = e.pageX;      const startY = e.pageY;      this._dragHandler = rafThrottle(ev => {        this.transform.offsetX = offsetX + ev.pageX - startX;        this.transform.offsetY = offsetY + ev.pageY - startY;      });      on(document, 'mousemove', this._dragHandler);      on(document, 'mouseup', ev => {        off(document, 'mousemove', this._dragHandler);      });      e.preventDefault();    },    reset () {      this.transform = {        scale: 1,        deg: 0,        offsetX: 0,        offsetY: 0,        enableTransition: false      };    },    toggleMode () {      if (this.loading) return;      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]];      this.reset();    },    prev () {      if (this.isFirst && !this.infinite) return;      const len = this.urlList.length;      this.index = (this.index - 1 + len) % len;    },    next () {      if (this.isLast && !this.infinite) return;      const len = this.urlList.length;      this.index = (this.index + 1) % len;    },    handleActions (action, options = {}) {      if (this.loading) return;      const { zoomRate, rotateDeg, enableTransition } = {        zoomRate: 0.2,        rotateDeg: 90,        enableTransition: true,        ...options      };      const { transform } = this;      switch (action) {        case 'zoomOut':          if (transform.scale > 0.2) {            transform.scale = parseFloat((transform.scale - zoomRate).toFixed(3));          }          break;        case 'zoomIn':          transform.scale = parseFloat((transform.scale + zoomRate).toFixed(3));          break;        case 'clocelise':          transform.deg += rotateDeg;          break;        case 'anticlocelise':          transform.deg -= rotateDeg;          break;      }      transform.enableTransition = enableTransition;    }  },  mounted () {    this.deviceSupportInstall();  }};</script><style  scoped>.el-image__error,.el-image__inner,.el-image__placeholder {  width: 100%;  height: 100%;}.el-image {  position: relative;  display: inline-block;  overflow: hidden;}.el-image__inner {  vertical-align: top;}.el-image__inner--center {  position: relative;  top: 50%;  left: 50%;  transform: translate(-50%, -50%);  display: block;}.el-image__error,.el-image__placeholder {  background: #f5f7fa;}.el-image__error {  display: flex;  justify-content: center;  align-items: center;  font-size: 14px;  color: #c0c4cc;  vertical-align: middle;}.el-image__preview {  cursor: pointer;}.el-image-viewer__wrapper {  position: fixed;  top: 0;  right: 0;  bottom: 0;  left: 0;}.el-image-viewer__btn {  position: absolute;  z-index: 1;  display: flex;  align-items: center;  justify-content: center;  border-radius: 50%;  opacity: 0.8;  cursor: pointer;  box-sizing: border-box;  user-select: none;}.el-image-viewer__close {  top: 40px;  right: 40px;  width: 40px;  height: 40px;  font-size: 40px;}.el-image-viewer__canvas {  width: 100%;  height: 100%;  display: flex;  justify-content: center;  align-items: center;}.el-image-viewer__actions {  left: 50%;  bottom: 30px;  transform: translateX(-50%);  width: 100px;  height: 44px;  padding: 0 23px;  background-color: #606266;  border-color: #fff;  border-radius: 22px;}.el-image-viewer__actions__inner {  width: 100%;  height: 100%;  text-align: justify;  cursor: default;  font-size: 23px;  color: #fff;  display: flex;  align-items: center;  justify-content: space-around;}.el-image-viewer__prev {  left: 40px;}.el-image-viewer__next,.el-image-viewer__prev {  top: 50%;  transform: translateY(-50%);  width: 44px;  height: 44px;  font-size: 24px;  color: #fff;  background-color: #606266;  border-color: #fff;}.el-image-viewer__next {  right: 40px;  text-indent: 2px;}.el-image-viewer__mask {  position: absolute;  width: 100%;  height: 100%;  top: 0;  left: 0;  opacity: 0.5;  background: #000;}.viewer-fade-enter-active {  animation: viewer-fade-in 0.3s;}.viewer-fade-leave-active {  animation: viewer-fade-out 0.3s;}@keyframes viewer-fade-in {  0% {    transform: translate3d(0, -20px, 0);    opacity: 0;  }  to {    transform: translateZ(0);    opacity: 1;  }}@keyframes viewer-fade-out {  0% {    transform: translateZ(0);    opacity: 1;  }  to {    transform: translate3d(0, -20px, 0);    opacity: 0;  }}</style>

dom.js

import Vue from 'vue';const isServer = Vue.prototype.$isServer;const SPECIAL_CHARS_REGEXP = /([:\-_]+(.))/g;const MOZ_HACK_REGEXP = /^moz([A-Z])/;const ieVersion = isServer ? 0 : Number(document.documentMode);export const on = (function () {  if (!isServer && document.addEventListener) {    return function (element, event, handler) {      if (element && event && handler) {        element.addEventListener(event, handler, false);      }    };  } else {    return function (element, event, handler) {      if (element && event && handler) {        element.attachEvent('on' + event, handler);      }    };  }})();export const off = (function () {  if (!isServer && document.removeEventListener) {    return function (element, event, handler) {      if (element && event) {        element.removeEventListener(event, handler, false);      }    };  } else {    return function (element, event, handler) {      if (element && event) {        element.detachEvent('on' + event, handler);      }    };  }})();

util.js

import Vue from 'vue';import {  isString,  isObject} from './types';const hasOwnProperty = Object.prototype.hasOwnProperty;export const isFirefox = function () {  return !Vue.prototype.$isServer && !!window.navigator.userAgent.match(/firefox/i);};export const autoprefixer = function (style) {  if (typeof style !== 'object') return style;  const rules = ['transform', 'transition', 'animation'];  const prefixes = ['ms-', 'webkit-'];  rules.forEach(rule => {    const value = style[rule];    if (rule && value) {      prefixes.forEach(prefix => {        style[prefix + rule] = value;      });    }  });  return style;};export function rafThrottle(fn) {  let locked = false;  return function (...args) {    if (locked) return;    locked = true;    window.requestAnimationFrame(_ => {      fn.apply(this, args);      locked = false;    });  };}

types.js

export function isString(obj) {  return Object.prototype.toString.call(obj) === '[object String]';}export function isObject(obj) {  return Object.prototype.toString.call(obj) === '[object Object]';}

读到这里,这篇“Vue后台如何实现点击图片放大功能”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue后台如何实现点击图片放大功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue后台如何实现点击图片放大功能

本文小编为大家详细介绍“Vue后台如何实现点击图片放大功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue后台如何实现点击图片放大功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。需求点击小图可以放大,放大
2023-07-04

Vue后台实现点击图片放大功能的示例代码

这篇文章主要为大家详细介绍了如何利用Vue实现点击图片放大功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2022-12-08

Vue如何实现点击图片放大显示功能

这篇文章主要讲解了“Vue如何实现点击图片放大显示功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue如何实现点击图片放大显示功能”吧!方式一:列表中感应鼠标显示大图我管理后台使用的是
2023-07-05

纯css如何实现点击图片放大

本篇内容主要讲解“纯css如何实现点击图片放大”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“纯css如何实现点击图片放大”吧!纯css实现点击图片放大的方法:1、创建一个HTML示例文件;2、设
2023-07-05

Vue下如何使用press实现图片放大功能

本篇内容介绍了“Vue下如何使用press实现图片放大功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!VuePress 由两部分组成:一个
2023-07-04

在Android项目使用 WebView实现点击图片放大功能

这篇文章将为大家详细讲解有关在Android项目使用 WebView实现点击图片放大功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。图示:项目的知识点:加载网页后如何捕捉网页中的图片点击事
2023-05-31

Android 实现WebView点击图片查看大图列表及图片保存功能

在日常开发过程中,有时候会遇到需要在app中嵌入网页,此时使用WebView实现效果,但在默认情况下是无法点击图片查看大图的,更无法保存图片。本文将就这一系列问题的实现进行说明。 图示:项目的知识点:加载网页后如何捕捉网页中的图片点击事件
2022-06-06

VUE如何实现上传图片功能

这篇“VUE如何实现上传图片功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“VUE如何实现上传图片功能”文章吧。首先要创建
2023-07-04

Vue 图片监听鼠标滑轮滚动实现图片缩小放大功能(实现思路)

其实想要实现功能很简单,就是在一张图片上监听鼠标滑轮滚动的事件,然后根据上滚还是下滚实现图片的缩放,这篇文章主要介绍了Vue 实现图片监听鼠标滑轮滚动实现图片缩小放大功能,需要的朋友可以参考下
2023-05-13

JavaScript如何实现图片自动播放功能

今天小编给大家分享一下JavaScript如何实现图片自动播放功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、自动轮播
2023-07-06

Android App中实现可以双击放大和缩小图片功能的实例

先来看一个很简单的核心图片缩放方法:public static Bitmap scale(Bitmap bitmap, float scaleWidth, float scaleHeight) { int width = bitmap.ge
2022-06-06

Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能

这篇文章主要讲解了“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”吧!效果:实现思路在j
2023-07-05

Swift如何实现缩放并填充图片功能

小编给大家分享一下Swift如何实现缩放并填充图片功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现先看代码,然后再分析:func rescaleAndPad
2023-06-25

如何用js实现手指缩放图片功能

这篇“如何用js实现手指缩放图片功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用js实现手指缩放图片功能”文章吧。需
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录