首页 > 其他分享 >原生js模拟电商详情页图片放大的效果

原生js模拟电商详情页图片放大的效果

时间:2024-03-29 15:58:14浏览次数:28  
标签:const img mask js nx ny 详情页 电商 view

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta
    name="viewport"
    content="width=device-width, initial-scale=1.0"
  >
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }


    .box {
      position: relative;
      width: 300px;
      height: 300px;
      margin: 40px 0 0 40px;
      user-select: none;

      img {
        width: inherit;
        height: inherit;
      }

      .mask {
        position: absolute;
        z-index: 3;
        width: 100px;
        height: 100px;
        background-color: rgba(255, 255, 0, .6);
        top: 0;
        left: 0;
        opacity: 0;
        transition: opacity .28s;
      }

      .view {
        position: fixed;
        width: 840px;
        height: 840px;
        top: 40px;
        left: 500px;
        z-index: 1;
        overflow: hidden;
        opacity: 0;
        transition: opacity .28s;

        img {
          position: absolute;
          left: 0;
          top: 0;
          width: 2520px;
          height: 2520px;
        }
      }
    }

    .box:hover {

      .mask,
      .view {
        opacity: 1;
      }
    }
  </style>
</head>

<body>
  <div class="box">
    <img src="./1v1.jpg" />
    <div class="mask"></div>

    <div class="view">
      <img src="./1v1.jpg" />
    </div>
  </div>

  <script>
    const box = document.querySelector('.box')
    const view = document.querySelector('.view')
    const mask = document.querySelector('.mask')
    const img = document.querySelector('.view img')

    // 初始鼠标位置
    let x1 = 0
    let y1 = 0
    // 初始偏移量
    let offsetX = 0
    let offsetY = 0
    // 这里有个限制条件是
    // -- >左边mask和显示的图比例是1:3
    // --> 右边view 和 最大的 img 的比例也是1: 3
    // mask最大移动距离
    const maxX = box.clientWidth - mask.clientWidth
    const maxY = box.clientHeight - mask.clientHeight
    // 右边的大图最大移动距离
    const imgX = img.clientWidth - view.clientWidth
    const imgY = img.clientHeight - view.clientHeight
    function handleMove(ev) {
      // 拿到新的坐标
      const x2 = ev.pageX
      const y2 = ev.pageY
      let nx = x2 - x1 + offsetX
      let ny = y2 - y1 + offsetY
      // 边界控制
      nx = nx < 0 ? 0 : nx
      nx = nx > maxX ? maxX : nx
      ny = ny < 0 ? 0 : ny
      ny = ny > maxY ? maxY : ny
      mask.style = `top: ${ny}px;left: ${nx}px;`
      // 赋值右边的大图
      // 计算小图移动占比
      const proportionX = -nx / maxX * imgX
      const proportionY = -ny / maxY * imgX
      img.style = `top: ${proportionY}px; left: ${proportionX}px`
    }

    mask.addEventListener('mousedown', ev => {
      x1 = ev.pageX
      y1 = ev.pageY
      offsetX = mask.offsetLeft
      offsetY = mask.offsetTop
      // 监听鼠标移动事件
      mask.addEventListener('mousemove', handleMove)
    })

    // 这里一定是document,如果是mask,渲染不及时会出现事件移除不掉的情况
    document.addEventListener('mouseup', () => {
      mask.removeEventListener('mousemove', handleMove)
    })

  </script>
</body>

</html>

 

 

原图奉上

 

标签:const,img,mask,js,nx,ny,详情页,电商,view
From: https://www.cnblogs.com/fmg0224/p/18103997

相关文章

  • 解决:NuxtJS项目 ,刷新localhost:3000/product/details/111页面的时候useFetch不工作!
    背景在nuxt项目中,点击产品列表跳转到详情页是正常的,路径为:localhost:3000/product/device?id=111但是对着浏览器刷新之后,发现不在执行请求了。要解决问题:刷新浏览器之后正常展示产品内容。   目录层级|pages|product|device.vue|......
  • 超级实用JS
    1.千分位//js数字每三位加逗号(千分位格式)美元格式3位一个逗号  handleUs(val){   //eg:2536995--->2,536,995爽得一匹   returnval.toLocaleString()  },// toLocaleString()还可以将数字转为百分比eg:vara=1;console.log(a.toLocaleStri......
  • Node.js毕业设计航空订票系统(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着航空业的迅速发展,越来越多的人选择飞机作为出行的主要交通方式。航空订票系统作为航空公司与旅客之间的桥梁,其重要性不言而喻。一个好的航空订票系统能......
  • Node.js毕业设计航空订票系统(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的不断发展,人们的生活越来越离不开网络。航空订票系统作为在线旅游行业的重要组成部分,为用户提供了便捷的航班查询、预订、支付等服务。传统......
  • 2024-03-29 js练习之生成多个数组,且每个数组内的值不能重复
    代码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>doubleBox</t......
  • SiC B2B2C Shop平台型电商系统
    B2B2CShop介绍SiCB2B2CShop 是一个B2B2C平台型电商系统,专注于通用电商解决方案。可帮助企业搭建自己的交易平台。交易模式:零售、批发、采购。SiCShop是一个B2B2C平台型电商系统,专注于通用电商解决方案,可帮助企业搭建自己的交易平台。可访问PC端演示站点,了解功能。可安装......
  • js的Date对象
    文章目录1.概念2.创建时间对象2.1.方式一2.2.方式二2.3.方式三2.4.使用场景3.获取年月日4.获取时分秒5.获取毫秒值6.封装获取当前时间函数1.概念Date对象用于处理日期与时间。2.创建时间对象2.1.方式一使用无参构造,创建出来的就是当前的时间对象。......
  • 【全开源】JAVA多商户运营版商城系统源码地摊兄源码多商户源码社交电商源码支持Androi
    "多商户运营版商城系统源码——地摊兄源码多商户源码社交电商源码",是现今电商领域的一大突破。此源码设计独特,功能全面,既满足了多商户运营的需求,又融入了社交电商的理念。通过这套源码,商家可以轻松搭建起一个功能强大的电商平台,实现多商户的集中管理与运营,提升整体运营效率和用......
  • 【前端面试题-20】js如何对输出内容进行HTML编码
    在JavaScript中,对输出内容进行HTML编码通常是为了防止XSS攻击(跨站脚本攻击),即将特殊字符转换成HTML实体的形式,避免它们被浏览器解析为HTML或JavaScript代码。以下是一些常见的HTML编码方法:使用内建函数encodeURIComponent()和encodeURI()虽然这两个函数主要用于编码URI......
  • JSP与JavaBean 《Java Web开发从入门到实战》第五章节
    编写JavaBean1JavaBean特点可重用升级方便不依赖于平台JavaBean分类业务bean封装业务逻辑、数据库操作等数据bean封装数据让JSP引擎(如Tomcat)知道一个bean的属性和方法类的成员变量要有setXXX方法(获取属性)和getXXX方法(更改属性)对于boolean类型的成员变量,允许......