js 图片放大镜

news2024/9/29 19:27:51

请添加图片描述
写购物项目的时候,需要放大图片,这里用js写了一个方法,鼠标悬浮的时候放大当前图片

这个是class写法

<!--
 * @Descripttion: 
 * @Author: 苍狼一啸八荒惊
 * @LastEditTime: 2024-07-10 09:41:34
 * @LastEditors: 夜空苍狼啸
-->

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

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>商品详情</title>
  <!-- <link rel="stylesheet" href="./css/detail.css"> -->
  <style>
    .product_wrapper {
      width: 1200px;
      margin: 0 auto;
      font: 12px "Hiragino Sans GB", "Verdana", "Simsun";
      background-color: #fff;
    }


    .product_wrapper .detail {
      overflow: hidden;
    }

    .product_wrapper .detail .list_detail {
      width: 320px;
      height: 320px;
      float: left;
      padding: 0 20px 30px 0;
      position: relative;
    }

    .product_wrapper .detail .list_detail .list_detail_1 {
      width: 280px;
      height: 280px;
      position: relative;
    }

    .product_wrapper .detail .list_detail .list_detail_1>img {
      width: 100%;
      height: 100%;
    }

    .product_wrapper .detail .list_detail .list_detail_1 .mask {
      width: 150px;
      height: 150px;
      background: url(../img/zoom_pup.png);
      opacity: 0.5;
      position: absolute;
      left: 30px;
      top: 40px;
      pointer-events: none;
      display: none;
    }

    .product_wrapper .detail .list_detail .list_detail_2 {
      position: absolute;
      left: 0;
      bottom: 0;
      display: flex;
      justify-content: space-evenly;
      align-items: center;
    }

    .product_wrapper .detail .list_detail .list_detail_2>img {
      width: 54px;
      height: 54px;
      margin-right: 50px;
      cursor: pointer;
    }

    .product_wrapper .detail .list_detail .list_detail_2 .active {
      box-shadow: 0 0 8px rgb(255, 255, 255) inset, 0 0 8px red;
    }

    .product_wrapper .detail .list_detail .list_detail_enlarge {
      width: 480px;
      height: 480px;
      position: absolute;
      position: absolute;
      left: 90%;
      top: 0;
      overflow: hidden;
      display: none;
      z-index: 999;
    }

    .product_wrapper .detail .list_detail .list_detail_enlarge>img {
      display: block;
      width: 800px;
      height: 800px;
      position: absolute;
      left: 0;
      top: 0;
    }
  </style>
</head>

