首页 > 其他分享 >Vue3实现电商放大镜效果

Vue3实现电商放大镜效果

时间:2023-12-21 21:23:52浏览次数:27  
标签:鼠标 放大镜 elementY top value elementX Vue3 电商 left

效果实现:

image

功能拆解:

  • 左侧滑块跟随鼠标移动
  • 右则大图放大效果实现
  • 鼠标移入控制滑块和大图显示隐藏

滑块跟随鼠标移动

image

思路:获取到当前的鼠标在盒子内的相对位置(useMouseInElement),控制滑块跟随鼠标移动(left/top)

  • 获取鼠标相对位置
  • 控制滑块跟随移动
  1. 有效移动范围内的计算逻辑
    横向:100 < elementX < 300,left = elementX - 小滑块宽度一半
    纵向: 100 < elementY < 300,top = elementY - 小滑块高度一半

  2. 边界距离控制
    横向:elementX > 300 left = 200 elementX < 100 left = 0
    纵向:elementY > 300 top = 200 elementY < 100 top = 0

import { useMouseInElement } from '@vueuse/core'
//elementX: 表示鼠标在目标元素内的 X 坐标。
//elementY: 表示鼠标在目标元素内的 Y 坐标。
//isOutside: 是一个布尔值,表示鼠标是否在目标元素的外部。如果鼠标在目标元素内,isOutside 为 false;如果在目标元素外,isOutside 为 true。
const { elementX, elementY, isOutside } = useMouseInElement(target)
// 3. 控制滑块跟随鼠标移动(监听elementX/Y变化,一旦变化重新设置left/top)
// 定义左右和上下方向的偏移量
const left = ref(0)
const top = ref(0)

// 监听鼠标在元素内的 X 和 Y 坐标的变化
watch([elementX, elementY], () => {
  // 有效范围内控制滑块距离

  // 横向范围限制
  if (elementX.value > 100 && elementX.value < 300) {
    left.value = elementX.value - 100
  }

  // 纵向范围限制
  if (elementY.value > 100 && elementY.value < 300) {
    top.value = elementY.value - 100
  }

  // 边界值处理

  // 如果鼠标在元素右侧边界之外,将 left 设置为 200(元素宽度为 200)
  if (elementX.value > 300) {
    left.value = 200
  }

  // 如果鼠标在元素左侧边界之外,将 left 设置为 0
  if (elementX.value < 100) {
    left.value = 0
  }

  // 如果鼠标在元素下侧边界之外,将 top 设置为 200(元素高度为 200)
  if (elementY.value > 300) {
    top.value = 200
  }

  // 如果鼠标在元素上侧边界之外,将 top 设置为 0
  if (elementY.value < 100) {
    top.value = 0
  }
})

  <!-- 蒙层小滑块 -->
      <div class="layer" :style="{ left: `${left}px`, top: `${top}px` }"></div>

大图效果实现

  • 效果:为实现放大效果,大图的宽高是小图的两倍
  • 思路:大图的移动方向和滑块移动方向相反,且数值为2
// 1.小图切换大图显示
const activeIndex = ref(0)
// 当点击时,获取下标值,并赋值给activeIndex,此时左侧大图即可实现切换
const enterhandler = (index) => {
  activeIndex.value = index
}
const target = ref(null)
// 2.放大镜效果实现
// 2.1 获取鼠标相对位置

const { elementX, elementY, isOutside } = useMouseInElement(target)

// 定义左右和上下方向的偏移量
const left = ref(0)
const top = ref(0)

// 大图的移动范围
const positionX = ref(0)
const positionY = ref(0)

// 监听鼠标在元素内的 X 和 Y 坐标的变化
watch([elementX, elementY, isOutside], () => {
  // 如果鼠标没有进入当前盒子就不执行该方法
  if (isOutside.value) return
  // 有效范围内控制滑块距离

  // 横向范围限制
  if (elementX.value > 100 && elementX.value < 300) {
    left.value = elementX.value - 100
  }

  // 纵向范围限制
  if (elementY.value > 100 && elementY.value < 300) {
    top.value = elementY.value - 100
  }

  // 边界值处理

  // 如果鼠标在元素右侧边界之外,将 left 设置为 200(元素宽度为 200)
  if (elementX.value > 300) {
    left.value = 200
  }

  // 如果鼠标在元素左侧边界之外,将 left 设置为 0
  if (elementX.value < 100) {
    left.value = 0
  }

  // 如果鼠标在元素下侧边界之外,将 top 设置为 200(元素高度为 200)
  if (elementY.value > 300) {
    top.value = 200
  }

  // 如果鼠标在元素上侧边界之外,将 top 设置为 0
  if (elementY.value < 100) {
    top.value = 0
  }

  // 控制大图的显示

  // 计算大图的横向偏移量
  positionX.value = -left.value * 2
  // 计算大图的纵向偏移量
  positionY.value = -top.value * 2
})

