返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue模仿实现京东商品大图放大镜效果
  • 342
分享到

Vue模仿实现京东商品大图放大镜效果

Vue放大镜效果Vue模仿京东放大镜 2022-12-27 15:12:31 342人浏览 八月长安
摘要

效果如下: 首先,有一个放大镜的DOM结构 <template> <div class="spec-preview"> <!-- 展示的原

效果如下:

首先,有一个放大镜的DOM结构

<template>
  <div class="spec-preview">
    <!-- 展示的原图 -->
    <img :src="imGobj.imgUrl" />
    <!-- 绑定触发 -->
    <div class="event"></div>
    <!-- 放大图 -->
    <div class="big">
      <img :src="imgObj.imgUrl" />
    </div>
    <!-- 遮罩层 -->
    <div class="mask"></div>
  </div>
</template>

这里img的src是通过父组件传过来的imgList来展示的,可以换成自己的任意图

交代一下:遮罩层和展示图都是正方形的,而且遮罩层的宽高都是展示图的一半

分别要绑定鼠标移动事件,和获取两个元素节点,分别是遮罩层和放大图

<template>
  <div class="spec-preview">
    <img :src="imgObj.imgUrl" />
    <div class="event" @mousemove="handler"></div>
    <div class="big">
      <img :src="imgObj.imgUrl" ref="big" />
    </div>
    <!-- 遮罩层 -->
    <div class="mask" ref="mask"></div>
  </div>
</template>

vue3中如何获得ref绑定的节点元素呢?

首先,要知道在Vue2中获取ref节点元素是很简单的,只需要this.$refs.mask即可。但是vue3中是没有this.$refs的。

<script>
import { computed, getCurrentInstance, onMounted, ref } from "vue";
export default {
  name: "ZoomIndex",
  props: ["skuImageList"],
  setup(props) {
    let mask = ref(null);
    let big = ref(null);
    function handler(event) {
     let handlerMask = mask.value;
     let handlerBig = big.value;
    }
    return {
      handler,
      mask,
      big,
    };
  },
};
</script>

为了结构清楚,我把其他不涉及这个案例的代码都删掉了。handlerMask和handlerBig就是我们想要获取的节点。

获取到节点后,就可以写相应的放大器实现代码了

首先要获取event的offserX也就是我们鼠标距离左侧边框的距离 ,然后还需要减去遮罩层本身宽度的一半,高度同理。并且添加约束条件,让这个遮罩层不能出展示区域。最后就只需要修改相应元素的left和top属性即可了(当然,这里肯定是要用到绝对定位的,子绝父相)

function handler(event) {
      let handlerMask = mask.value;
      let left = event.offsetX - handlerMask.offsetWidth / 2;
      let top = event.offsetY - handlerMask.offsetHeight / 2;
      // 约束范围
      if (left <= 0) left = 0;
      if (left >= handlerMask.offsetWidth) left = handlerMask.offsetWidth;
      if (top <= 0) top = 0;
      if (top >= handlerMask.offsetHeight) top = handlerMask.offsetHeight;
      // 修改元素的left|top属性值
      handlerMask.style.left = left + "px";
      handlerMask.style.top = top + "px";
      // 修改放大图
      let handlerBig = big.value;
      handlerBig.style.left = -2 * left + "px";
      handlerBig.style.top = -2 * top + "px";
    }

这里稍微有疑惑的可能就是放大图为什么是-2去相乘。 首先根据前面的介绍,我们的展示图和放大图的大小是一致的,都是正方形。而遮罩层的宽高都是其一半。所以要把相应的遮罩层的图片放大,就是简单的乘以2即可。那为什么是负数。这就是涉及到放大图的移动方向了。我们遮罩层向左移动,起始放大图是相应的向右移动的。

.event {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 998;
  }
  .mask {
    width: 50%;
    height: 50%;
    background-color: rgba(0, 255, 0, 0.3);
    position: absolute;
    left: 0;
    top: 0;
    display: none;
  }
  .big {
    width: 100%;
    height: 100%;
    position: absolute;
    top: -1px;
    left: 100%;
    border: 1px solid #aaa;
    overflow: hidden;
    z-index: 998;
    display: none;
    background: white;
 }
 img {
      width: 200%;
      max-width: 200%;
      height: 200%;
      position: absolute;
      left: 0;
      top: 0;
    }

