经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
js详细讲解放大镜的实现
来源:cnblogs  作者:南风晚来晚相识  时间:2023/9/10 18:53:45  对本文有异议

实现放大镜的整体思路

  1. 1.当鼠标放在图片上的时候,出现蒙层。
  2. 2.出现蒙层,让鼠标在蒙层中心
  3. 3.限制蒙层移动的范围
  4. 4.放大镜移动

最终实现的效果

  1. 鼠标放上去的时候,出现一个蒙层。
  2. 蒙层的移动范围只能在图片里,不能超出范围。
  3. 移动蒙层时,右侧会出现图片的放大部分。
  4. 移除图片的范围,放大镜消失。

鼠标放上去时候出现蒙层

  1. <style>
  2. *{
  3. padding: 0;
  4. margin: 0;
  5. }
  6. .box{
  7. margin-left: 400px;
  8. margin-top: 150px;
  9. position: relative;
  10. }
  11. .small-box{
  12. position: absolute;
  13. /* 图片的大小 */
  14. height: 450px;
  15. width: 450px;
  16. }
  17. .mask {
  18. position: absolute;
  19. left: 0;
  20. top: 0;
  21. display: none;
  22. width: 300px;
  23. height: 300px;
  24. z-index: 3;
  25. border: 1px solid #aaa;
  26. background: 50% top no-repeat #fede4f;
  27. opacity: .5;
  28. -moz-opacity: .5;
  29. -khtml-opacity: .5;
  30. filter: alpha(Opacity=50);
  31. cursor: move;
  32. }
  33. .big-box{
  34. position: relative;
  35. display: none;
  36. /* 右侧放大镜盒子的大小 */
  37. width: 500px;
  38. height: 500px;
  39. /* 盒子肯定比图片小,然后使用超出裁剪 */
  40. overflow: hidden;
  41. /* 定位右侧盒子的位置 */
  42. top: 0px;
  43. /* 留了一个单位的像素处来,好区别 */
  44. left:451px;
  45. }
  46. #bigImg{
  47. position: absolute;
  48. }
  49. .small-box:hover .mask{
  50. display: block;
  51. }
  52. .small-box:hover + .big-box{
  53. display: block;
  54. }
  55. </style>
  1. <body>
  2. <div id="box" class="box">
  3. <!-- 页面上看见的小图 -->
  4. <div id="smallBox" class="small-box">
  5. <img src="https://img11.360buyimg.com/n1/s450x450_jfs/t1/125337/25/33944/39827/643cecaaFe632cc8e/b33f7ab378a5c0d3.jpg">
  6. <div class="mask" id="mask"></div>
  7. </div>
  8. </div>
  9. <!-- 放大的图 -->
  10. <div class="big-box" id="bigBox">
  11. <img id="bigImg" src="https://img14.360buyimg.com/n0/jfs/t1/125337/25/33944/39827/643cecaaFe632cc8e/b33f7ab378a5c0d3.jpg.avif" class="">
  12. </div>
  13. </div>
  14. </body>

计算蒙层坐标的中心位置

  1. 1.我们首先要计算一个坐标点的位置。
  2. 获取蒙层坐标点的位置
  3. let mask_x= e.pageX - box.offsetLeft
  4. let mask_y= e.pageY - box.offsetTop
  5. 现在我们得到了坐标点的位置。
  6. 如何计算蒙层坐标的中心位置呢?
  7. mask_x= mask_x-mask.offsetWidth/2
  8. mask_y= mask_y-mask.offsetHeight/2
  9. 也就是将 mask_x 向左移动了mask元素宽度的一半。
  10. 特别说明:
  11. offsetLeft 是指当前元素相对其距离自己最近的具有定位属性的父级元素的偏移值。
  12. margin,定位,border也会影响offsetLeft的值。但是padding不会影响。

  1. <body>
  2. <div id="box" class="box">
  3. <!-- 页面上看见的小图 -->
  4. <div id="smallBox" class="small-box">
  5. <img src="https://img11.360buyimg.com/n1/s450x450_jfs/t1/125337/25/33944/39827/643cecaaFe632cc8e/b33f7ab378a5c0d3.jpg">
  6. <div class="mask" id="mask"></div>
  7. </div>
  8. <!-- 放大的图 -->
  9. <div class="big-box" id="bigBox">
  10. <img src="https://img14.360buyimg.com/n0/jfs/t1/125337/25/33944/39827/643cecaaFe632cc8e/b33f7ab378a5c0d3.jpg.avif" class="">
  11. </div>
  12. </div>
  13. </body>
  1. <script>
  2. let smallBox=document.getElementById('smallBox')
  3. let box=document.getElementById('box')
  4. let mask=document.getElementById('mask')
  5. smallBox.onmousemove =function(e){
  6. // 获取蒙层坐标点的位置
  7. let mask_x= e.pageX - box.offsetLeft
  8. let mask_y= e.pageY - box.offsetTop
  9. // 计算蒙层坐标点的中心位置
  10. mask_x-= mask.offsetWidth/2
  11. mask_y-= mask.offsetHeight/2
  12. mask.style.left = mask_x+'px'
  13. mask.style.top = mask_y+'px'
  14. }
  15. </script>

