放大镜特效 html+css+js

举报
北极光之夜。 发表于 2021/04/20 00:57:14 2021/04/20
【摘要】 效果: 前言: 思路是看up主xiao-high的,然后自己也弄了一个。效果有一个缺点就是图片边缘区域放大不了。 实现: 定义标签:.frame是底层盒子,img是小图片,宽设置100%,跟底层盒子一样。.circle是放大镜,.circle里的img是放在.circle里的大图片。 <div class="frame"> <img src="25.jp...

效果:

在这里插入图片描述

前言:

思路是看up主xiao-high的,然后自己也弄了一个。效果有一个缺点就是图片边缘区域放大不了。

实现:

  1. 定义标签:.frame是底层盒子,img是小图片,宽设置100%,跟底层盒子一样。.circle是放大镜,.circle里的img是放在.circle里的大图片。
 <div class="frame"> <img src="25.jpg" width="100%"> <div class="circle"> <img src="25.jpg"> </div>
</div>  

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 底层盒子样式:高就不设置了,让小图片把盒子撑开。因为宽是800px,所以放的图片本身宽像素大过800才行,最好是那种电脑壁纸,够大够清晰。
 .frame{ width: 800px; min-height: 200px; position: relative; }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 设置放大镜样式,设置绝对定位。
 .circle{ position: absolute; top: 0; left: 0; width: 200px; height: 200px; border: 5px solid rgb(0, 0, 0); box-shadow: 0 0 5px rgb(0,0,0); border-radius: 50%; overflow: hidden; cursor:pointer; opacity: 0; }
 .frame:hover .circle{ opacity: 1; }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

border: 5px solid rgb(0, 0, 0); 黑色边框。
box-shadow: 0 0 5px rgb(0,0,0); 阴影。
border-radius: 50%; 角的弧度。
cursor:pointer; 鼠标经过样式为小手。
opacity: 0; 透明度为0,鼠标经过为1。

  1. 放大镜里的图片样式,不设置宽高了,让它原本大小就好:
 .circle img{ position: absolute; top: 0; left: 0; }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. js部分,注释也在里面了:
<script> /*  先获取元素,底层盒子,放大镜,放大镜里的大图 */ var frame = document.querySelector('.frame'); var circle = document.querySelector('.circle'); var picture = document.querySelector('.circle img'); /*  给底层盒子绑定一个鼠标移动的事件 */ frame.addEventListener('mousemove',function(e){ /*  放大镜左右移动 */ /*  获取鼠标距离左边距离 */ let x = e.clientX; /*  获取底层盒子距离左边距离 */ let left = frame.offsetLeft; /*  放大镜左右移动距离就是 x 减 left 再减去本身宽度一半 */ let moveX = x - left - circle.offsetWidth/2; /*  如果是移动距离是负数就等于零。相当于放大镜在底层盒子最左边时,不要让他跑出去 */ if(moveX<=0) moveX=0; /* 以此类推,相当于放大镜在底层盒子最右边时,不要让他跑出去 */ if(moveX>=frame.offsetWidth - circle.offsetWidth )   moveX= frame.offsetWidth - circle.offsetWidth ; /* 放大镜移动 */ circle.style.left = moveX + 'px'; /* 放大镜里大图片移动距离。就是按比例算,鼠标移动距离/小图宽度=大图移动距离/大图宽度  可以想象一下这个比例。*/ let moveleft = ( moveX + circle.offsetWidth/2 ) / frame.offsetWidth * picture.offsetWidth - circle.offsetWidth/2; /* 大图移动,向左移动,所以是负数 */ picture.style.left = -moveleft + 'px'; /* 放大镜上下移动,跟上面左右移动是一样的原理 */ let y = e.clientY; let top = frame.offsetTop; let moveY = y - top - circle.offsetHeight/2; if(moveY<=0) moveY=0; if(moveY>=frame.offsetHeight - circle.offsetHeight ) moveY= frame.offsetHeight - circle.offsetHeight ; circle.style.top = moveY + 'px'; let movetop = ( moveY + circle.offsetHeight/2 ) / frame.offsetHeight * picture.offsetHeight - circle.offsetHeight/2; picture.style.top = -movetop + 'px'; }) </script>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

完整代码:

<!DOCTYPE html>
<html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> *{ margin: 0; padding: 0; box-sizing:border-box; } body{ height: 100vh; display: flex; justify-content: center; align-items: center; } .frame{ width: 800px; min-height: 200px; position: relative; } .frame:hover .circle{ opacity: 1; } .circle{ position: absolute; top: 0; left: 0; width: 200px; height: 200px; border: 5px solid rgb(0, 0, 0); box-shadow: 0 0 5px rgb(0,0,0); border-radius: 50%; overflow: hidden; cursor:pointer; opacity: 0; } .circle img{ position: absolute; top: 0; left: 0; } </style>
</head>
<body> <div class="frame"> <img src="25.jpg" width="100%"> <div class="circle"> <img src="25.jpg"> </div>
</div> <script> var frame = document.querySelector('.frame'); var circle = document.querySelector('.circle'); var picture = document.querySelector('.circle img'); frame.addEventListener('mousemove',function(e){ /*  左右 */ let x = e.clientX; let left = frame.offsetLeft; let moveX = x - left - circle.offsetWidth/2; if(moveX<=0) moveX=0; if(moveX>=frame.offsetWidth - circle.offsetWidth )   moveX= frame.offsetWidth - circle.offsetWidth ; circle.style.left = moveX + 'px'; let moveleft = ( moveX + circle.offsetWidth/2 ) / frame.offsetWidth * picture.offsetWidth - circle.offsetWidth/2; picture.style.left = -moveleft + 'px'; /* 上下 */ let y = e.clientY; let top = frame.offsetTop; let moveY = y - top - circle.offsetHeight/2; if(moveY<=0) moveY=0; if(moveY>=frame.offsetHeight - circle.offsetHeight ) moveY= frame.offsetHeight - circle.offsetHeight ; circle.style.top = moveY + 'px'; let movetop = ( moveY + circle.offsetHeight/2 ) / frame.offsetHeight * picture.offsetHeight - circle.offsetHeight/2; picture.style.top = -movetop + 'px'; }) </script>
</body>
</html>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103

最后:

其它文章~:
简约时钟特效 html+css+js
赛博朋克风格按钮 html+css
响应式卡片悬停效果 html+css
水波加载动画 html+css
导航栏滚动渐变效果 html+css+js
书本翻页 html+css
3D立体相册 html+css
炫彩流光按钮 html+css
记一些css属性总结(一)
Sass总结笔记
…等等

最后:

Bye~

文章来源: blog.csdn.net,作者:北极光之夜。,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/luo1831251387/article/details/113603911

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。