根据上面的展示(我把big里面的overflow:hidden去掉后的),可以看到,其实图片的大小的是展示图和放大镜大小的2倍,超出部分是隐藏的。也就是向着相反的方向移动,使得我们遮罩层的区域放大后正好在放大镜的展示区域中。

完整代码如下:

<template>
  <div class="spec-preview">
    <img :src="imgObj.imgUrl" />
    <div class="event" @mousemove="handler"></div>
    <div class="big">
      <img :src="imgObj.imgUrl" ref="big" />
    </div>
    <!-- 遮罩层 -->
    <div class="mask" ref="mask"></div>
  </div>
</template>
<script>
import { computed, getCurrentInstance, onMounted, ref } from "vue";
export default {
  name: "ZoomIndex",
  props: ["skuImageList"],
  setup(props) {
    const internalInstance = getCurrentInstance(); //当前组件实例
    const $bus = internalInstance.appContext.config.globalProperties.$bus;
    // console.log(props);
    let currentIndex = ref(0);
    let mask = ref(null);
    let big = ref(null);
    let imgObj = computed({
      get() {
        return props.skuImageList[currentIndex.value] || {};
      },
    });
    function handler(event) {
      let handlerMask = mask.value;
      let left = event.offsetX - handlerMask.offsetWidth / 2;
      let top = event.offsetY - handlerMask.offsetHeight / 2;
      // 约束范围
      if (left <= 0) left = 0;
      if (left >= handlerMask.offsetWidth) left = handlerMask.offsetWidth;
      if (top <= 0) top = 0;
      if (top >= handlerMask.offsetHeight) top = handlerMask.offsetHeight;
      // 修改元素的left|top属性值
      handlerMask.style.left = left + "px";
      handlerMask.style.top = top + "px";
      // 修改放大图
      let handlerBig = big.value;
      handlerBig.style.left = -2 * left + "px";
      handlerBig.style.top = -2 * top + "px";
    }
    onMounted(() => {
      // 全局事件总线,获取兄弟组件传递过来的索引值
      $bus.on("getIndex", (index) => {
        // 修改当前响应式数据
        currentIndex.value = index.value;
      });
    });
    return {
      currentIndex,
      imgObj,
      handler,
      mask,
      big,
    };
  },
};
</script>
<style lang="less">
.spec-preview {
  position: relative;
  width: 400px;
  height: 400px;
  border: 1px solid #ccc;
  img {
    width: 100%;
    height: 100%;
  }
  .event {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 998;
  }
  .mask {
    width: 50%;
    height: 50%;
    background-color: rgba(0, 255, 0, 0.3);
    position: absolute;
    left: 0;
    top: 0;
    display: none;
  }
  .big {
    width: 100%;
    height: 100%;
    position: absolute;
    top: -1px;
    left: 100%;
    border: 1px solid #aaa;
    // overflow: hidden;
    z-index: 998;
    display: none;
    background: white;
    img {
      width: 200%;
      max-width: 200%;
      height: 200%;
      position: absolute;
      left: 0;
      top: 0;
    }
  }
  .event:hover ~ .mask,
  .event:hover ~ .big {
    display: block;
  }
}
</style>

到此这篇关于Vue模仿实现京东商品大图放大镜效果的文章就介绍到这了,更多相关Vue放大镜效果内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue模仿实现京东商品大图放大镜效果