限制移动的范围

  1. 在移动蒙层的的时候,是有范围限制的。
  2. X轴最大的范围是: smallBox.offsetWidth-mask.offsetWidth,最小范围是0
  3. Y轴的最大范围是: smallBox.offsetHeight-mask.offsetHeight,最小范围是0

  1. <script>
  2. let smallBox=document.getElementById('smallBox')
  3. let box=document.getElementById('box')
  4. let mask=document.getElementById('mask')
  5. smallBox.onmousemove =function(e){
  6. // 获取蒙层坐标点的位置
  7. let mask_x= e.pageX - box.offsetLeft
  8. let mask_y= e.pageY - box.offsetTop
  9. // 计算蒙层坐标点的中心位置
  10. mask_x-= mask.offsetWidth/2
  11. // mask_x-= mask.offsetWidth - mask_x /2
  12. mask_y-= mask.offsetHeight/2
  13. // 获取X可以移动的最大值
  14. let moveMaxX= smallBox.offsetWidth-mask.offsetWidth
  15. // 获取y可以移动的最大值
  16. let moveMaxY= smallBox.offsetHeight-mask.offsetHeight
  17. // X轴最小值和最大值
  18. if(mask_x<0){
  19. mask_x=0
  20. }
  21. if(mask_x>moveMaxX){
  22. mask_x=moveMaxX
  23. }
  24. // Y轴最小值和最大值
  25. if(mask_y<0){
  26. mask_y=0
  27. }
  28. if(mask_y>moveMaxY){
  29. mask_y=moveMaxY
  30. }
  31. mask.style.left = mask_x+'px'
  32. mask.style.top = mask_y+'px'
  33. }
  34. </script>

大图的移动

  1. 当我们的蒙层向右移动的时候,
  2. 我们的大图实际上是向左移动的。
  3. 移动的公式:
  4. bigImg.style.left= -mask_x *(bigBox.offsetWidth/mask.offsetWidth) + 'px'
  5. bigImg.style.top= -mask_y *(bigBox.offsetHeight/mask.offsetHeight) + 'px'
  1. <script>
  2. let smallBox=document.getElementById('smallBox')
  3. let box=document.getElementById('box')
  4. let mask=document.getElementById('mask')
  5. let bigBox = document.getElementById('bigBox')
  6. smallBox.onmousemove =function(e){
  7. // 获取蒙层坐标点的位置
  8. let mask_x= e.pageX - box.offsetLeft
  9. let mask_y= e.pageY - box.offsetTop
  10. // 计算蒙层坐标点的中心位置
  11. mask_x-= mask.offsetWidth/2
  12. mask_y-= mask.offsetHeight/2
  13. // 获取X可以移动的最大值
  14. let moveMaxX= smallBox.offsetWidth-mask.offsetWidth
  15. // 获取y可以移动的最大值
  16. let moveMaxY= smallBox.offsetHeight-mask.offsetHeight
  17. // X轴最小值和最大值
  18. if(mask_x<0){
  19. mask_x=0
  20. }
  21. if(mask_x>moveMaxX){
  22. mask_x=moveMaxX
  23. }
  24. // Y轴最小值和最大值
  25. if(mask_y<0){
  26. mask_y=0
  27. }
  28. if(mask_y>moveMaxY){
  29. mask_y=moveMaxY
  30. }
  31. mask.style.left = mask_x+'px'
  32. mask.style.top = mask_y+'px'
  33. // 右侧的放大图
  34. bigImg.style.left= -mask_x *(bigBox.offsetWidth/mask.offsetWidth) + 'px'
  35. bigImg.style.top= -mask_y *(bigBox.offsetHeight/mask.offsetHeight) + 'px'
  36. }
  37. </script>

原文链接:https://www.cnblogs.com/IwishIcould/p/17674318.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号