Vue3实现图片放大镜效果

 更新时间:2021年08月18日 14:55:44   作者:WQ佩奇大哥  
这篇文章主要为大家详细介绍了Vue3实现图片放大镜效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Vue3实现图片放大镜效果的具体代码,供大家参考,具体内容如下

实现效果

代码

<template>
  <div class="goods-image">
    <!-- 大图容器 -->
    <div
      class="large"
      :style="[
        {
          backgroundImage: `url(${imageList[curId]})`,
          backgroundPositionX: position.backgroundPositionX,
          backgroundPositionY: position.backgroundPositionY,
        },
      ]"
      v-if="isShow"
    ></div>
    <div class="middle" ref="target">
      <img :src="imageList[curId]" alt="" />
      <!-- 蒙层容器 -->
      <div class="layer" :style="{ left: left + 'px', top: top + 'px' }" v-if="isShow"></div>
    </div>
    <ul class="small">
      <li
        v-for="(img, i) in imageList"
        :key="i"
        @mouseenter="curId = i"
        :class="{ active: curId === i }"
      >
        <img :src="img" alt="" />
      </li>
    </ul>
  </div>
</template>
 
<script>
import { reactive, ref, watch } from 'vue'
import { useMouseInElement } from '@vueuse/core'
export default {
  name: 'GoodsImage',
  props: {
    imageList: {
      type: Array,
      default: () => {
        return []
      }
    }
  },
  setup () {
    const curId = ref(0)
    const target = ref(null)
    // elementX: 鼠标距离左侧的偏移值
    // elementY:表表距离顶部的偏移值
    // isOutside: 是否在容器外部  外部true  内部 false
    const { elementX, elementY, isOutside } = useMouseInElement(target)
    const left = ref(0) // 滑块距离左侧的距离
    const top = ref(0) // 滑块距离顶部的距离
    const isShow = ref(false) // 显示大图和蒙层图的显示和隐藏
    const position = reactive({ // 大图显示的位置,默认是0
      backgroundPositionX: 0,
      backgroundPositionY: 0
    })
    watch(
      // 监听的对象
      [elementX, elementY, isOutside],
      () => {
        if (elementX.value < 100) {
          // 左侧最小距离
          left.value = 0
        }
        if (elementX.value > 300) {
          left.value = 200
        }
        if (elementX.value > 100 && elementX.value < 300) {
          left.value = elementX.value - 100
        }
        if (elementY.value < 100) {
          // 左侧最小距离
          top.value = 0
        }
        if (elementY.value > 300) {
          top.value = 200
        }
        if (elementY.value > 100 && elementY.value < 300) {
          top.value = elementY.value - 100
        }
        // 控制背景图移动
        // 1. 蒙层移动的方向和大图背景移动的方向是相反的
        // 2. 蒙层和大图由于面积大小是1:2的 蒙层每移动一个像素  大图移动俩个像素
        // backgrondPosition:x,y;
        position.backgroundPositionX = -left.value * 2 + 'px'
        position.backgroundPositionY = -top.value * 2 + 'px'
 
        // 当isOutside的值发生变化的时候,立刻取反赋值给isShow
        // isOutside: 是否在容器外部  外部true  内部 false
        isShow.value = !isOutside.value
      },
      {}
    )
    return {
      curId,
      target,
      left,
      top,
      position,
      isShow
    }
  }
}
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Vue使用Tinymce富文本自定义toolbar按钮的实践

    Vue使用Tinymce富文本自定义toolbar按钮的实践

    本文主要介绍了Vue使用Tinymce富文本自定义toolbar按钮,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Vue路由应用详细讲解

    Vue路由应用详细讲解

    路由的本质就是一种对应关系,根据不同的URL请求,返回对应不同的资源。那么url地址和真实的资源之间就有一种对应的关系,就是路由
    2022-11-11
  • 解决VUE-Router 同一页面第二次进入不刷新的问题

    解决VUE-Router 同一页面第二次进入不刷新的问题

    这篇文章主要介绍了解决VUE-Router 同一页面第二次进入不刷新的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue全局引入scss(mixin)

    vue全局引入scss(mixin)

    本文主要介绍了 vue全局引入scss,我们在写VUE的时候,会使用scss,也会做一些通用样式,方便使用,在写好的通用样式的时候,每次都要单文件导入,刚开始写的时候,感觉还好,后面工程量大了后,就显得麻烦,那么本文就全局导入scss样式,下面来看详细内容,需要的朋友可以参考一下
    2021-11-11
  • vue-cli3 热更新配置操作

    vue-cli3 热更新配置操作

    这篇文章主要介绍了vue-cli3 热更新配置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Vue3 computed初始化获取设置值实现示例

    Vue3 computed初始化获取设置值实现示例

    这篇文章主要为大家介绍了Vue3 computed初始化以及获取值设置值实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Vue + element-ui 背景图片设置方式

    Vue + element-ui 背景图片设置方式

    这篇文章主要介绍了Vue + element-ui 背景图片设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 一文搞懂Vue中watch侦听器的用法

    一文搞懂Vue中watch侦听器的用法

    在Vue.js中,您可以使用watch选项来创建侦听器,以侦听特定属性的变化,侦听器可以在属性发生变化时执行相关的逻辑,本文给大家详细讲讲Vue中watch侦听器的用法,需要的朋友可以参考下
    2023-11-11
  • 详解如何使用Vuex实现Vue后台管理中的角色鉴权

    详解如何使用Vuex实现Vue后台管理中的角色鉴权

    最近参与了公司一个新的B端项目的研发,从无到有搭建项目的过程中,遇到了关于项目鉴权的问题,这篇文章主要给大家介绍了关于如何使用Vuex实现Vue后台管理中的角色鉴权的相关资料,需要的朋友可以参考下
    2022-05-05
  • vue跨域处理方式(vue项目中baseUrl设置问题)

    vue跨域处理方式(vue项目中baseUrl设置问题)

    这篇文章主要介绍了vue跨域处理方式(vue项目中baseUrl设置问题),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05

最新评论