Web开发 —— 放大镜效果(HTML、CSS、JavaScript)

目录

一、需求描述

二、实现效果

三、完整代码

四、实现过程

1、HTML 页面结构

2、CSS 元素样式

3、JavaScript动态控制

(1)获取元素

(2)控制大图和遮罩层的显隐性

(3)遮罩层跟随鼠标移动

(4)控制遮罩层移动范围

(5)显示放大图


一、需求描述

前端实现放大镜效果;

  • 鼠标移入图片区域,显示遮罩层;
  • 鼠标移出图片区域,隐藏遮罩层;
  • 鼠标移动,遮罩层跟随鼠标移动;
  • 遮罩层不能超出图片所在区域;
  • 遮罩层覆盖的图片区域按照指定比例放大显示;
  • 遮罩层移动,放大图跟随移动;

二、实现效果

初始效果

放大效果

三、完整代码

【test.html】

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>放大镜效果</title><style>* {margin: 0;padding: 0;}.one-img-box,.big-img-box {position: relative;width: 300px;height: 300px;box-shadow: 0 0 6px 1px #cacaca;border-radius: 10px;overflow: hidden;}.one-img-box {display: inline-block;top: 60px;left: 60px;cursor: move;}.one-img-box>img {width: 100%;height: 100%;}.big-img-box {/* display: inline-block; */display: none;top: 60px;left: 100px;}.big-img-box>img {width: 300%;height: 300%;}.big-img {position: absolute;left: 0;top: 0;}.mask {/* display: inline-block; */display: none;position: absolute;left: 0;top: 0;width: 100px;height: 100px;background-color: yellowgreen;opacity: .4;}</style>
</head><body><div class="one-img-box"><img src="D:\test\girl.png" alt=""><div class="mask"></div></div><div class="big-img-box"><img class="big-img" src="D:\test\girl.png" alt=""></div>
</body>
<script>// 1、获取元素// 获取原图的盒子var oneImgBox = document.querySelector('.one-img-box');// 获取遮罩层var mask = document.querySelector('.mask');// 获取大图盒子var bigImgBox = document.querySelector('.big-img-box');// 获取大图var bigImg = document.querySelector('.big-img');// 2、控制显示与隐藏// 2.1 鼠标经过 oneImgBox,显示 mask遮挡层 和 bigImgBox大盒子;oneImgBox.addEventListener('mouseover', function () {mask.style.display = 'inline-block';bigImgBox.style.display = 'inline-block';})// 2.2 鼠标移出 oneImgBox,隐藏 mask遮挡层 和 bigImgBox大盒子;oneImgBox.addEventListener('mouseout', function () {mask.style.display = 'none';bigImgBox.style.display = 'none';})// 3、遮罩层跟随鼠标移动oneImgBox.addEventListener('mousemove', function (e) {// 3.1 计算鼠标在盒子内的坐标var mouseX = e.pageX - oneImgBox.offsetLeft;var mouseY = e.pageY - oneImgBox.offsetTop;// 3.2 计算遮罩层的移动位置// 移动位置 = 鼠标的移动距离 - 遮罩层自己宽度\高度的一半(鼠标会在遮罩层中心位置,否则在左上角)var maskX = mouseX - mask.offsetWidth / 2;var maskY = mouseY - mask.offsetWidth / 2;// 计算结果赋给遮罩层;// mask.style.left = maskX + 'px';// mask.style.top = maskY + 'px';// 4、控制遮罩层的移动范围// 4.1 计算遮罩层最大移动宽度\高度 = 原图盒子的宽度\高度 - 遮罩层的宽度\高度var maskMaxX = oneImgBox.offsetWidth - mask.offsetWidth;var maskMaxY = oneImgBox.offsetHeight - mask.offsetHeight// 如果移动距离 大于 最大移动距离,则取最大的移动距离// 如果移动距离 小于 0,则取0;maskX = maskX > maskMaxX ? maskMaxX : maskX < 0 ? 0 : maskX;maskY = maskY > maskMaxY ? maskMaxY : maskY < 0 ? 0 : maskY;// 计算结果赋给遮罩层mask.style.left = maskX + 'px';mask.style.top = maskY + 'px';// 5、按比例显示大图// 5.1 放大比例 = 原图的宽度 / 大图的宽度 = 1 / 3var rate = oneImgBox.offsetLeft / bigImg.offsetWidth;// 5.2 大图的移动距离 = 遮罩层的移动距离 * 放大比例 (注意大图的移动方向与遮罩层相反)bigImg.style.left = - maskX * 3 + 'px';bigImg.style.top = - maskY * 3 + 'px';})
</script></html>

四、实现过程

1、HTML 页面结构

一个原图片的盒子【div元素】,里面放原图【img元素】和遮罩层【div元素】

一个放大后的图片盒子【div元素】,里面放大图【img元素】;

<body><div class="one-img-box"><img src="D:\test\girl.png" alt=""><div class="mask"></div></div><div class="big-img-box"><img class="big-img" src="D:\test\girl.png" alt=""></div>
</body>

2、CSS 元素样式

(1)两个盒子及图片样式

这里设置原图的宽高均为300px;大图的宽高是原图的三倍;

【 cursor: move; 】使得鼠标在移入图片变成“移动”样式;

【overflow: hidden;】使得图片超出盒子部分被隐藏(大图);

注意,大图盒子最初的的display的值应设为none,显隐性由鼠标移入或移出图片决定;

.one-img-box,
.big-img-box {position: relative;width: 300px;height: 300px;box-shadow: 0 0 6px 1px #cacaca;border-radius: 10px;overflow: hidden;
}.one-img-box {display: inline-block;top: 60px;left: 60px;cursor: move;
}.one-img-box>img {width: 100%;height: 100%;
}.big-img-box {display: inline-block;top: 60px;left: 100px;
}.big-img-box>img {width: 300%;height: 300%;
}.big-img {position: absolute;left: 0;top: 0;
}

(2)遮罩层样式

遮罩层使用绝对定位,根据鼠标的移动位置,再更改其left和top值,使遮罩层跟随鼠标移动;

注意:遮罩层最初不显示,display的值也应设为none;

.mask {display: inline-block;position: absolute;left: 0;top: 0;width: 100px;height: 100px;background-color: yellowgreen;opacity: .4;
}

注意:

原图的宽高均为300px;遮罩层的宽高均为100px;遮罩层与原图的宽高比例都是1 :3;

放大图的盒子和大图的比例需要一致(1 :3),所以大图的宽高应该均为900px;

这里的比例如果不一致,则会出现,遮罩层覆盖的内容,在大图中没有完全显示,或显示不全;当然可以自定义这个比例;

3、JavaScript动态控制

(1)获取页面元素

将页面中需要操作的元素都进行获取;

这里使用的是querySelector()方法来获取元素,是JavaScript中获取dom元素的方式之一;

<script>// 1、获取元素// 获取原图的盒子var oneImgBox = document.querySelector('.one-img-box');// 获取遮罩层var mask = document.querySelector('.mask');// 获取大图盒子var bigImgBox = document.querySelector('.big-img-box');// 获取大图var bigImg = document.querySelector('.big-img');......
</script>

(2)控制大图和遮罩层的显隐性

先设置大图盒子和遮罩层的display 为 none;

......
.big-img-box {/* display: inline-block; */display: none;......
}
.mask {/* display: inline-block; */display: none;......
}
......

分析需求可知:

  • 遮罩层和大图盒子的显示与隐藏是同时的,大图盒子显示则遮罩层显示,大图盒子隐藏则遮罩层隐藏;
  • 当鼠标经过原图时,两者显示,需要给这个原图盒子注册鼠标经过事件,完成相应功能;
  • 当鼠标移出原图时,两者隐藏,也需要给这个原图盒子注册鼠标移出事件,完成相应功能;
<script>......// 2、控制显示与隐藏// 2.1 鼠标经过 oneImgBox,显示 mask遮挡层 和 bigImgBox大盒子;oneImgBox.addEventListener('mouseover', function () {mask.style.display = 'inline-block';bigImgBox.style.display = 'inline-block';})// 2.2 鼠标移出 oneImgBox,隐藏 mask遮挡层 和 bigImgBox大盒子;oneImgBox.addEventListener('mouseout', function () {mask.style.display = 'none';bigImgBox.style.display = 'none';})......
</script>

(3)遮罩层跟随鼠标移动

分析需求可知:

  • 遮罩层在盒子内的移动距离,实际就是鼠标的移动距离(遮罩层跟着鼠标移动),但注意这个是遮罩层左上角的位置;
  • 遮罩层中心的移动距离,要在鼠标移动距离的基础上,减去遮罩层自身的宽度或高度;
  • 鼠标的移动距离mouseX\mouseY为,鼠标在页面中的X坐标\Y坐标 - 图片盒子的左\上边距;
  • 注意,这里鼠标一开始进入图片盒子就开始计算;
<script>......// 3、遮罩层跟随鼠标移动oneImgBox.addEventListener('mousemove', function (e) {// 3.1 计算鼠标在盒子内的坐标var mouseX = e.pageX - oneImgBox.offsetLeft;var mouseY = e.pageY - oneImgBox.offsetTop;// 3.2 计算遮罩层的移动位置// 移动位置 = 鼠标的移动距离 - 遮罩层自己宽度\高度的一半(鼠标会在遮罩层中心位置,否则在左上角)var maskX = mouseX - mask.offsetWidth / 2;var maskY = mouseY - mask.offsetWidth / 2;// 计算结果赋给遮罩层;mask.style.left = maskX + 'px';mask.style.top = maskY + 'px';......})
</script>

注意:

这里存在一个问题,就是当鼠标靠近图片边缘的时候,遮罩层会继续移动,被裁剪;

应该加以判断,控制遮罩层的移动范围,使得遮罩层不会被移出去;

(4)控制遮罩层移动范围

分析需求可知:

  • 遮罩层的移动距离不能小于 0,也不能超过它的最大移动距离;
  • 遮罩层最大移动宽度\高度 = 原图盒子的宽度\高度 - 遮罩层的宽度\高度;
  • 如果移动距离 大于 最大移动距离,则取最大的移动距离;
  • 如果移动距离 小于 0,则取0;
<script>......// 3、遮罩层跟随鼠标移动oneImgBox.addEventListener('mousemove', function (e) {......// 4、控制遮罩层的移动范围// 4.1 计算遮罩层最大移动宽度\高度 = 原图盒子的宽度\高度 - 遮罩层的宽度\高度var maskMaxX = oneImgBox.offsetWidth - mask.offsetWidth;var maskMaxY = oneImgBox.offsetHeight - mask.offsetHeight// 如果移动距离 大于 最大移动距离,则取最大的移动距离// 如果移动距离 小于 0,则取0;maskX = maskX > maskMaxX ? maskMaxX : maskX < 0 ? 0 : maskX;maskY = maskY > maskMaxY ? maskMaxY : maskY < 0 ? 0 : maskY;// 计算结果赋给遮罩层mask.style.left = maskX + 'px';mask.style.top = maskY + 'px';......})
</script>

(5)按比例移动放大图

分析需求可知:

  • 放大比例 = 原图的宽度 / 大图的宽度;
  • 大图的移动距离 = 遮罩层的移动距离 * 放大比例;
  • 注意:大图的移动方向与遮罩层相反;
<script>......// 3、遮罩层跟随鼠标移动oneImgBox.addEventListener('mousemove', function (e) {......// 5、按比例显示大图// 5.1 放大比例 = 原图的宽度 / 大图的宽度 = 1 / 3var rate = oneImgBox.offsetLeft / bigImg.offsetWidth;// 5.2 大图的移动距离 = 遮罩层的移动距离 * 放大比例 (注意大图的移动方向与遮罩层相反)bigImg.style.left = - maskX * 3 + 'px';bigImg.style.top = - maskY * 3 + 'px';})
</script>

=========================================================================

每天进步一点点~!

记录一下这个实用的前端"小轮子"~! 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang 项目打包部署环境变量设置

最近将 golang 项目打包部署在不同环境&#xff0c;总结一下自己的心得体会&#xff0c;供大家参考。 1、首先要明确自己目标服务器的系统类型(例如 windows 或者Linux) &#xff0c;如果是Linux 还需要注意目标服务器的CPU架构(amd或者arm) 目标服务器的CPU架构可执行命令&…

Vue.js学习笔记(五)抽奖组件封装——转盘抽奖

基于VUE2转盘组件的开发 文章目录 基于VUE2转盘组件的开发前言一、开发步骤1.组件布局2.布局样式3.数据准备 二、最后效果总结 前言 因为之前的转盘功能是图片做的&#xff0c;每次活动更新都要重做UI和前端&#xff0c;为了解决这一问题进行动态配置转盘组件开发&#xff0c;…

如何更好地理解递归算法?Python实例详解

递归确实是一种较为抽象的数学逻辑&#xff0c;可以简单的理解为程序调用自身的算法。 维基百科对递归的解释是&#xff1a; 递归&#xff08;英语&#xff1a;Recursion&#xff09;&#xff0c;又译为递回&#xff0c;在数学与计算机科学中&#xff0c;是指在函数的定义中使…

pbootCMS 数据库sqlite转mysql数据库

前言 pbootCMS默认使用 sqlite数据库 &#xff0c;那么什么是sqlite数据库呢&#xff1f; SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌…

【大模型LLM面试合集】大语言模型架构_MoE论文

1.MoE论文 参考文章&#xff1a; Mixture of Experts-IntroductionUnderstanding the Mixture-of-Experts Model in Deep Learning 论文相关&#xff1a; 论文名称&#xff1a;Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer论文地址&a…

Kafka(三)Producer第二篇

一&#xff0c;生产者架构 生产者客户端由两个线程协调运行&#xff0c;分别为主线程和Sender线程&#xff08;发送线程&#xff09;。 主线程&#xff1a;KafkaProducer创建消息&#xff0c;通过拦截器、序列化器和分区器之后缓存到消息收集器RecordAccumulator中&#xff1b;…

jmeter-beanshell学习6-beanshell生成测试报告

前面写了各种准备工作&#xff0c;内容组合用起来&#xff0c;应该能做自动化了&#xff0c;最后一步&#xff0c;生成一个报告&#xff0c;报告格式还是csv 报告生成的路径和文件&#xff0c;在用户参数写好&#xff0c;防止以后改路径或者名字&#xff0c;要去代码里面改。以…

批量提取PDF指定区域内容到 Excel , 根据PDF文件第一行文字来自动重命名v1.3-附思路和代码实现

本次文章更新内容&#xff0c;图片以及扫描的PDF也可以支持批量提取指定区域内容了&#xff0c;主要是通过截图指定区域&#xff0c;然后使用OCR来识别该区域的文字来实现的&#xff0c;所以精度可能会有点不够&#xff0c;但是如果是数字的话&#xff0c;问题不大&#xff1b;…

Java高频面试基础知识点整理9

干货分享&#xff0c;感谢您的阅读&#xff01;背景​​​​​​高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09; 最全文章见&#xff1a;Java高频面试基础知识点整理 &#xff08;一&#xff09;Java基础高频知识考点 针对人员&#xff1a; 1.全部人员都…

农牧行业CRM洞察:打造营、销、服一体化数字营销平台

01、行业应用背景 保持企业活力&#xff0c;支撑业务单元协调发展&#xff0c;稳定核心产品竞争力&#xff0c;将成为农牧行业企业数字化、数智化建设的指导方向。 积极发挥数据在生产、流通、消费各个环节的决策支撑&#xff0c;为农牧企业特别是多业态集团型企业&#xff0…

Cisco 命令速查表(非常详细)零基础入门到精通,收藏这一篇就够了

Cisco IOS&#xff08;Internetwork Operating System&#xff09;是 Cisco 系统公司开发的专有操作系统&#xff0c;用于其路由器和交换机。它提供了一个稳健的、可扩展的、以命令行接口&#xff08;CLI&#xff09;为基础的网络操作环境。通过掌握 Cisco IOS 命令&#xff0c…

conda install问题记录

最近想用代码处理sar数据&#xff0c;解放双手。 看重了isce这个处理平台&#xff0c;在安装包的时候遇到了一些问题。 这一步持续了非常久&#xff0c;然后我就果断ctrlc了 后面再次进行尝试&#xff0c;出现一大串报错&#xff0c;不知道是不是依赖项的问题 后面看到说mam…

通用详情页的打造

背景介绍 大家都知道&#xff0c;详情页承载了站内的核心流量。它的量级到底有多大呢&#xff1f; 我们来看一下&#xff0c;日均播放次数数亿次&#xff0c;这么大的流量&#xff0c;其重要程度可想而知。 在这样一个页面&#xff0c;每一个功能都是大量业务的汇总点。 作为…

Django 删除单行数据

1&#xff0c;添加模型 from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharField(max_length100)author…

苹果电脑压缩软件哪个好用一些? mac电脑用什么压缩软件 mac电脑压缩文件怎么设置密码

压缩软件是Mac电脑必不可少的工具&#xff0c;虽然Mac系统自带了一款“归档实用工具”&#xff0c;但是其功能实在匮乏&#xff0c;若你需要加密压缩文件或者把文件压缩成指定格式&#xff0c;那么该工具无法满足你的需求。Mac用户应该怎么选择压缩软件呢&#xff1f;本文就来告…

自动驾驶算法———车道检测(一)

“ 在本章中&#xff0c;我将指导您构建一个简单但有效的车道检测管道&#xff0c;并将其应用于Carla 模拟器中捕获的图像。管道将图像作为输入&#xff0c;并产生车道边界的数学模型作为输出。图像由行车记录仪&#xff08;固定在车辆挡风玻璃后面的摄像头&#xff09;捕获。…

一图展示免费开源的分布式版本控制系统​Git

文章目录 前言一、安装Git二、Git配置三、git命令 前言 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 一、安装Git Windows操作系统…

MFC扩展库BCGControlBar Pro v35.0 - 可视化管理主题等全新升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了&#xff0c;这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

大模型时代的目标检测

https://zhuanlan.zhihu.com/p/663703934https://zhuanlan.zhihu.com/p/6637039341.open set/open word/ood 这个任务是指在实际应用上可以检测任何前景物体&#xff0c;但是有些不需要预测类别&#xff0c;只要检测出框就行。在很多场合也有应用场景&#xff0c;有点像类无关…

ASP.NET MVC Lock锁的测试

思路&#xff1a;我们让后台Thread.Sleep一段时间&#xff0c;来模拟一个耗时操作&#xff0c;而这个时间可以由前台提供。 我们开启两个或以上的页面&#xff0c;第一个耗时5秒(提交5000)&#xff0c;第二个耗时1秒(提交1000)。 期望的测试结果&#xff1a; 不加Lock锁&…