<body>


  <div class="product_wrapper">


    <div class="detail hover">
      <div class="list_detail" id="box">
        <!-- 放大镜 -->
        <div class="list_detail_1">
          <img src="./img/lx1.jpg" alt="">
          <div class="mask"></div>
        </div>
        <div class="list_detail_2">
          <img src="./img/lx1.jpg" class="active" alt="" data-show="./img/lx1.jpg" data-bg="./img/lx1.jpg">
          <img src="./img/lx2.jpg" alt="" data-show="./img/lx2.jpg" data-bg="./img/lx2.jpg">
          <img src="./img/lx3.jpg" alt="" data-show="./img/lx3.jpg" data-bg="./img/lx3.jpg">
        </div>
        <div class="list_detail_enlarge enlarge">
          <!-- <img src="./img/lx1.jpg" alt=""> -->
          <img src="http://img3m2.ddimg.cn/27/17/25583112-1_u_11.jpg" alt="">
        </div>


      </div>


    </div>
  </div>

  <!-- 引入放大镜 -->
  <!-- <script src="./js/detail.js"></script> -->
  <script>

    // 放大镜
    class Enlarge {
      constructor(select) {
        // 0-1. 获取到范围元素, 目的是为了让所有内容都出现在这里面
        this.ele = document.querySelector(select)
        this.show = this.ele.querySelector('.list_detail_1')
        this.mask = this.ele.querySelector('.mask')
        this.list = this.ele.querySelector('.list_detail_2')
        this.enlarge = this.ele.querySelector('.enlarge')
        this.bg = this.enlarge.firstElementChild
        // 需要一些尺寸数据
        this.show_w = this.show.clientWidth
        this.show_h = this.show.clientHeight
        // 非行内样式获取
        this.mask_w = parseInt(window.getComputedStyle(this.mask).width)
        this.mask_h = parseInt(window.getComputedStyle(this.mask).height)
        this.bg_w = parseInt(window.getComputedStyle(this.bg).width)
        this.bg_h = parseInt(window.getComputedStyle(this.bg).height)
        // 在这里调用函数来启动
        this.setScale()
        this.overOut()
        this.listChange()
        this.move()
      }
      // 计算数值
      setScale() {
        // 1. 计算数值
        this.enlarge_w = this.mask_w * this.bg_w / this.show_w
        this.enlarge_h = this.mask_h * this.bg_h / this.show_h

        // 2. 给 this.enlarge 赋值
        this.enlarge.style.width = this.enlarge_w + 'px'
        this.enlarge.style.height = this.enlarge_h + 'px'
      }
      // 鼠标经过显示遮罩层, 图片放大
      overOut() {
        this.show.addEventListener('mouseover', () => {
          this.mask.style.display = 'block'
          this.enlarge.style.display = 'block'
        })

        this.show.addEventListener('mouseout', () => {
          this.mask.style.display = 'none'
          this.enlarge.style.display = 'none'
        })
      }
      // tab 切换
      listChange() {
        this.list.addEventListener('click', e => {
          // 处理事件对象兼容
          e = e || window.event
          // 处理事件目标兼容
          const target = e.target || e.srcElement

          // 判断点击的是 img 标签
          if (target.nodeName !== 'IMG') return

          // 1. 切换 img 类名
          for (let i = 0; i < this.list.children.length; i++) {
            this.list.children[i].classList.remove('active')
          }
          target.classList.add('active')

          // 2. 切换 show里面img 和 bg 的 src
          const showUrl = target.dataset.show
          const bgUrl = target.dataset.bg

          this.show.firstElementChild.src = showUrl
          this.bg.src = bgUrl
        })
      }
      // 鼠标移动
      move() {
        // 1. 绑定事件
        this.show.addEventListener('mousemove', e => {
          e = e || window.event

          // 2. 获取光标坐标点
          let x = e.offsetX - this.mask_w / 2
          let y = e.offsetY - this.mask_h / 2

          // 3. 边界值判断
          if (x <= 0) x = 0
          if (y <= 0) y = 0
          if (x >= this.show_w - this.mask_w) x = this.show_w - this.mask_w
          if (y >= this.show_h - this.mask_h) y = this.show_h - this.mask_h

          this.mask.style.left = x + 'px'
          this.mask.style.top = y + 'px'

          const bg_x = x * this.enlarge_w / this.mask_w * -1
          const bg_y = y * this.enlarge_h / this.mask_h * -1

          this.bg.style.left = bg_x + 'px'
          this.bg.style.top = bg_y + 'px'
        })
      }
    }


    const enlarge = new Enlarge('#box')



  </script>

</body>

</html>

这个是函数写法

<!--
 * @Descripttion: 
 * @Author: 苍狼一啸八荒惊
 * @LastEditTime: 2024-07-10 09:41:34
 * @LastEditors: 夜空苍狼啸
-->

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

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>商品详情</title>
  <!-- <link rel="stylesheet" href="./css/detail.css"> -->
  <style>
    .product_wrapper {
      width: 1200px;
      margin: 0 auto;
      font: 12px "Hiragino Sans GB", "Verdana", "Simsun";
      background-color: #fff;
    }


    .product_wrapper .detail {
      overflow: hidden;
    }

    .product_wrapper .detail .list_detail {
      width: 320px;
      height: 320px;
      float: left;
      padding: 0 20px 30px 0;
      position: relative;
    }

    .product_wrapper .detail .list_detail .list_detail_1 {
      width: 280px;
      height: 280px;
      position: relative;
    }

    .product_wrapper .detail .list_detail .list_detail_1>img {
      width: 100%;
      height: 100%;
    }

    .product_wrapper .detail .list_detail .list_detail_1 .mask {
      width: 150px;
      height: 150px;
      background: url(../img/zoom_pup.png);
      opacity: 0.5;
      position: absolute;
      left: 30px;
      top: 40px;
      pointer-events: none;
      display: none;
    }

    .product_wrapper .detail .list_detail .list_detail_2 {
      position: absolute;
      left: 0;
      bottom: 0;
      display: flex;
      justify-content: space-evenly;
      align-items: center;
    }

    .product_wrapper .detail .list_detail .list_detail_2>img {
      width: 54px;
      height: 54px;
      margin-right: 50px;
      cursor: pointer;
    }

    .product_wrapper .detail .list_detail .list_detail_2 .active {
      box-shadow: 0 0 8px rgb(255, 255, 255) inset, 0 0 8px red;
    }

    .product_wrapper .detail .list_detail .list_detail_enlarge {
      width: 480px;
      height: 480px;
      position: absolute;
      position: absolute;
      left: 90%;
      top: 0;
      overflow: hidden;
      display: none;
      z-index: 999;
    }

    .product_wrapper .detail .list_detail .list_detail_enlarge>img {
      display: block;
      width: 800px;
      height: 800px;
      position: absolute;
      left: 0;
      top: 0;
    }
  </style>
