【小5聊】纯javascript实现图片放大镜效果

2023/9/30 18:24:39

实现图片放大镜效果,其实就是一个比例放大的效果

以下通过纯javascript方式对图片进行等比例放大,等比倍数和出界判断可自行实现

文章后面会附上全部代码

放大镜效果 

 

1、 放大镜组成

1)目标图片,一般是小图

2)鼠标移动上去的一个等比例小框框图

3)弹窗显示一个等比例的大图

2、实现分析

1)假如目标图片为宽度为500px,高度为200px,500:200的比例

2)那么定位遮罩就是,50:20

小方框遮罩和目标区域是50:500,10倍的关系

3)所以放大镜设置10倍比例就是,5000:2000

当然也可以设置动态比例参数,+-加减符号来调整

4)目标图片到浏览器顶部距离

关键点:targetObj.getBoundingClientRect().top,这个是到可视范围的浏览器顶部

特别注意:targetObj.offsetTop,这个值是指实际的距离,就是获取父元素的距离

5)获取class元素方法

querySelector和querySelectorAll

6)

3、布局设计

1)设置3张图片,统一设置class为targetImage

2)每张图片区域对应一个小方框遮罩,class为positionMask

当然这个遮罩也可以动态追加,此处不做实现

3)设置一个放大镜区域,样式class设置为enlargeArea

区域内就是具体的img标签,可以设置样式class为enlargeImage

<ul>
    <li>
        <img class="targetImage" src="" width="500" height="200" />
        <div class="postionMask"></div>
    </li>
    <li>
        <img class="targetImage" src="" width="500" height="200" />
        <div class="postionMask"></div>
    </li>
    <li>
        <img class="targetImage" src="" width="500" height="200" />
        <div class="postionMask"></div>
    </li>
</ul>

<div class="enlargeArea">
    <img class="enlargeImage" src="img/1200543.jpg" />
</div>

完整代码


