html实现商品图片放大镜,html图片放大镜预览

效果

在这里插入图片描述

实现

复制粘贴,修改图片路径即可使用

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title>商品图片放大镜</title>
	</head>
	<style>
		body {
			margin: 0;
			padding: 0;
		}
		
		#app {
			padding: 10px;
			position: relative;
		}
		/** 默认图片*/
		
		.img-box {
			position: relative;
			left: 10px;
			top: 150px;
			width: 300px;
			height: 300px;
			text-align: center;
			border: 1px solid #83b4ff;
			border-radius: 4px;
			overflow: hidden;
			cursor: zoom-in;
		}
		
		.img1 {
			width: 100%;
			height: 100%;
		}
		
		.img-select {
			width: 100px;
			height: 100px;
			position: absolute;
			left: 0;
			top: 0;
			background: #00ff6633;
			border-radius: 4px;
			display: none;
		}
		/** 临时放大图片*/
		
		.img-temp-box {
			position: absolute;
			left: 0;
			top: 0;
			width: 400px;
			height: 400px;
			display: none;
			overflow: hidden;
		}
		
		.img2 {
			width: 200%;
			height: 200%;
			position: absolute;
			left: 0;
			top: 0;
		}
	</style>

	<body>
		<div id="app">
			<div class="img-box">
				<img src="image/2.jpeg" class="img1" />
				<div class="img-select"></div>
			</div>
		</div>
		<!-- 一般放置最外边-->
		<div class="img-temp-box">
			<img src="" class="img2" />
		</div>
	</body>
	<script>
		/**
		 * @author yyq
		 * @blogger myf
		 */
		var imgBox = document.querySelector('.img-box');
		var imgSelect = document.querySelector('.img-select');
		var imgTempBox = document.querySelector('.img-temp-box');
		var img1 = document.querySelector('.img1');
		var img2 = document.querySelector('.img2');

		// 鼠标移入
		imgBox.onmouseenter = function() {
			imgSelect.style.display = 'block';
			imgTempBox.style.display = 'block';
			var img = getElementOffset(imgBox);
			imgTempBox.style.left = (img.left + 400) + "px";
			imgTempBox.style.top = (img.top - 50) + "px";
			img2.src = img1.src;
			console.log("移入")
		}

		// 鼠标移除
		imgBox.onmouseleave = function() {
			imgSelect.style.display = 'none';
			imgTempBox.style.display = 'none';
			console.log("移除")
		}

		// 鼠标放上
		imgBox.onmousemove = function() {

			var img = getElementOffset(imgBox);

			var x = event.clientX - img.left;
			var y = event.clientY - img.top;

			console.log("xy轴:", x, '-----', y);

			var imgSelectX = x - imgSelect.offsetWidth / 2
			var imgSelectY = y - imgSelect.offsetHeight / 2

			if(imgSelectX < 0) {
				imgSelectX = 0;
			} else if(imgSelectX > imgBox.offsetWidth - imgSelect.offsetWidth) {
				imgSelectX = imgBox.offsetWidth - imgSelect.offsetWidth
			}

			if(imgSelectY < 0) {
				imgSelectY = 0;
			} else if(imgSelectY > imgBox.offsetHeight - imgSelect.offsetHeight) {
				imgSelectY = imgBox.offsetHeight - imgSelect.offsetHeight
			}

			// 小图里的小框
			imgSelect.style.left = imgSelectX + 'px';
			imgSelect.style.top = imgSelectY + 'px';

			var b = (img2.offsetHeight - imgTempBox.offsetHeight) / (imgBox.offsetHeight - imgSelect.offsetHeight)

			// 临时框里的大图片
			img2.style.left = -imgSelectX * b + "px"
			img2.style.top = -imgSelectY * b + "px"

		}

		/**
		 * 返回元素距离浏览器边框的位置(防止元素位置被父级限制)
		 * @param {Object} element
		 */
		function getElementOffset(element) {    
			var left = element.offsetLeft; // 当前元素左边距
			var top = element.offsetTop; // 当前元素上边距
			var parent = element.offsetParent; // 当前元素的父级元素
			while(parent !== null) {      
				left += parent.offsetLeft; // 累加左边距
				top += parent.offsetTop; // 累加上边距
				parent = parent.offsetParent; // 依次获取父元素
			}
			return {
				'left': left,
				'top': top
			};  
		}
	</script>