</head>

<body>


  <div class="product_wrapper">


    <div class="detail hover">
      <div class="list_detail" id="box">
        <!-- 放大镜 -->
        <div class="list_detail_1">
          <img src="./img/lx1.jpg" alt="">
          <div class="mask"></div>
        </div>
        <div class="list_detail_2">
          <img src="./img/lx1.jpg" class="active" alt="" data-show="./img/lx1.jpg" data-bg="./img/lx1.jpg">
          <img src="./img/lx2.jpg" alt="" data-show="./img/lx2.jpg" data-bg="./img/lx2.jpg">
          <img src="./img/lx3.jpg" alt="" data-show="./img/lx3.jpg" data-bg="./img/lx3.jpg">
        </div>
        <div class="list_detail_enlarge enlarge">
          <img src="./img/lx1.jpg" alt="">
        </div>


      </div>


    </div>
  </div>

  <!-- 引入放大镜 -->
  <!-- <script src="./js/detail.js"></script> -->
  <script>
    /*
 * @Descripttion: 
 * @Author: 苍狼一啸八荒惊
 * @LastEditTime: 2024-07-10 10:18:57
 * @LastEditors: 夜空苍狼啸
 */

// 放大镜


// 0-1. 获取到范围元素, 目的是为了让所有内容都出现在这里面
let ele = document.querySelector('#box')
let show = ele.querySelector('.list_detail_1')
let mask = ele.querySelector('.mask')
let list = ele.querySelector('.list_detail_2')
let enlarge = ele.querySelector('.enlarge')
let bg = enlarge.firstElementChild
// 需要一些尺寸数据
let show_w = show.clientWidth
let show_h = show.clientHeight
// 非行内样式获取
let mask_w = parseInt(window.getComputedStyle(mask).width)
let mask_h = parseInt(window.getComputedStyle(mask).height)
let bg_w = parseInt(window.getComputedStyle(bg).width)
let bg_h = parseInt(window.getComputedStyle(bg).height)


// 计算数值
// 1. 计算数值
enlarge_w = mask_w * bg_w / show_w
enlarge_h = mask_h * bg_h / show_h

// 2. 给 enlarge 赋值
enlarge.style.width = enlarge_w + 'px'
enlarge.style.height = enlarge_h + 'px'

// 鼠标经过显示遮罩层, 图片放大

show.addEventListener('mouseover', () => {
    mask.style.display = 'block'
    enlarge.style.display = 'block'
})

show.addEventListener('mouseout', () => {
    mask.style.display = 'none'
    enlarge.style.display = 'none'
})

// tab 切换

list.addEventListener('click', e => {
    // 处理事件对象兼容
    e = e || window.event
    // 处理事件目标兼容
    const target = e.target || e.srcElement

    // 判断点击的是 img 标签
    if (target.nodeName !== 'IMG') return

    // 1. 切换 img 类名
    for (let i = 0; i < list.children.length; i++) {
        list.children[i].classList.remove('active')
    }
    target.classList.add('active')

    // 2. 切换 show里面img 和 bg 的 src
    const showUrl = target.dataset.show
    const bgUrl = target.dataset.bg

    show.firstElementChild.src = showUrl
    bg.src = bgUrl
})

// 鼠标移动

