Pro3:js实现放大镜效果

news2024/11/17 22:43:22

在我们平时见到很多购物网站都会有放大镜效果的出现,当我们将鼠标放在一个商品图片的上面,就会在旁边出现对应的放大效果。
在这里插入图片描述

实现步骤

实现原理是非常简单的,实际上是两张图片,一张原图和一张更大尺寸的图片。一开始通过css样式的设置,将大的图片隐藏掉,只有将鼠标放到原图上才会将大图片显示出来。

<div class="main">
    <div class="div1">
        <img src="123.jpg">
        <!--放大镜的阴影部分-->
        <div class="div2"></div>
    </div>
    <div class="div3">
        <img src="123.jpg" id="big-img">
    </div>
</div>

css部分

整个div块设置了一个外边框100px,使得图片向右和向下挪动了100px。

 		*{
            margin: 0;
            padding: 0;
        }
        .main{
           margin: 100px;
        }

第一个div块样式设置,设置原图的宽度和高度为300px,设置了一个左浮动,使得第二张图片和第一张保持在一排。图片保持宽度和高度为100%,也就相当于300px。

  .div1{
            width: 300px;
            height: 300px;
            float: left;
            position: relative;
        }
        .div1 img{
            width: 100%;
            height: 100%;
        }

这个就是“放大镜”的样式设置了,宽和高都为100px,设置了一个浅一点的背景颜色,opacity透明度为0.5,position为absolute相对于父元素的绝对定位。
初始位置就是在图片的左上角,为什么在左上角呢,因为设置了top和left都是0.

   .div2{
            width: 100px;
            height: 100px;
            background-color:blanchedalmond;
            opacity: 0.5;
            display: none;
            position: absolute;
            left: 0;
            top: 0;
        }

大图片的样式设置,div块的宽度和高度与小图片一致,图片尺寸肯定超过了300px,所以将超出的部分隐藏overflow:hidden,

       .div3{
            width: 300px;
            height: 300px;
            display: block;
            overflow: hidden;
            position: relative;
        }
        .div3 img{
            position: absolute;
            left: 0;
            top: 0;
        }

js部分

onmouseover 事件会在鼠标指针移动到指定的元素上时发生。
起始大图片和放大镜的display为none是隐藏效果,当鼠标指针移动到图片上时变为block,就是将放大镜和大图片显示出来。

   var smallImg=document.querySelector(".div1");
        var fangdajing =document.querySelector(".div2");
        var bigImg = document.querySelector(".div3");
        var main =document.querySelector(".main");
        var img =document.querySelector("#big-img");
        smallImg.onmouseover =function(){
            fangdajing.style.display ="block";
            bigImg.style.display = "block";
        }

当鼠标移出之后恢复到none隐藏效果。

smallImg.onmouseout = function(){
            fangdajing.style.display ="none";
            bigImg.style.display = "none";
        }

接下来就是我们的重点,如何使得放大镜随着鼠标移动,显示出对应部分的放大图。

smallImg.onmousemove = function(e){
             //当前鼠标的位置-盒子距离浏览器左侧的偏移-放大镜宽度的一半
            var x =e.clientX -main.offsetLeft -fangdajing.offsetWidth/2;
            var y =e.clientY -main.offsetTop -fangdajing.offsetHeight/2;
            
            if(x<0){
                x=0
            }
            else if(x>smallImg.offsetWidth -fangdajing.offsetWidth){
                x=smallImg.offsetWidth -fangdajing.offsetWidth
            }
            if(y<0){
                y=0
            }
            else if(y>smallImg.offsetHeight -fangdajing.offsetHeight){
                y=smallImg.offsetHeight -fangdajing.offsetHeight
            }

            fangdajing.style.left = x + 'px';
            fangdajing.style.top = y + 'px';

            img.style.left = -x *2+'px';
            img.style.top = -y *2+'px';
           
        }

为小图设置了鼠标移动事件,当鼠标在小图上移动时会触发这个事件。
这里的x就是当前鼠标坐在的位置减去整个盒子距离浏览器左侧的偏移再减去放大镜宽度的一半。

//当前鼠标的位置-盒子距离浏览器左侧的偏移-放大镜宽度的一半
var x =e.clientX -main.offsetLeft -fangdajing.offsetWidth/2;
var y =e.clientY -main.offsetTop -fangdajing.offsetHeight/2;

x和y是有限制的不能超出小图的范围。

