目录

大致步骤:

hover的小知识点:

offsetX: 鼠标坐标到元素的左侧的距离

offsetWidth: 除了外边距(margin)以外,所有的宽度(高度)之和(当前元素)

offsetHeight:元素的像素高度 包含元素的垂直内边距和边框,水平滚动条的高度,且是一个整数

实现效果:

完整HTML代码:

完整VUE代码:


大致步骤:

首先我们应该先构思好布局:

  1. 先有一个div存放原始图片
  2. 再有一个div存放放大后的图片
  3. 来一个遮罩层让用户知道自己正在观察哪个区域,并且实现遮罩层跟随鼠标移动而移动
  4. 显示放大后的图片

OK,大致就是这几个步骤。

这里在说一下关于代码中的css布局最后三行,在这里我踩了很大一个坑,因为在页面结构中big类是event的邻居兄弟类,而mask类也是兄弟类但是不邻接。并且这两个类的display我最初设置的是none,就是最初没有结构不显示。在我写代码时我使用.event:hover .big,.mask{display:block}发现一直没有效果,并且我开始并没有发现是这里错了,导致纠结了很久。

 .event1:hover + .big ,.event1:hover ~ .mask {display: block;}

hover的小知识点:

hover后面一般都是控制子元素,无法控制父元素的效果
hover更改同级(兄弟)元素属性:
更改兄弟元素又分两种情况:

  • 需要更改的兄弟元素是当前元素的相邻元素,也就是说紧接着当前元素,在hover后面使用‘+’号链接就行,就是 .event1:hover + .big
  • 需要改变的兄弟元素不是当前元素的邻接元素: .event1:hover ~ .mask

offsetX: 鼠标坐标到元素的左侧的距离

offsetWidth: 除了外边距(margin)以外,所有的宽度(高度)之和(当前元素)

offsetHeight:元素的像素高度 包含元素的垂直内边距和边框,水平滚动条的高度,且是一个整数

 url图片地址改成自己的啊,不要和我一样!!!!!

实现效果:

图片本身就比较糊,不是放大的原因