</html>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java反射机制详解与使用方法大全!!!

❤ 作者主页&#xff1a;李奕赫揍小邰的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是李奕赫&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习!!!&#x1f389;&#x1f389; 文章目录 Java反射机制…

c++中的继承

文章目录 1.继承的概念及定义1.1继承的概念1.2继承的定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6.继承与静态成员7.复杂的菱形继承及菱形虚拟继承 1.继承的概…

【深度学习注意力机制系列】—— SKNet注意力机制(附pytorch实现)

SKNet&#xff08;Selective Kernel Network&#xff09;是一种用于图像分类和目标检测任务的深度神经网络架构&#xff0c;其核心创新是引入了选择性的多尺度卷积核&#xff08;Selective Kernel&#xff09;以及一种新颖的注意力机制&#xff0c;从而在不增加网络复杂性的情况…

opencv基础53-图像轮廓06-判断像素点与轮廓的关系(轮廓内,轮廓上,轮廓外)cv2.pointPolygonTest()

点到轮廓的距离 在 OpenCV 中&#xff0c;函数 cv2.pointPolygonTest()被用来计算点到多边形&#xff08;轮廓&#xff09;的最短距离&#xff08;也 就是垂线距离&#xff09;&#xff0c;这个计算过程又称点和多边形的关系测试。该函数的语法格式为&#xff1a; retval cv2…

Linux —— 基础I/O

一&#xff0c;背景介绍 狭义的文件存放在磁盘上&#xff0c;广义上在Linux下一切皆文件&#xff1b;磁盘上的文件一般为永久存储的外设&#xff0c;本质上对文件的操作&#xff0c;即为对外设的输入和输出&#xff08;简称I/O&#xff09;&#xff1b;空文件并不是不占磁盘文件…

uC-OS2 V2.93 STM32L476 移植:串口打印篇

前言 前几篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程&#xff0c;下载了 uC-OS2 V2.93 的源码&#xff0c;并把 uC-OS2 的源文件加入 Keil MDK5 工程&#xff0c;通过适配 Systick 系统定时器与 PendSV 实现任务调度&#xff0c;初步让 uC-OS2 …

Facebook商城号最全解析,Facebook Marketplace运营技巧

相信许多做跨境的小伙伴都听说过Facebook商城号。其实所谓的商城并不是Facebook Shop&#xff0c;而是指Facebook Marketplace&#xff0c;它不像前者需要各类入驻条件&#xff0c;只要拥有facebook账号而且所在地区有能够使用marketplace就可以在上面进行商品售卖。这种低成本…

validator入门

validator中文文档地址和英文地址 https://docs.jboss.org/hibernate/validator/4.2/reference/zh-CN/html/validator-gettingstarted.html https://docs.jboss.org/hibernate/validator/6.0/reference/en-US/html_single/#preface自定义hibernate-validator校验 工具类Valid…

设计模式(4)装饰模式

一、介绍&#xff1a; 1、应用场景&#xff1a;把所需的功能按正确的顺序串联起来进行控制。动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰模式比生成子类更加灵活。 当需要给一个现有类添加附加职责&#xff0c;而又不能采用生成子类的方法…

谷歌关闭跨域限制.(生成一个开发浏览器),Chrome关闭跨域

(一)、首先找到浏览器在电脑磁盘中的位置,并复制 (二)、复制一个浏览器的快捷方式到桌面(不影响正常浏览器) (三)、chrom鼠标右键属性&#xff0c;修改快捷方式的目标 &#xff08;四&#xff09;chrome.exe 后面添加 --disable-web-security --user-data-dir 复制的Chrome浏览…