if(x<0){
         x=0
     }
     else if(x>smallImg.offsetWidth -fangdajing.offsetWidth){
       x=smallImg.offsetWidth -fangdajing.offsetWidth
     }
if(y<0){
       y=0
     }
     else if(y>smallImg.offsetHeight -fangdajing.offsetHeight){
      y=smallImg.offsetHeight -fangdajing.offsetHeight
    }

设置放大镜样式的左边缘和上边缘为x和y,大图片为小图片的二倍就偏移-x*2,为什么是负的呢,是因为鼠标在小图上从左往右移动,大图就是从右往左移动。

  fangdajing.style.left = x + 'px';
  fangdajing.style.top = y + 'px';

  img.style.left = -x *2+'px';
  img.style.top = -y *2+'px';

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

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

相关文章

MessageFormat的具体使用(格式化消息)

文章目录1. 前言2. 先说结论3. 在结论上补充其他更加特殊情况1. 数字类型可以使用#字符来确认精度2. 数组类型转化需要注意3. 输出特殊字符4. 如何判断一个String是否有替换位4. 粗略原理1. 前言 在工作中发现接口的返回报文&#xff0c;大部分公司通常都会封装一层&#xff0c…

2022-LCLR-DIFFDOCK: DIFFUSION STEPS, TWISTS, AND TURNS FOR MOLECULAR DOCKING

2022-LCLR-DIFFDOCK: DIFFUSION STEPS, TWISTS, AND TURNS FOR MOLECULAR DOCKING Paper: https://arxiv.org/abs/2210.01776 Code: https://github.com/gcorso/DiffDock 预测小分子配体与蛋白质的结合结构(称为分子对接)是药物设计的关键。最近的深度学习方法将对接视为一个回…

GB/T 20984-2022《信息安全技术 信息安全风险评估方法》解读

前言 近年来&#xff0c;信息安全风险评估工作逐步在国家基础信息网络及重要行业信息系统中普遍推行&#xff0c;信息安全风险评估是信息安全保障工作的基础和重要环节&#xff0c;日前&#xff0c; GB/T 20984-2022 《信息安全技术 信息安全风险评估方法》发布&#xff0c;将…

oracle学习篇(四)