标签:鼠标,放大镜,elementY,top,value,elementX,Vue3,电商,left
From: https://www.cnblogs.com/zgf123/p/17920137.html

相关文章

  • vue3 + vant4 :form表单中,搭配 Popup 和 Field 实现vant-picker组件,设置默认值及默认选
    环境:vue3,vant4背景:Picker作为用于辅助表单填写,搭配Popup和Field。页面需要给picker设置默认值,city为温州,但是在popup弹出时,picker没有选中温州这个选项,还时停留在杭州。解决方案:看了很多解决方案,设置default-indexset,ColumnIndex。都尝试了,还是不行。而且这些方法,其实在v......
  • vue3--使用ref获取Dom元素
    vue2中,ref使用:在div元素上绑定了ref属性,并命名为hello,接下来我们直接使用this.$refs.hello的方式就可以获取到该DOM元素了。<template><divid="app"><divref="hello">Vue2,ref获取dom元素</div></div></template><script>......
  • 基于vue3和elementplus实现的自定义table组件
    基于vue3和elementplus实现的自定义table组件,集成查询工具栏分页,可通过配置直接实现基础的列表页基于vue3和elementplus实现的自定义table组件,集成查询工具栏分页,可通过配置直接实现基础的列表页目录结构如下:类型声明:declaretypeDictType={value:string|boolean|n......
  • vue3 + xlsx 实现 excel 导入web页面解析成json数据
    vue3+xlsx实现excel导入web页面并解析成json数据fileIipt动态创建的标签,一定要用户点击事件触发,不然文件选择框的弹出会被拦截,无法弹出。意思就是下面这段关键代码要用一个事件区触发执行,不能主动执行(比如:vue的钩子)import*asXLSXfrom'xlsx'//v:"^0.18.5"letfil......
  • 从聚水潭开始,自动化您的电商工作流程
    随着电子商务的发展,越来越多的企业开始重视自动化电商工作流程,以提高效率和降低成本。许多企业都会选择ERP、WMS等不同的协同平台去对业务进行更好的管理以及企业的运营,而当我们的系统变多后,各个业务环节都需要系统去进行同步以及执行,如当用户信息新增时,用户信息自动同步到表格,方便......
  • 从聚水潭开始,自动化您的电商工作流程
     随着电子商务的发展,越来越多的企业开始重视自动化电商工作流程,以提高效率和降低成本。许多企业都会选择ERP、WMS等不同的协同平台去对业务进行更好的管理以及企业的运营,而当我们的系统变多后,各个业务环节都需要系统去进行同步以及执行,如当用户信息新增时,用户信息自动同步到......
  • 一文教你Vue3中的useDialog,让你的代码更加优雅!
    在日常开发时,弹窗是一个经常使用的功能,而且重复性极高,你可能会遇到下面这些问题:1、一个页面内多个弹窗,要维护多套弹窗状态,看的眼花缭乱2、弹窗内容比较简单,声明变量+模板语法的方式写起来比较麻烦关于这些问题,我首先想到的是应该弄一个即用即走的Dialog,不用去单独维护它......
  • Lazada商品评论列表API:电商行业的实时反馈宝库
    一、引言在当前的电商行业中,获取实时、准确的用户反馈数据对于电商业务运营至关重要。Lazada是东南亚地区领先的电商平台之一,提供了丰富的API接口,其中包括获取商品评论列表API,以便第三方开发者能够获取Lazada内的商品评论信息。本文将深入探讨Lazada商品评论列表API在电商行业中的......
  • vue3+vite动态引入图片(import.meta.glob)
    Vite官方提供的 import.meta.glob API。这个方法一般用于批量引入js或者ts文件,但实际上这个方法就是很多import语句的集合而已,import是可以引入图片的,所以import.meta.glob也同样可以引入图片资源,只不过需要加入配置项as:'url'就可以了。 通常来说,我们可以用ES提供的......
  • 边做笔试边查缺补漏——算法、js基础、vue3官方文档、八股文
    边投简历边完善自己的知识库。最近这些天一直在面试和笔试+投简历中,每次面试或笔试完后其实最重要的不是结果,而是做题的过程或者说对话的过程。因为只有这些才让我知道自己哪里还有不足,比如一碰到算法题就歇菜、vue3和vue2混用、js基础知识不牢固等等。那我痛定思痛,有缺点咱就认......