// 1. 绑定事件
show.addEventListener('mousemove', e => {
    e = e || window.event

    // 2. 获取光标坐标点
    let x = e.offsetX - mask_w / 2
    let y = e.offsetY - mask_h / 2

    // 3. 边界值判断
    if (x <= 0) x = 0
    if (y <= 0) y = 0
    if (x >= show_w - mask_w) x = show_w - mask_w
    if (y >= show_h - mask_h) y = show_h - mask_h

    mask.style.left = x + 'px'
    mask.style.top = y + 'px'

    const bg_x = x * enlarge_w / mask_w * -1
    const bg_y = y * enlarge_h / mask_h * -1

    bg.style.left = bg_x + 'px'
    bg.style.top = bg_y + 'px'
})







  </script>

</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1913632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IP 地址与 CDN 性能优化

内容分发网络&#xff08;CDN&#xff09;就是通过内容分配到离用户最优的服务器来提高访问速度。而IP地址如何分配与管理就是CND技术的基础。本文将来探讨介绍CDN中的IP地址分配与管理&#xff0c;以及如何通过CDN优化网络性能。 首先我们来了解CDN的基本原理 CDN是一种分布式…

数据库之DML

1&#xff0c;创建表 mysql> create table student(-> id int primary key,-> name varchar(20) not null,-> grade float-> );插入记录 mysql> insert into student values(1,monkey,98.5); Query OK, 1 row affected (0.01 sec)一次性插入多条记录 mysql…

百问网全志D1h开发板MIPI屏适配

MIPI屏适配 100ASK-D1-H_DualDisplay-DevKit V11 1. 显示适配 1.1 修改设备树 1.1.1 修改内核设备树 进入目录&#xff1a; cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4修改board.dts: &lcd0 {lcd_used <1>;lcd…

MP | 基于kmer的泛基因组分析方法及应用

2024年5月24日&#xff0c;中国农业大学分子设计育种前沿科学中心作物杂种优势与利用教育部重点实验室郭伟龙与姚颖垠团队在《Molecular Plant》发表了题为《A k-mer-based pangenome approach for cataloging seed-storage-protein genes in wheat to facilitate genotype-to-…

成都云飞浩容文化传媒有限公司怎么样?

在电商行业风起云涌的今天&#xff0c;成都云飞浩容文化传媒有限公司以其独特的视角和专业的服务&#xff0c;成为了这一领域的佼佼者。今天&#xff0c;就让我们一起走进云飞浩容&#xff0c;探索其背后的故事和成功的秘诀。 一、专注电商&#xff0c;用心服务 成都云飞浩容文…

HarmonyOS Next应用开发之系统概述

一、鸿蒙系统概述 鸿蒙系统可以分为华为鸿蒙系统&#xff08;HUAWEI HarmonyOS&#xff09;和开源鸿蒙系统&#xff08;OpenHarmony&#xff09;&#xff0c;华为鸿蒙系统是基于OpenHarmony基础之上开发的商业版操作系统。他们二者的关系可以用下图来表示&#xff1a; 1.1、…

翰德恩咨询赋能材料行业上市公司,共筑IPD管理体系新篇章

赋能背景概览 坐落于江苏的某材料行业领军企业&#xff0c;作为国内无机陶瓷膜元件及成套设备领域的佼佼者&#xff0c;以其庞大的生产规模、丰富的产品系列及卓越的研发实力&#xff0c;屹立行业之巅二十余年。公司不仅在新材料研发、技术创新、工艺设计、设备制造及整体解决…

智能眼镜火热发展 AI+AR或将成为主流趋势?

日前&#xff0c;The Verge 发布消息称&#xff0c;AI 智能音频眼镜 Ray-Ban Meta 的销量可能已突破 100 万。Meta 在博客中也指出&#xff0c;Ray-Ban Meta 取得了超预期的市场表现&#xff0c;眼镜的销售速度比生产速度还要快&#xff0c;目前团队正着手于推出更多新款式。Ra…

【ChatGPT 消费者偏好】第二弹:ChatGPT在日常生活中的使用—推文分享—2024-07-10

今天的推文主题还是【ChatGPT & 消费者偏好】 第一篇&#xff1a;哪些动机因素和技术特征的组合能够导致ChatGPT用户中高和低的持续使用意图。第二篇&#xff1a;用户对ChatGPT的互动性、性能期望、努力期望以及社会影响如何影响他们继续使用这些大型语言模型的意向&#x…

羊大师:暑期不“胖”秘籍:羊奶滋养,细嚼慢咽是关键!