oracle学习篇(四&#xff09; 1 PL/SQL异常处理 1.1 预定义异常 1.1.1 内容 oracle里面已经存在的异常 如果是自定义异常,一般写的编号是20000-20999之间1.1.2 处理异常语法 exceptionwhen 异常类型1 then输出异常类型信息1;when 异常信息2 then输出异常类型信息2;--以上都…

MR案例:学生排序(单字段排序、多字段排序)

文章目录一、提出任务二、完成任务&#xff08;一&#xff09;准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录&#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建学生实体类5、创建学生映射器类5、创建学生归并器类6…

JS中操作<select>标签选的值

JS中操作<select>标签选的值 <select>标签是一种表单控件&#xff0c;用来创建下拉列表。在<select> 标签内可用 <option> 标签定义下拉列表中的可用选项。下面给出一个基本下拉列表示例&#xff1a; <!DOCTYPE html> <html lang"zh&q…

Codeforces Round #838 (Div. 2)

A. Divide and Conquer 题目链接&#xff1a;Problem - A - Codeforces 样例输入&#xff1a; 4 4 1 1 1 1 2 7 4 3 1 2 4 1 15样例输出&#xff1a; 0 2 1 4题意&#xff1a;一个数组是好的当且仅当所有的元素和是一个偶数&#xff0c;现在给我们一个初始数组&#xff0c;我…

Android---组件化

1、单体应用 所有代码写在一个工程里。不同业务写到各自模块&#xff0c;以包名来区分。 弊端 1、无论包名做的再好&#xff0c;随着项目扩大&#xff0c;项目失去层次感&#xff0c;接受吃力。 2、报名作为约束&#xff0c;太弱了。一不注意就会出现不同业务之间之间相互调…

【算法数据结构专题】「限流算法专项」带你认识常用的限流算法的技术指南(分析篇)

限流 限流的目的是通过对并发访问/请求进行限速&#xff0c;或者对一个时间窗口内的请求进行限速来保护系统&#xff0c;一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理 限流一词常用于计算机网络之中&#xff0c;定义如下&#xff1a; In computer networks, rate l…

接口测试(七)—— 参数化、数据库操作类封、接口自动化框架

目录 一、接口自动化测试框架 1、目录结构 二、封装iHRM登录 1、普通方式实现 2、登录接口对象层 3、登录接口测试用例层 4、封装断言方法 三、参数化 1、回顾UnitTest参数化 1.1 原始案例 1.2 参数化实现 1.3 从json文件读取 2、登录接口参数化 2.1 组织数据文…

java8流操作之不常用但是很好用的隐藏api

前言 1、一些普通的方式就不再多说了&#xff0c;这里主要说一些不常用的&#xff0c;但是作用很大的api方式 2、如果想要细致了解可以参考 JAVA8的流操作&#xff0c;十分推荐 一、flatMap 1、这个api主要是用来推平流的&#xff0c;和map不一致&#xff0c;map是对象到对…

Python基础(十六):函数的初步认识

文章目录 函数的初步认识 一、函数的作用 二、函数的使用步骤 1、定义函数 2、调用函数 3、快速体验 三、函数的参数作用 四、函数的返回值作用 1、应用 五、函数的说明文档 1、语法 2、快速体验 3、函数嵌套调用 七、函数应用 1、打印图形 2、函数计算 八、总…

还在为多张Excel汇总统计发愁?Python 秒处理真香!

为什么越来越多的非程序员白领都开始学习 Python &#xff1f;他们可能并不是想要学习 Python 去爬取一些网站从而获得酷酷的成就感&#xff0c;而是工作中遇到好多数据分析处理的问题&#xff0c;用 Python 就可以简单高效地解决。本文就通过一个实际的例子来给大家展示一下 P…

新手传奇gm架设要学会的几个修改技巧

每个传奇gm对于架设一个服务器都有自己独立的看法和想法&#xff0c;一些人之所以会想着要架设一个传奇私服主要原因是自己在其他人的服力玩得不是那么舒心。所以想要按照自己的想法和思路打造一个适合自己的专属服务器进行游戏&#xff0c;其实这两者之间是有必然联系的&#…

毕业三年活得像个废物,转行网络安全,写给像我一样迷茫的人...

首先说说我吧&#xff0c;普通二本非科班商贸专业毕业&#xff0c;三年了&#xff0c;做过电商&#xff0c;做过新媒体&#xff0c;做过业务员&#xff0c;从躺平到摆烂&#xff0c;一开始还挺享受这样的生活的&#xff0c;毕竟每月4千工资&#xff0c;抛出吃住&#xff0c;剩个…

重学webpack系列(八) -- webpack的运行机制与工作原理

前面几个章节我们分别去探索了webpack的loader机制、plugin机制、devServer、sourceMap、HMR&#xff0c;但是你是否知道这些配置项是怎么去跟webpack本身执行机制挂钩的呢&#xff1f;这一章我们就来探索一下webpack的运行机制与工作原理吧。 webpack核心工作过程 我们打开w…

第十四章 文件操作

1.文件的基本操作 文件&#xff0c;对我们并不陌生&#xff0c;文件是数据源&#xff08;保存数据的地方&#xff09;的一种&#xff0c;比如大家经常使用的Word文档&#xff0c;TXT文件&#xff0c;excel文件…都是文件。文件最主要的作用就是保存数据&#xff0c;它既可以保…

用户虚拟地址空间管理-mm_struct

一、进程虚拟地址空间管理概览 二、mm_struct结构体的主要成员 atomic_t mm_users;共享同一个用户虚拟地址空间的进程的数量&#xff0c;也就是线程组包含的进程的数量atomic_t mm_count;内存描述符的引用计数struct vm_area_struct *mmap;虚拟内存区域链表struct rb_root mm_…

【java】课程设计--抽卡模拟器

文章目录工期安排自己实现菜单逻辑抽卡算法0.书写要求1.用户需求2.设计思想3.各个功能和算法描述4.系统调试中问题5.总结新知识怎么打开任务管理器改进&#xff08;进一步的设想&#xff09;交给她们实现1.注册登录2.读文件-显示查找内容暂时成功案例工期安排 1 自定义增加和删…

数据权限就该这么设计

在项目实际开发中我们不光要控制一个用户能访问哪些资源&#xff0c;还需要控制用户只能访问资源中的某部分数据。 控制一个用户能访问哪些资源我们有很成熟的权限管理模型即RBAC&#xff0c;但是控制用户只能访问某部分资源&#xff08;即我们常说的数据权限&#xff09;使用…