Vue图片放大镜组件的封装使用详解

yizhihongxing

Vue图片放大镜组件的封装使用详解

1. 组件功能

该组件是一个基于Vue框架封装的图片放大镜组件。当用户鼠标移动到图片上时,鼠标正中心出现一个放大镜图层,能够实现对图片的放大查看。该组件主要由两部分组成:鼠标跟随图层、放大镜图层。

2. 组件使用

该组件的使用非常简单,以下是使用步骤:

2.1 引入组件

import Vue from 'vue'
import Magnifier from '@components/magnifier/Magnifier.vue'

Vue.component('magnifier', Magnifier)

在需要使用组件的地方引入该组件并注册它。

2.2 声明变量并绑定数据

data() {
  return {
    imageList: [{ // 图片列表
      url: require('@/assets/images/1.jpg'), // 图片地址
      name: '图片1' // 图片名
    }]
  }
},

声明一个imageList数组变量,并将需要显示的图片信息存入该变量中。

2.3 在模板中使用组件并绑定数据

<magnifier
  v-for="(item, index) in imageList"
  :key="index"
  :origin-img="item.url"
  :name="item.name"
  :max-width="500"
  :max-height="500"
  :ratio="2.5"
></magnifier>

在模板中使用<magnifier>标签,并传递需要的属性值。其中:

  • origin-img表示需要显示的原图片地址。
  • name表示该图片的名称。
  • max-width表示放大镜图层的最大宽度。
  • max-height表示放大镜图层的最大高度。
  • ratio表示放大镜的比例。

3. 组件结构

该组件目录结构如下:

- Magnifier.vue

其中,Magnifier.vue是该组件的核心代码文件。

以下是组件代码的详细注释说明:

<template>
  <div class="magnifier-wrap" ref="magnifierWrap" @mouseenter="showMagnifier" @mouseleave="hideMagnifier" @mousemove="moveMagnifier">
    <!-- 原图 -->
    <img class="origin-img" ref="originImg" :src="originImgSrc" :alt="name">
    <!-- 放大镜图层 -->
    <div class="magnifier-layer" ref="magnifierLayer" :style="{ 'width': maxWidth + 'px', 'height': maxHeight + 'px' }">
      <img class="magnifier-img" :src="magnifierImgSrc" :style="{ 'width': magnifierWidth + 'px', 'height': magnifierHeight + 'px', 'left': magnifierLeft + 'px', 'top': magnifierTop + 'px' }">
    </div>
  </div>
</template>

<script>
export default {
  name: 'Magnifier',
  props: {
    originImg: { // 原图地址
      type: String,
      required: true
    },
    name: { // 图片名称
      type: String,
      default: ''
    },
    maxWidth: { // 放大镜图层最大宽度
      type: Number,
      default: 500,
      validator: (value) => value > 0
    },
    maxHeight: { // 放大镜图层最大高度
      type: Number,
      default: 500,
      validator: (value) => value > 0
    },
    ratio: { // 放大倍数
      type: Number,
      default: 2,
      validator: (value) => value > 0
    }
  },
  data() {
    return {
      magnifierWidth: 0, // 放大镜宽度
      magnifierHeight: 0, // 放大镜高度
      magnifierLeft: 0, // 放大镜水平位置
      magnifierTop: 0, // 放大镜垂直位置
      magnifierShow: false, // 是否显示放大镜
      originImgSrc: this.originImg, // 原图地址
      magnifierImgSrc: this.originImg, // 放大镜图片地址
      originWidth: 0, // 原图宽度
      originHeight: 0 // 原图高度
    }
  },
  methods: {
    showMagnifier() { // 显示放大镜图层
      this.magnifierShow = true
    },
    hideMagnifier() { // 隐藏放大镜图层
      this.magnifierShow = false
    },
    moveMagnifier(e) { // 鼠标跟随
      if (!this.magnifierShow) return
      const wrapRect = this.$refs.magnifierWrap.getBoundingClientRect() // 获取整个组件容器的位置信息
      const x = e.pageX - wrapRect.left // 获取鼠标在组件容器内的水平坐标
      const y = e.pageY - wrapRect.top // 获取鼠标在组件容器内的垂直坐标
      this.magnifierLeft = x - this.magnifierWidth / 2 // 设置放大镜的水平位置
      this.magnifierTop = y - this.magnifierHeight / 2 // 设置放大镜的垂直位置
      // 边界判断
      if (this.magnifierLeft < 0) this.magnifierLeft = 0
      else if (this.magnifierLeft > wrapRect.width - this.magnifierWidth) this.magnifierLeft = wrapRect.width - this.magnifierWidth
      if (this.magnifierTop < 0) this.magnifierTop = 0
      else if (this.magnifierTop > wrapRect.height - this.magnifierHeight) this.magnifierTop = wrapRect.height - this.magnifierHeight
    }
  },
  mounted() {
    // 图片加载完成后计算相关尺寸并进行初始化
    this.$refs.originImg.onload = () => {
      this.originWidth = this.$refs.originImg.clientWidth
      this.originHeight = this.$refs.originImg.clientHeight
      this.magnifierWidth = Math.floor(this.maxWidth / this.ratio)
      this.magnifierHeight = Math.floor(this.maxHeight / this.ratio)
      this.magnifierImgSrc = this.originImgSrc
      this.$refs.magnifierLayer.style.backgroundImage = `url(${this.originImgSrc})`
      this.magnifierShow = false
    }
  },
  watch: {
    originImg() { // 原图地址变动时重新初始化
      this.originImgSrc = this.originImg
      this.magnifierImgSrc = this.originImg
      this.$refs.magnifierLayer.style.backgroundImage = `url(${this.originImgSrc})`
      this.magnifierShow = false
    }
  }
}
</script>