夏日炎炎&#xff0c;假期悠长&#xff0c;如何在享受悠闲时光的同时&#xff0c;保持轻盈体态&#xff0c;成了许多人心中的小秘密。今天&#xff0c;就让我们一起揭秘暑期不“胖”的秘籍&#xff0c;让羊奶的滋养与细嚼慢咽的智慧&#xff0c;成为你美丽夏日的守护神。 羊奶轻…

python学习-类

Python是一门面向对象的编程语言&#xff0c;面向对象编程&#xff08;Object OrientedProgramming&#xff0c;OOP&#xff09;是一种编程思想&#xff0c;它把对象作为程序的基本单元&#xff0c;一个对象可以包裹相应的数据以及操作这些数据的函数。一切皆对象&#xff0c;所…

vscode-server安装和部分配置

文章目录 前言code-server安装rpm包安装tar.gz安装 vscode部分配置vscode配置函数跳转安装插件 vscode的structurevscode的hierarchy更改颜色主题 前言 vscode确实彳亍&#xff0c;虽然我觉得Clion(c/c语言版的IDEA)更方便&#xff0c;但是毕竟我没钱买license 这里记录一下网…

【Numpy】np.loadtxt 读取单行数据时报错。(零维数组)

np.loadtxt 读取单行数据时遇到了报错 代码&#xff1a; import numpy as nplabelPath"./name.names" names np.loadtxt(labelPath, dtypestr)print(names[0])names中的数据&#xff1a; 报错&#xff1a; IndexError: too many indices for array: array is 0-…

标准立项 | 深度脱氨生物填料选型指南

编制单位&#xff1a;北京科净源科技股份有限公司、中国地质大学(北京)、中华环保联合会水环境治理专业委员会、清华大学、北京师范大学、中国环境科学研究院、清华大学、天津高端装备研究院、中车环境科技有限公司、云南滇池水务股份有限公司等。

arm环境安装达梦数据库

作者&#xff1a;振鹭 一、安装前准备 1、创建用户和用户组 groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba2、修改文件打开最大数 vi /etc/security/limits.conf #文件末尾添加以下四行 dmdba hard nofile 65536 dmdba soft nofile 65536 d…

图片批量重命名bat,一个脚本快速搞定图片批量重命名

BAT 批处理 是一种在 Microsoft Windows 操作系统中使用的脚本语言&#xff0c;用于自动执行一系列预定义的命令或任务。这些命令集合通常存储在一个文本文件中&#xff0c;文件扩展名为 .bat 或 .cmd。批处理脚本可以包含简单的命令&#xff0c;如文件复制、移动、删除&#x…

OpenShift3.11 社区版搭建

一、资源规划 HostnameIPOSCPUMemDiskmaster192.168.78.131CentOS7.92vCPU4G60Gnode1192.168.78.132CentOS7.92vCPU4G60Gnode2192.168.78.133CentOS7.92vCPU4G60G 二、安装过程&#xff1a; 2.1 前期配置 开启所有节点的 SELinux &#xff08;所有主机执行&#xff09; gr…

30斤的东西寄什么快递便宜?寄大货物品用哪家快递公司?

作为一个大学生&#xff0c;搬迁宿舍、放假回家时&#xff0c;总有一些物品需要寄送。对于30斤左右的物品来说&#xff0c;选择合适的快递公司和打包方式可以大大节省费用。今天&#xff0c;我就来给大家分享一些省钱寄快递的方法和技巧&#xff0c;希望能帮到你们。云木寄快递…

【独家揭秘】视频号矩阵系统火爆上线,一键式多平台管理,你的内容营销神器!

在信息爆炸的时代&#xff0c;内容创作者们面临着前所未有的挑战与机遇。如何让自己的内容在众多平台中脱颖而出&#xff0c;快速传播并吸引大量观众&#xff0c;成为了每个创作者关注的焦点。近日&#xff0c;一款名为“迅狐视频号矩阵系统”的神器震撼来袭&#xff0c;它以其…

SpringBoot开发实用篇(三)

一&#xff1a;任务 1&#xff1a;SpringBoot整合Quartz 导入SpringBoot整合quartz的坐标定义具体要执行的任务&#xff0c;继承QuartzJobBean定义工作明细和触发器&#xff0c;并绑定对应关系 2&#xff1a;SpringBoot整合task 开启定时任务功能设置定时执行的任务&#x…