力扣hot100刷题记录

二刷hot100&#xff0c;坚持每天打卡&#xff01;&#xff01;&#xff01;Today&#xff1a;2023-8-10 1. 两数之和 // 先求差&#xff0c;再查哈希表 public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map new HashMap<>();for(int i 0;i&…

窥探系列之Mybatis-plus XML分页查询

mybatisPlus分页查总数 Page类在mybatisPlus中用于分页查询&#xff0c;继承Pagination类&#xff0c;Pagination类的searchCount字段控制是否查询总记录数 顺着看哪里用到了searchCount&#xff1a; com.baomidou.mybatisplus.plugins.PaginationInterceptor 是mybatisPlus…

安防监控视频汇聚EasyCVR平台的FLV视频流在VLC中无法播放的原因排查

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…

PyTorch 微调终极指南:第 2 部分 — 提高模型准确性

一、说明 如今&#xff0c;在训练深度学习模型时&#xff0c;通过在自己的数据上微调预训练模型来迁移学习已成为首选方法。通过微调这些模型&#xff0c;我们可以利用他们的专业知识并使其适应我们的特定任务&#xff0c;从而节省宝贵的时间和计算资源。本文分为四个部分&…

如何使用 AT+WEBSERVER 指令实现自定义的 Webserver html 网页配网

开启 AT 固件中的 Webserver 指令和 FS 指令支持 乐鑫官网发布的默认通用 AT 固件不支持 webserver 配网功能&#xff0c; 需要用户自己搭建 esp-at 环境&#xff0c;并在 sdkconfig 中开启 webserver AT 指令 和 FS 指令的支持&#xff0c; 如下图所示&#xff1a; 测试 AT 固…

Elasticsearch 与 OpenSearch:揭开性能差距

作者&#xff1a;George Kobar, Ugo Sangiorgi 对于任何依赖快速、准确搜索数据的组织来说&#xff0c;强大、快速且高效的搜索引擎是至关重要的元素。 对于开发人员和架构师来说&#xff0c;选择正确的搜索平台可以极大地影响你的组织提供快速且相关结果的能力。 在我们全面的…

oracle积累增量和差异增量

积累增量和差异增量&#xff1a; 对于 RMAN 来说&#xff0c;积累增量备份和差异增量备份都是增量备份的一种形式&#xff0c;它们之间的区别在于备份的范围和备份集的方式。 积累增量备份&#xff1a;在进行积累增量备份时&#xff0c;RMAN 会备份自最后一次完全备份或增量备…

FPGA外部触发信号毛刺产生及滤波

1、背景 最近在某个项目中&#xff0c;遇到输入给FPGA管脚的外部触发信号因为有毛刺产生&#xff0c;导致FPGA接收到的外部触发信号数量多于实际值。比如&#xff1a;用某个信号源产生1000个外部触发信号&#xff08;上升沿触发方式&#xff09;给到FPGA输入IO&#xff0c;实际…

PCI 简易通讯控制器有黄色感叹号

一、问题描述 设备管理器中&#xff0c;其他设备中显示 “PCI 简易通讯控制器”驱动未安装&#xff0c;显示黄色感叹号&#xff1a; 二、原因分析 右键该驱动&#xff0c;查看属性ID&#xff0c;显示为&#xff1a; PCI \ VEN_8086&#xff06;DEV_1C3A&#xff06;SUBSYS…

14.3.4 【Linux】使用 LVM thin Volume 让 LVM 动态自动调整磁盘使用率

想像一个情况&#xff0c;你有个目录未来会使用到大约 5T 的容量&#xff0c;但是目前你的磁盘仅有 3T&#xff0c;问题是&#xff0c;接下来的两个月你的系统都还不会超过 3T 的容量&#xff0c; 不过你想要让用户知道&#xff0c;就是他最多有 5T 可以使用就是了&#xff01;…