<style scoped>
.magnifier-wrap {
  position: relative;
  cursor: none;
}

.origin-img {
  max-width: 100%;
  display: block;
  border-radius: 5px;
}

.magnifier-layer {
  position: absolute;
  overflow: hidden;
  /*background: rgba(255, 255, 255, 0.5);*/
  border: 1px solid #ddd;
  box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3);
  border-radius: 5px;
  z-index: 99;
  display: none;
  cursor: none;
}

.magnifier-layer .magnifier-img {
  position: absolute;
  display: inline-block;
}
</style>

4. 使用示例

4.1 示例1

以下是一个简单的使用示例:

<template>
  <div class="app">
    <div class="image-list">
      <h3>图片列表</h3>
      <magnifier
        v-for="(item, index) in imageList"
        :key="index"
        :origin-img="item.url"
        :name="item.name"
        :max-width="500"
        :max-height="500"
        :ratio="2.5"
      ></magnifier>
    </div>
  </div>
</template>

<script>
import Magnifier from '@components/magnifier/Magnifier.vue'

export default {
  name: 'App',
  components: {
    Magnifier
  },
  data() {
    return {
      imageList: [{ // 图片列表
        url: require('@/assets/images/1.jpg'), // 图片地址
        name: '图片1' // 图片名
      }, {
        url: require('@/assets/images/2.jpg'), // 图片地址
        name: '图片2' // 图片名
      }]
    }
  },
}
</script>

<style>
.app {
  padding: 20px;
}

.image-list {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
}

h3 {
  text-align: center;
  width: 100%;
}

img {
  margin-bottom: 20px;
}
</style>

在该示例中,我们引入了Magnifier组件,并声明了一个imageList数组,其中存储了需要显示的图片信息。接着,在模板中使用<magnifier>标签并传递需要的属性,就可以展示图片放大镜了。

4.2 示例2

以下是另一个高级一些的使用示例,该示例中,我们可以通过拖拽图片来改变放大镜的位置:

<template>
  <div class="app">
    <div class="image-list">
      <h3>图片列表</h3>
      <magnifier
        v-for="(item, index) in imageList"
        :key="index"
        :origin-img="item.url"
        :name="item.name"
        :max-width="500"
        :max-height="500"
        :ratio="2"
        @mousedown="startDrag"
        @mouseup="endDrag"
        @mousemove="dragMove"
      ></magnifier>
    </div>
  </div>
</template>

<script>
import Magnifier from '@components/magnifier/Magnifier.vue'

export default {
  name: 'App',
  components: {
    Magnifier
  },
  data() {
    return {
      imageList: [{ // 图片列表
        url: require('@/assets/images/1.jpg'), // 图片地址
        name: '图片1' // 图片名
      }, {
        url: require('@/assets/images/2.jpg'), // 图片地址
        name: '图片2' // 图片名
      }]
    }
  },
  methods: {
    startDrag(e) {
      const magnifierLayer = e.target.parentNode.parentNode
      magnifierLayer.style.cursor = 'move'
      magnifierLayer.dragging = true
      magnifierLayer.startX = e.clientX - magnifierLayer.offsetLeft
      magnifierLayer.startY = e.clientY - magnifierLayer.offsetTop
    },
    endDrag(e) {
      const magnifierLayer = e.target.parentNode.parentNode
      magnifierLayer.style.cursor = 'none'
      magnifierLayer.dragging = false
    },
    dragMove(e) {
      const magnifierLayer = e.target.parentNode.parentNode
      if (!magnifierLayer.dragging) return
      const x = e.clientX - magnifierLayer.startX
      const y = e.clientY - magnifierLayer.startY
      magnifierLayer.style.left = `${x}px`
      magnifierLayer.style.top = `${y}px`
    }
  }
}
</script>