完整HTML代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>放大镜实现</title></head><body><div class="spec-preview"><img src="./111jpg.jpg" /><div class="event1" id="event1" onmousemove="mouseMove(event)"></div><div class="big"><img src="./111jpg.jpg"  id="bigImg"/></div><div class="mask"></div></div></body><style>.spec-preview {position: relative;width: 400px;height: 400px;border: 1px solid #ccc;}.spec-preview>img {width: 100%;height: 100%;}.event1 {width: 100%;height: 100%;position: absolute;top: 0;left: 0;z-index: 998;}.mask {width: 50%;height: 50%;background-color: rgba(0, 255, 0, 0.3);position: absolute;left: 0;top: 0;display: none;}.big {width: 100%;height: 100%;position: absolute;top: -1px;left: 105%;border: 1px solid rgb(212, 11, 11);/* //把下面这行代码去掉,试着理解为什么上面需要乘以-2 */overflow: hidden;z-index: 998;display: none;background: white;}.big img {/* 这里的宽高实现放大两倍的效果 */width: 200%;max-width: 200%;height: 200%;position: absolute;left: 0;top: 0;}.event1:hover + .big ,.event1:hover ~ .mask {display: block;}</style><script>// var event1=document.getElementById('event1')// console.log(event1)var big=document.getElementById('bigImg')//获取遮罩层dom实现遮罩层跟随鼠标位置移动var mask = document.querySelector('.mask');function mouseMove(event){// console.log(big.style)//offsetX:鼠标坐标到元素的左侧的距离//offsetWidth 除了外边距(margin)以外,所有的宽度(高度)之和let left = event.offsetX - mask.offsetWidth / 2;//offsetY:鼠标坐标到元素的顶部的距离//offsetHeight:元素的像素高度 包含元素的垂直内边距和边框,水平滚动条的高度,且是一个整数let top = event.offsetY - mask.offsetHeight / 2;//  约束范围,保证光标在div范围内,都是以父盒子div为参考对象的//超出图片左侧if (left <= 0) left = 0;//超出图片右侧if (left >= mask.offsetWidth) left = mask.offsetWidth;if (top <= 0) top = 0;if (top >= mask.offsetHeight) top = mask.offsetHeight;//  修改元素的left|top属性值//遮罩层mask.style.left = left + "px";mask.style.top = top + "px";//放大镜,你向左移动鼠标,图片就是向右移动,运动方向是相反的//与css中width:200%,height:200%相对应,建议以后放大倍数为2nbig.style.left = -2*left + "px";big.style.top =  -2*top + "px";}</script>
</html>

认识到一个元素能够跟随鼠标移动而移动那么肯定是使用了定位,这是必须得知道的

完整VUE代码:

:src的意思是动态绑定一个图片资源地址

<template><div class="spec-preview"><img :src="imgObj.imgUrl" /><div class="event" @mousemove="handler"></div><div class="big"><img :src="imgObj.imgUrl" ref="big" /></div><div class="mask" ref="mask"></div></div>
</template><script>export default {methods:{handler(event){let big=this.$refs.big//获取遮罩层dom实现遮罩层跟随鼠标位置移动let mask=this.$refs.mask;//offsetX:鼠标坐标到元素的左侧的距离//offsetWidth 除了外边距(margin)以外,所有的宽度(高度)之和let left=event.offsetX-mask.offsetWidth/2;//offsetY:鼠标坐标到元素的顶部的距离//offsetHeight:元素的像素高度 包含元素的垂直内边距和边框,水平滚动条的高度,且是一个整数let top=event.offsetY-mask.offsetHeight/2;//  约束范围,保证光标在div范围内,都是以父盒子div为参考对象的if(left<=0)left=0;if(left>=mask.offsetWidth)left=mask.offsetWidth;if(top<=0)top=0;if(top>=mask.offsetHeight)top=mask.offsetHeight//  修改元素的left|top属性值//遮罩层mask.style.left=left+'px';mask.style.top=top+'px'//放大镜,你向左移动鼠标,图片就是向右移动,运动方向是相反的big.style.left=-2*left+'px'big.style.top=-2*top+'px'}}
}</script>

放大镜就分享到这里,如有问题,欢迎指出~~~~~~如果对你有帮助欢迎点赞收藏一波哟

js实现放大镜(详细注释)相关推荐

  1. 【小f的刷题笔记】(JS)双指针 - 滑动窗口 四类典型问题(附JS模版和详细注释代码)LeetCode76 LeetCode567 LeetCode438 LeetCode3

    [滑动窗口] JS模版 利用map对象建立滑动窗口,相关题目都可以通过套框架来解决 ✔ LeetCode76 最小覆盖子串 ✔ LeetCode567 字符串的排列 ✔ LeetCode438 找到字 ...

  2. 放大镜用java怎么写_[Java教程]用js实现放大镜的效果

    [Java教程]用js实现放大镜的效果 0 2016-05-22 22:00:06 第一次发博客,还有点小激动,本人现在正在天津上大学,希望以后从事前端这一行业,学习的时间不长,写博客为了记录自己的学 ...

  3. vuex-stepbystep 经典案例,详细注释一步到位

    系列文章 [juejin.im/post/5c0e45-]vue-admin 详细注释,必须手把手做项目系列之(一 [juejin.im/post/5c1609- 详细注释,必须手把手做项目系列之(二 ...

  4. 案例:用JS实现放大镜特效

    案例:用JS实现放大镜特效 案例:用JS实现放大镜特效

  5. malloc 源码_【C++学习笔记(九)】之 new运算符的使用/ new 与 malloc的异同(附代码,详细注释)...

    new 运算符的使用 一. new的简单介绍: new运算符用于在堆区开辟空间,所有new出来的对象,对返回该类对象的指针. 二. new 与 malloc 的异同点: 1.malloc作用相同, m ...

  6. uboot 详细注释讲解

    转自:http://home.eeworld.com.cn/my/space-uid-135723-blogid-25548.html uboot 详细注释讲解 标签:  uboot  注释  讲解  ...

  7. 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释

    题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...

  8. 【详细注释】1058 选择题 (20 分)

    立志用最少的代码做最高效的表达 PAT乙级最优题解-->传送门 批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多. 输入格式: 输入在第一行给出两个正整 ...

  9. step7db块寻址_step7中的难点:间接寻址示例,中文详细注释。

    step7中的难点:间接寻址示例,中文详细注释. 推荐欢迎纠错,防止误导. FUNCTION "DBtoDB" : VOID //该功能块的作用是把一个数据块中的指定的一批数据,复 ...

  10. 快速傅里叶变换(FFT)的C#实现及详细注释

    快速傅里叶变换(FFT)的C#实现及详细注释 ----------------------------------------------------------------------------- ...

最新文章

  1. Nginx之location 匹配规则详解
  2. Xming+putty操作篇
  3. RT-Thread移植到STM32F103ZET6具体操作步骤(利用keil5新建工程,添加RT-Thread源码到工程)
  4. 关于IC工程师的VIM实际工作技巧
  5. 开源websocket
  6. Apache seaTunnel的本地启动
  7. Javascript隐式转换
  8. cms的 php代码,KingCMS/PHP可执行代码
  9. 徐昊:运用四色建模法进行领域分析
  10. bcscale php,【PHP开发】bcscale timezone charset的设定说明
  11. MySQL(20)--- 排序
  12. ssm框架图片上传与显示_SSM在线考试系统
  13. coxbox变换 python_怎样用Python实现对Xbox手柄的控制?
  14. 2020-11-17 一道有趣的求极限问题
  15. 搜索引擎的概念鄂州_搜索引擎的基本概念
  16. 红色警戒常用的快捷键
  17. 开源mysql执行平台_MySQL自动化审核平台部署说明
  18. Ubuntu系统耳机没声音
  19. 常用逻辑用语知识点【初级和中阶辅导】
  20. 干货|6个牛逼的基于Vue.js的后台控制面板,接私活必备

热门文章

  1. AI创企Astound获150万美元A轮融资,利用AI自动化员工服务请求
  2. ELK8.1从零搭建以及基本使用
  3. ps -ef 和ps -aux 和ps aux
  4. Gartner预计2019年全球半导体收入将下滑9.6%;苹果中国用户正流向华为;Facebook将支付50亿美元与FTC和解...
  5. 廖雪峰Python教程 实战day05
  6. 下载安装Tomcat9.0.44,并解决控制台乱码问题
  7. 流程控制之python
  8. lr 1 语法分析器c语言,LR语法分析器
  9. 用层次分析法建模解决交通问题论文
  10. BiliBili系列(二):个人历史数据爬取与分析