本文链接: https://lsjlt.com/news/175961.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue模仿实现京东商品大图放大镜效果
    效果如下: 首先,有一个放大镜的DOM结构 <template> <div class="spec-preview"> <!-- 展示的原...
    99+
    2022-12-27
    Vue放大镜效果 Vue模仿京东放大镜
  • JavaScript仿京东放大镜效果
    本文实例为大家分享了JavaScript实现京东放大镜效果的具体代码,供大家参考,具体内容如下 案例分析 整个案例可以分为三个功能模块 鼠标经过小图片盒子, 黄色的...
    99+
    2024-04-02
  • 利用JavaScript实现仿京东放大镜效果
    功能实现 1、鼠标经过小图片盒子,黄色的遮挡层和大图片显示,离开时就隐藏2个盒子功能 2、黄色遮挡层跟着鼠标走 把鼠标的坐标给盒子,不断地进行赋值操作 把鼠标地坐标给遮挡层不合适,因...
    99+
    2024-04-02
  • Vue实现商品放大镜效果
    本文实例为大家分享了Vue实现商品放大镜效果的具体代码,供大家参考,具体内容如下 一、前言 在这个鼎盛的电商时代各种直播带货或者自主逛宝购物,我们对商品的认知和了解进一步查看详情,发...
    99+
    2024-04-02
  • JS实现京东放大镜效果
    本文实例为大家分享了JS实现京东放大镜效果的具体代码,供大家参考,具体内容如下 需要实现的效果图如下: ①布局:布局采用一个大盒子里面首先分为上下两个部分,然后下部分又分为左右两个...
    99+
    2024-04-02
  • JavaScript仿京东放大镜特效
    本文实例为大家分享了JavaScript仿京东放大镜的具体代码,供大家参考,具体内容如下 功能需求: 1、分为三个模块 2、鼠标经过小图片盒子,黄色的遮挡层和大图片盒子显示,离开隐藏...
    99+
    2024-04-02
  • 怎么用JavaScript仿京东放大镜效果
    本篇内容介绍了“怎么用JavaScript仿京东放大镜效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体内容如下案例分析整个案例可以分为...
    99+
    2023-06-25
  • 如何利用JavaScript实现仿京东放大镜效果
    这篇文章主要介绍如何利用JavaScript实现仿京东放大镜效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!功能实现鼠标经过小图片盒子,黄色的遮挡层和大图片显示,离开时就隐藏2个盒子功能黄色遮挡层跟着鼠标走把鼠标的...
    99+
    2023-06-29
  • js如何实现仿京东放大镜
    这篇文章主要介绍“js如何实现仿京东放大镜”,在日常操作中,相信很多人在js如何实现仿京东放大镜问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js如何实现仿京东放大镜”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-02
  • JavaScript实现商品放大镜效果
    本文实例为大家分享了JavaScript实现商品放大镜的具体代码,供大家参考,具体内容如下 HTML+CSS部分: <style> .small{ ...
    99+
    2024-04-02
  • Javascript如何模拟京东放大镜效果
    这篇文章将为大家详细讲解有关Javascript如何模拟京东放大镜效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码如下:<html> <head&...
    99+
    2024-04-02
  • vue3封装京东商品详情页放大镜效果组件
    本文实例为大家分享了vue3封装类似京东商品详情页放大镜效果组件的具体代码,供大家参考,具体内容如下 首先先完成基本布局 完成图片的切换效果,通过 mouseenter 事件切...
    99+
    2024-04-02
  • Vue实现电商网站商品放大镜效果示例
    目录效果图各部分代码总结效果图 各部分代码 HTML部分 <div id="goodsPics"> <!--当前查看商品图区域-->...
    99+
    2022-11-13
    Vue 网站商品放大镜 Vue 放大镜
  • jQuery实现天猫商品放大镜效果
    本文实例为大家分享了jQuery实现天猫商品放大镜效果的具体代码,供大家参考,具体内容如下 思路: 1、分四部分:产品主图,用来定位的小框,放大图,和产品不同侧面的小图2、定位的小框...
    99+
    2024-04-02
  • js模拟实现京东详情页图片放大效果
    本文实例为大家分享了js实现京东详情页图片放大的具体代码,供大家参考,具体内容如下 效果: html: <div class="preview_img"> <...
    99+
    2024-04-02
  • js怎么模拟实现淘宝网商品放大镜效果
    小编给大家分享一下js怎么模拟实现淘宝网商品放大镜效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图:(实例图片由自己添加...
    99+
    2024-04-02
  • 原生js如何实现商品放大镜效果
    这篇文章将为大家详细讲解有关原生js如何实现商品放大镜效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现原理大图上的放大镜:小图的显示区域=大图片大小:小图片大小=大...
    99+
    2024-04-02
  • js实现购物网站商品放大镜效果
    本文实例为大家分享了js实现购物网站商品放大镜效果的具体代码,供大家参考,具体内容如下 首先说一下原理,以天猫某商品放大镜效果为例: 所谓的放大镜效果,其实也是欺骗我们眼球的一种效...
    99+
    2024-04-02
  • jQuery如何实现天猫商品放大镜效果
    这篇“jQuery如何实现天猫商品放大镜效果”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“jQuery如何实现天猫商品放大镜...
    99+
    2023-06-29
  • vue如何实现放大镜效果
    这篇文章主要为大家展示了“vue如何实现放大镜效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现放大镜效果”这篇文章吧。组件使用less,请确保已...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作