<style>
    * { padding: 0; margin: 0; list-style: none; border: 0; }
    ul { width: 500px; height: 200px; overflow: hidden; margin-left: 100px; position: relative; }
        ul li { float: left; }
    .enlargeArea { box-shadow: 0 0 13px #ccc; height: 200px; width: 500px; overflow: hidden; position: fixed; top: 0; left: 0; background: #fff; border-radius: 10px; display: none; }
        .enlargeArea img { position: absolute; height: 2000px; width: 5000px; top: 0; left: 0; }
    .targetImage { position: relative }
    .postionMask { position: absolute; left: 0; top: 0; width: 50px; height: 20px; display: none; background-color: rgb(224, 117, 240, 0.6); }
</style>

<div style="width:100%;height:100px;"></div>
<ul>
    <li class="targetImageParent">
        <img class="targetImage" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2F2%2F54699bf470c9a.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1672062275&t=fa53ab442a8f11449e2c565745388654" width="500" height="200" />
        <div class="postionMask"></div>
    </li>
    <li class="targetImageParent">
        <img class="targetImage" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2F2%2F57a2b93424164.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1672062275&t=c270d62648a24edcd927f319b677d93a" width="500" height="200" />
        <div class="postionMask"></div>
    </li>
    <li class="targetImageParent">
        <img class="targetImage" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2Fb%2F568e0e5a339f9.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1672062275&t=62fcbf112e7c0b3fb9ebc197c725c2a2" width="500" height="200" />
        <div class="postionMask"></div>
    </li>
</ul>

<div class="enlargeArea">
    <img class="enlargeImage" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2F2%2F54699bf470c9a.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1672062275&t=fa53ab442a8f11449e2c565745388654" />
</div>

<script type="text/javascript">

    // 获取目标图片有多少张
    var length = document.querySelectorAll('.targetImage').length;
    for (var i = 0; i < length; i++) {
        //给每张图片绑定事件
        bind(i);
    }

    // 绑定事件
    function bind(i) {
        let targetImageParent = document.querySelectorAll(".targetImageParent")[i]; // 目标图片所在的父级对象
        let postionMask = document.querySelectorAll(".postionMask")[i];             // 小方框遮罩对象
        let enlargeArea = document.querySelector(".enlargeArea");                   // 放大镜区域
        let enlargeImage = document.querySelector(".enlargeImage");                 // 放大镜区域图片

        // 鼠标移开目标区域,隐藏放大镜弹窗和小方框遮罩
        targetImageParent.onmouseleave = function () {
            postionMask.style.display = "none";
            enlargeArea.style.display = "none";
        }

        // 设置参数
        var starty = 0          // 鼠标进入目标区域的y轴坐标,也就是top值
        var startx = 0          // 鼠标进入目标区域的x轴坐标,也就是left值
        var maskStartTop = 0;   // 小方框遮罩左上角的x轴坐标值
        var maskStartLeft = 0;  // 小方框遮罩左上角的x轴坐标值

        // 鼠标进入目标区域,显示放大镜弹窗和小方框遮罩
        targetImageParent.onmouseenter = function (e) {
            starty = e.clientY;
            startx = e.clientX;

            var parent = this.parentElement;    // 这个需要注意,根据自己设定的固定区域来
            maskStartTop = parent.getBoundingClientRect().top;
            maskStartLeft = parent.getBoundingClientRect().left;
            postionMask.style.display = "block";

            // 放大镜图
            enlargeArea.style.display = "block";
            enlargeArea.style.top = maskStartTop - 100 + "px";
            enlargeArea.style.left = maskStartLeft + this.clientWidth + 20 + "px";

            // 获取src图片路径值
            enlargeImage.setAttribute('src', targetImageParent.getElementsByTagName('img')[0].getAttribute('src'));
        }

        // 鼠标在目标区域移动
        targetImageParent.onmousemove = function (e) {

            let x = e.clientX - startx - postionMask.clientWidth / 2;
            let y = e.clientY - starty - postionMask.clientHeight / 2;

            var mY = e.clientY - maskStartTop - 5;
            //if (mY <= 0) mY = 0; // 可扩展移动到边界小方框遮罩不出借,此处暂不实现
            var mX = e.clientX - maskStartLeft - 25;
            //if (mX <= 0) mX = 0;

            // 小方框位置
            postionMask.style.top = mY + "px";
            postionMask.style.left = mX + 'px';

            // 放大镜图片对应显示,实际上就是等比定位
            enlargeImage.style.top = -(mY - 0) * 10 + 'px';
            enlargeImage.style.left = -(mX - 0) * 10 + 'px';
        }
    }
</script>


http://www.jnnr.cn/a/154105.html

相关文章

Linux学习

一、linux目录结构 /bin [常用] &#xff1a;是Binary的缩写&#xff0c;这个目录存放着最经常使用的命令/sbin&#xff1a;s就是super user的意思&#xff0c;这里存放的是系统管理员使用的系统管理程序/home [常用]&#xff1a;存放普通用户的主目录&#xff0c;在Linux中每…

MySQL 慢查询日志 使用方法浅析 日志定位与优化技巧

目录 前言 1、如何开启使用慢查询日志&#xff1f; 1.1 开启慢查询日志 1.2 设置慢查询阈值 1.3 确定慢查询日志的文件名和路径 1.3.1 查询MySQL数据目录 1.3.2 查询慢查询日志文件名 1.3.3 查询全局设置变量 1.3.4 查询单个变量命令 1.3.5 其他注意事项 2、如何定位并优…

第八章《Java高级语法》第12节:Lambda表达式

Lambda 表达式是 JDK8 的一个新特性,它可以定义大部分的匿名内部类,从而让程序员能写出更优雅的Java代码,尤其在集合的各种操作中可以极大地优化代码结构。 8.12.1 认识Lambda表达式 一个接口的实现类可以被定义为匿名类。经过大量实践,人们发现定义一个接口的匿名实现类…

痞子衡嵌入式:MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家分享的是MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制。 痞子衡之前写过一篇文章 《MCUXpresso IDE下工程链接文件配置管理与自动生成机制》&#xff0c;这篇文章介绍了 MCUXpresso ID…

机器学习模型与backtrader框架整合

原创文章第116篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 北京疫情似乎还没有到拐点&#xff0c;但这三天结束后应该会到来。 今天重点说说&#xff0c;机器学习模型整合到我们的回测框架中&#xff0c;并与backtrader连接起来回测…

文献解读——基于深度学习的病毒宿主预测

文章目录背景介绍作者介绍文章概述流程数据准备输入数据处理深度神经网络结果背景介绍 人畜共患病病毒对人类和动物的健康产生巨大了威胁&#xff0c;例如近期爆发的寨卡病毒、埃博拉病毒以及冠状病毒。病毒起源的宿主信息对于有效控制和消灭传播是至关重要的&#xff0c;这是…

后台管理不可忽视,华为云会议最新支持管理员分权分域

如今&#xff0c;跨地域&#xff0c; 跨组织&#xff0c;需要随时随地接入的远程沟通协作变得愈加频繁&#xff0c;众多企业开始纷纷建设符合自身需求的智能会议室。在会议系统的众多能力中&#xff0c;后台管理&#xff0c;这项常常被C端用户忽略的能力&#xff0c;B端的企业却…

FreeCAD二次开发-基于PyQT对话框与FC交互的开发

版本 FreeCAD0.18.2+PyCharm Community 2020.3.3 演示效果 环境搭建步骤 1.先安装好FreeCAD和PyCharm 2.添加环境变量 点击确定,全部关掉。 3.测试变量是否生效(CMD打开控制台,输入python回车) 弹出如下,说明可以进入FreeCAD自带的python解释器 4.创建工作台Workbench(…

【线性表】—动态顺序表的增删查改实现

小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan&#xff08;所有的原码都放在了我上面的gitee仓库里&#xff09; 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努…

scrapy的入门使用

目录 一、 安装scrapy 1.windonws/Mac安装命令&#xff1a; 2. 安装依赖包&#xff1a;pip install pypiwin32 二、 scrapy项目开发流程 1.创建项目:    2.生成一个爬虫: 3.提取数据: 4.保存数据: 三、 创建项目 四、创建爬虫 五、完善爬虫 5.2 定位元素以及提取…

C++智能指针之shared_ptr

C智能指针之shared_ptr前言一、Shared_ptr1.1 shared_ptr类的操作1.2 make_shared函数1.3 shared_ptr的拷贝赋值1.4 shared_ptr的自动销毁对象内存机制1.5 使用动态生存期的资源的类1.6 shared_ptr与new结合使用1.7 不要混合使用普通/智能指针1.8 不要使用 get 初始化另一个智能…

世界杯来了,让 Towhee 带你多语言「以文搜球」!

四年一度的世界杯已正式拉开战幕&#xff0c;各小组比赛正如火如荼地进行中。在这样一场球迷的盛宴中&#xff0c;不如让 Towhee 带你「以文搜球」&#xff0c;一览绿茵场上足球战将们的风采吧&#xff5e; 「以文搜球」是跨模态图文检索的一部分&#xff0c;如今最热门的跨模…

百行代码实现VLC简易视频播放器【详细环境配置过程+可执行源码注释完整】

文章目录❓什么是VLC&#x1f680;VLC 库的集成⭐VLC环境配置演示【win10系统vs2017win64】&#x1f34e;VLC 库的基本使用&#x1f382;视频播放器实现⭐自定义函数Unicode2Utf8讲解&#x1f3e0;总结❓什么是VLC VLC 是 Video Lan Client 的缩写&#xff0c;原先是几个法国的…

ES6解析赋值

ES6中新增了一种数据处理方式&#xff0c;可以将数组和对象的值提取出来对变量进行赋值&#xff0c;这个过程时将一个数据结构分解成更小的部分&#xff0c;称之为解析。 1.对象解析赋值: 在ES5中&#xff0c;要将一个对象的属性提取出来&#xff0c;需要经过一下几个过程。 …

springcloud22:sentinal的使用

sentinal对比&#xff08;分布式系统的流量防卫&#xff09; 监控保护微服务 Hystrix 需要自己去手工搭建监控平台&#xff0c;没有一套web界面可以进行细粒度化的配置&#xff0c;流控&#xff0c;速率控制&#xff0c;服务熔断&#xff0c;服务降级… 整合机制&#xff1a;se…

让学前端不再害怕英语单词(四)

|| 欢迎关注csdn前端领域博主: 前端小王hs || email: 337674757qq.com || 前端交流群&#xff1a; 598778642前三章直通车↓↓↓ 让学前端不再害怕英语单词&#xff08;一&#xff09; 让学前端不再害怕英语单词&#xff08;二&#xff09; 让学前端不再害怕英语单词&#xff0…

2022年 SecXOps 安全智能分析技术白皮书 学习笔记 免费下载地址

核心能力 为了加快安全分析能力更全面、更深入的自动化 &#xff0c;SecXOps 的目标在于创建一个集成的用于 Security 的 XOps 实践&#xff0c;提升安全分析的场景覆盖率和运营效率。SecXOps 技术并不 015 SecXOps 技术体系 是 Ops 技术在安全领域的简单加和&#xff0c;SecXO…

C语言练习之递归实现n的k次方

文章目录前言一、思路二、代码以及运行截图1.代码2.运行截图总结前言 使用C语言递归计算N的k次方 一、思路 求n的k次方的原理就是&#xff1a; n^k nn……*n&#xff08;k个n进行相乘&#xff09; 可以得到一个公式&#xff1a; f(k){1k0n∗f(k)k>0f(k) \left\{\begin{…

详解 InnoDB Cluster 主机名问题

详解 InnoDB Cluster 主机名问题 文章目录详解 InnoDB Cluster 主机名问题导言测试过程结论导言 因在写 【InnoDB Cluster】修改已有集群实例名称及成员实例选项 时发现主机名这块有一些问题&#xff0c;在其中进行了部分测试&#xff0c;但为使其内容精简&#xff0c;故将此部…

JSP学习日记

JSP简述 Java Sever Pages----->Java服务器界面 用于前后端结合 jsp为什么淘汰&#xff1f; 由于JSP的前后端耦合性极高&#xff0c;编写代码非常臃肿。前后端的代码放在一起&#xff0c;所以JSP可以看成是已经被淘汰的技术。 为什么还要学jsp&#xff1f; 由于一些公司…
最新文章