<style>
.app {
  padding: 20px;
}

.image-list {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
}

h3 {
  text-align: center;
  width: 100%;
}

img {
  margin-bottom: 20px;
}
</style>

在该示例中,我们通过添加拖拽事件来实现了更加丰富的用户体验。具体实现细节可以参见代码中的注释。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue图片放大镜组件的封装使用详解 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • CI框架学习笔记(一) – 环境安装、基本术语和框架流程

    CI框架学习笔记(一) – 环境安装、基本术语和框架流程 简介 本文将详细介绍CI(持续集成)框架的学习笔记,包括环境安装、基本术语和框架流程。CI框架是一种软件开发实践,旨在通过频繁地集成和测试代码,以确保团队的代码质量和稳定性。 环境安装 在开始学习CI框架之前,我们需要安装以下环境: Git:版本控制系统,用于管理代码库。可以从Git官方网站下载并安装…

    other 2023年8月6日
    00
  • Spring Boot的properties配置文件读取

    Spring Boot 是一个快速开发框架,它可以帮助我们快速开发 Java 应用程序。在 Spring Boot 中,可以很方便的读取.properties/.yml配置文件,在程序中获取所需的配置信息。下面是 Spring Boot 的 properties 配置文件读取攻略。 1. 配置文件位置 Spring Boot 默认的配置文件位置是在 src/…

    other 2023年6月25日
    00
  • 南湖书院-景点介绍

    南湖书院-景点介绍攻略 南湖书院是中国南京市鼓楼区的一处历史文化景点,建于明朝洪武年间,是明朝著名学者王守仁的故居。以下是南湖书院的完整攻略: 步骤一:了解南湖书院的历史和文化 南湖书院是明朝著名学者王守仁的故居,也是明朝时期南京城内最大的私塾之一。南湖书院以其深厚的文化底蕴和优美的园林环境而闻名于世在南湖书院,客可以了解到明朝时期的文化和教育,以及王守仁的…

    other 2023年5月9日
    00
  • python-在python中生成“ctrl+c”事件的最佳方法是什么

    Python中生成“Ctrl+C”事件的最佳方法 在Python中,有时需要模拟用户按下“Ctrl+C”键,例如在测试中模拟程序被中断的情况。本攻略将介绍如何在Python中生成“Ctrl+C”的最佳方法。 使用signal模块 Python的signal模块提供了处理信号的功能,可以使用该模块生成“Ctrl+C”事件。是使用signal模块生成“Ctrl+…

    other 2023年5月9日
    00
  • JS实现重新加载当前页面或者父页面的几种方法

    下面我将为你详细讲解JS实现重新加载当前页面或者父页面的几种方法。 方法一:使用location.reload()方法 简介 location.reload()方法可以重新加载当前页面,强制从服务器重新加载页面,而不是从浏览器缓存中加载。 用法 location.reload(); 示例 <!DOCTYPE html> <html> …

    other 2023年6月25日
    00
  • Python中if __name__ == “__main__”详细解释

    if __name__ == \”__main__\” 是 Python 中常见的用法,用于判断当前模块是否作为主程序运行,或者作为模块被导入到其他模块中。下面是对这个用法的详细解释: 在 Python 中,每个模块都有一个内置的全局变量 __name__,它代表了模块的名字。当一个模块被直接执行时,__name__ 的值为 \”__main__\”;当一个…

    other 2023年8月5日
    00
  • 关机变重起的原因 5种关机变重起的解决办法

    关机变重起的原因 关机变重启是许多计算机用户遇到的常见问题。主要原因是计算机无法正常关闭,导致在下一次开机时进行系统故障检测和修复,从而导致了重启。以下是导致关机变重启的主要原因。 硬件问题:例如CPU过热,内存过少或过旧,硬盘损坏等。 软件问题:例如操作系统问题,与驱动程序或软件的不兼容,病毒感染,系统文件损坏和其他错误。 电源问题:可能是电源过载,开关问…

    other 2023年6月27日
    00
  • Win7/Win8.1在升级Win10正式版时出现重启后“丢失操作系统”的解决方法

    标题:Win7/Win8.1在升级Win10正式版时出现重启后“丢失操作系统”的解决方法 在升级Win10正式版的过程中,有时候会出现重启后“丢失操作系统”的情况,这让很多用户感到困扰。下面介绍一些解决方法。 解决方法一:使用命令行修复启动项 准备一个可引导的U盘或光盘,从中启动电脑,并选择进入PE系统。 打开命令行窗口,输入以下命令,回车执行: bash …

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部