当前位置: 首页 > news >正文

图片通过滑块小图切换大图放大镜效果显示

图片通过滑块小图切换大图放大镜效果显示

实现目标:

  1. 显示一组图片列表,鼠标进入小图记录当下小图下标,通过小图下标在数组中对应图片显示到大图位置;

  2. 鼠标进入大图位置时,带动滑块移动,并将放大两倍的大图显示在原大图右边

实现过程:

  1. 实现小图切换大图:通过v-for将图片列表绑定在li标签上,同时为li标签添加鼠标监测事件,并绑定事件处理函数 enterHandler,传入图片索引 i 。初始化响应数据 activeIndex记录当前激活索引。通过 v-on加强 li 标签的样式 ,active激活条件为 i=== activeIndex即当前激活索引与小图索引相同时,左侧大图链接为激活图片索引 imageList[sctiveIndex]
  2. 导入VueUse的 useMouseInElement元素获取鼠标位置,记录鼠标相对位置 elementX、elementY,初始化放大图坐标 positionX、positionY,通过监听器 watch监听鼠标相对位置的变化,小滑块通过 left 、 top控制位置

图中红色正方形为滑块位置,蓝色正方形内为滑块控制的有效范围,需要处理边界(黑色正方形与蓝色正方形的差集)
在这里插入图片描述

控制滑块移动:

// 横向if (elementX.value > 100 && elementX.value < 300) {left.value = elementX.value - 100}// 纵向if (elementY.value > 100 && elementY.value < 300) {top.value = elementY.value - 100}// 处理边界if (elementX.value < 100) {left.value = 0}if (elementX.value > 300) {left.value = 200}if (elementY.value < 100) {top.value = 0}if (elementY.value > 300) {top.value = 200}
  1. 控制放大图显示

注意观察,当鼠标在左侧大图移动时,右侧放大图移动方向相反

控制放大图坐标:

 // 控制大图显示positionX.value = -left.value * 2positionY.value = -top.value * 2// 控制放大图图片样式
<divclass="large":style="[{backgroundImage: `url(${imageList[activeIndex]})`,backgroundPositionX: `${positionX}px`,backgroundPositionY: `${positionY}px`,},]"v-show="!isOutside"></div>

在这里插入图片描述

在这里插入图片描述
【注:图片源自淘宝,如有侵权立刻删除】

完整代码

<script setup>
import { useMouseInElement } from '@vueuse/core'
import { ref, watch } from 'vue'// 图片列表
const imageList = ['img/O1CN01HhRDRN1PLRFptsiNY_!!2210715771824.jpg_.webp','img/O1CN01TgHapK1PLRFzgigEa_!!2210715771824.jpg_.webp','img/O1CN015Lpahn1PLRFzgiLRv_!!2210715771824.jpg_.webp','img/O1CN017pJsbA1PLRG0Uk1UI_!!2210715771824.jpg_ (1).webp','img/O1CN017pJsbA1PLRG0Uk1UI_!!2210715771824.jpg_.webp',
]// 小图切换大图
const activeIndex = ref(0)
const enterHandler = (i) => {activeIndex.value = i
}// 获取鼠标相对位置
const target = ref(null)
const { elementX, elementY, isOutside } = useMouseInElement(target)// 控制滑块跟随鼠标移动(监听XY变化,变化则重新设计left/top)
const left = ref(0)
const top = ref(0)const positionX = ref(0)
const positionY = ref(0)
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}// 处理边界if (elementX.value < 100) {left.value = 0}if (elementX.value > 300) {left.value = 200}if (elementY.value < 100) {top.value = 0}if (elementY.value > 300) {top.value = 200}// 控制大图显示positionX.value = -left.value * 2positionY.value = -top.value * 2
})
</script><template><div class="goods-image"><!-- 左侧大图--><div class="middle" ref="target"><img :src="imageList[activeIndex]" alt="" /><!-- 蒙层小滑块 --><div class="layer" :style="{ left: `${left}px`, top: `${top}px` }"></div></div><!-- 小图列表 --><ul class="small"><liv-for="(img, i) in imageList":key="i"@mouseenter="enterHandler(i)":class="{ active: i === activeIndex }"><img :src="img" alt="" /></li></ul><!-- 放大镜大图 --><divclass="large":style="[{backgroundImage: `url(${imageList[activeIndex]})`,backgroundPositionX: `${positionX}px`,backgroundPositionY: `${positionY}px`,},]"v-show="!isOutside"></div></div>
</template><style scoped lang="scss">
.goods-image {width: 480px;height: 400px;position: relative;display: flex;.middle {width: 400px;height: 400px;background: #f5f5f5;}img {max-width: 100%;max-height: 100%;}.large {position: absolute;top: 0;left: 412px;width: 400px;height: 400px;z-index: 500;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);background-repeat: no-repeat;// 背景图:盒子的大小 = 2:1  控制背景图的移动实现放大的效果background-size: 800px 800px;background-color: #f8f8f8;}.layer {width: 200px;height: 200px;background: rgba(0, 0, 0, 0.2);// 绝对定位left: 0;top: 0;position: absolute;}.small {width: 80px;list-style: none;li {width: 68px;height: 68px;margin-left: 12px;margin-bottom: 15px;cursor: pointer;&:hover,&.active {border: 2px solid pink;}}}
}
* {box-sizing: border-box;
}
</style>
http://www.xdnf.cn/news/473293.html

相关文章:

  • SDC命令详解:使用get_pins命令进行查询
  • Vue.js---避免无限递归循环 调度执行
  • Weblogic SSRF漏洞复现(CVE-2014-4210)【vulhub靶场】
  • 黑马Java基础笔记-11
  • 深度学习之用CelebA_Spoof数据集搭建一个活体检测-训练好的模型用MNN来推理
  • Turbo C++
  • 数据驱动下的具身智能进化范式
  • 专项智能练习(定义判断)
  • 学习笔记:黑马程序员JavaWeb开发教程(2025.4.4)
  • threejs 大场景优化方案(代码层)
  • pycharm中qthread中的run函数debug不上的问题
  • 深度学习中的提示词优化:梯度下降全解析
  • 钉钉数据与金蝶云星空的无缝集成解决方案
  • mavgenerate 在 win11 下环境搭建注意问题
  • Kuberbetes-CA证书过期解决方案
  • linux系统中如何校准时间
  • windows、Ubuntu、Debian 添加静态路由
  • 从零开始学习PX4源码22(位置控制器---加速度部分理解)
  • MyBatis XML配置和入门使用
  • 论在中断中的标志变量使用volatile的重要性分析
  • 基于EtherCAT与ABP vNext 构建高可用、高性能的工业自动化平台
  • 双重差分模型学习笔记4(理论)
  • ip命令详解
  • HPC软件使用之ANSYS Fluent
  • Git-学习笔记(粗略版)
  • SpringBoot中的Lombok库
  • Python模块化编程
  • 俄罗斯方块算法
  • 2025年长三角+山东省赛+ 认证杯二阶段资料助攻说明
  • 简单网络交换、路由-华三MVRP