效果展示

image.png思路

  • 使用jquery获取dom和css等
  • 主要是计算滑块在当前盒子中滑动的比例,到展示出来的图片在大盒子的位置
  • 动态计算

JS版本

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <style>
  9. *{
  10. margin: 0;
  11. padding: 0;
  12. }
  13. .wrapper{
  14. padding: 30px 10%;
  15. }
  16. .current-box , .target-box{
  17. float: left;
  18. }
  19. .current-box{
  20. position: relative;
  21. }
  22. .current-box .current-image-box{
  23. width: 300px;
  24. height: 300px;
  25. }
  26. .current-box .current-image-box img{
  27. width: 100%;
  28. height: 100%;
  29. }
  30. .current-box .mast{
  31. position: absolute;
  32. width: 100px;
  33. height:100px;
  34. background-color: rgba(255, 0, 0, 0.3);
  35. top: 0;
  36. left: 0;
  37. display:none;
  38. }
  39. .target-image-box{
  40. position: relative;
  41. width: 400px;
  42. height: 400px;
  43. overflow: hidden;
  44. border: 2px dashed #999;
  45. }
  46. .target-image-box .target-image{
  47. position: absolute;
  48. top: 0;
  49. left: 0;
  50. }
  51. </style>
  52. <body>
  53. <div class="wrapper">
  54. <div class="current-box">
  55. <div class="current-image-box">
  56. <img class="current-image" src="./images/1.jpeg"></img>
  57. </div>
  58. <div class="mast"></div>
  59. </div>
  60. <div class="target-image-box">
  61. <img class="target-image" src="./images/1.jpeg"></img>
  62. </div>
  63. </div>
  64. </body>
  65. <script>
  66. // 思路,
  67. // 1、通过计算当前照片和mask的比例计算出要展示的照片的大小来
  68. let wrapper = document.getElementsByClassName('wrapper')[0],
  69. currentBox = document.getElementsByClassName('current-box')[0],
  70. currentImageBox = document.getElementsByClassName('current-image-box')[0],
  71. currentImage = document.getElementsByClassName('current-image')[0],
  72. mast = document.getElementsByClassName('mast')[0],
  73. targetImageBox = document.getElementsByClassName('target-image-box')[0],
  74. targetImage = document.getElementsByClassName('target-image')[0];
  75. // 获取元素的高度和宽地的方法
  76. function getStyle(element,attr){
  77. return Number.parseInt(window.getComputedStyle(element)[attr])
  78. }
  79. // 设置css样式的方法
  80. function setCss(element,attr,value){
  81. element.style[attr] = value
  82. }
  83. // 获取offset到BODY的距离
  84. function offset(element){
  85. let offsetL = element.offsetLeft,
  86. offsetT=element.offsetTop,
  87. parentEle=element.offsetParent;
  88. while(parentEle&&parentEle.targetName !=='BODY'){
  89. offsetL+= parentEle.offsetLeft;
  90. offsetT+= parentEle.offsetTop;
  91. parentEle = parentEle.offsetParent;
  92. }
  93. return {
  94. left:offsetL,
  95. top:offsetT
  96. }
  97. }
  98. // 让mask比上当前盒子的比例乘以目标盒子的宽高为目标图片的宽高
  99. let currentH = getStyle(currentBox,'height'),
  100. currentW = getStyle(currentBox,'width'),
  101. currentL = currentBox.offsetLeft,
  102. currentT = currentBox.offsetTop,
  103. mastH = getStyle(mast,'height'),
  104. mastW = getStyle(mast,'width'),
  105. mastL = offset(mast).left,
  106. mastT = offset(mast).top,
  107. targetW = getStyle(targetImageBox,'height'),
  108. targetH = getStyle(targetImageBox,'width');
  109. setCss(targetImage,'width', currentW/mastW*targetW + 'px')
  110. setCss(targetImage,'height', currentH/mastH*targetH + 'px')
  111. let scale = currentW/mastW*targetW / currentW;
  112. // console.log(scale,'scale') // 4
  113. // 2、按住遮照鼠标状态变为move状态,绑定移动事件
  114. // 3、计算进入的时候的当前点的坐标,计算滑动的距离占
  115. let entryPointX,entryPointY,slideX,slideY;
  116. // 计算滑动的值
  117. function computed(ev){
  118. let offsetX = ev.pageX - currentL - mastH/2,
  119. offsetY = ev.pageY- currentT - mastW/2;
  120. // 边界判断
  121. let minL = 0,
  122. minT = 0,
  123. maxL = currentW - mastW,
  124. maxT = currentH- mastH;
  125. offsetX = offsetX < minL ? 0 : offsetX > maxL? maxL : offsetX;
  126. offsetY = offsetY < minT ? 0: offsetY > maxT? maxT : offsetY;
  127. setCss(mast,'top', offsetY + 'px')
  128. setCss(mast,'left', offsetX + 'px')
  129. // 判断目标图片滑动的距离,和mask是相反的倍数关系
  130. setCss(targetImage,'top', - offsetY*scale + 'px')
  131. setCss(targetImage,'left', - offsetX*scale + 'px')
  132. }
  133. currentBox.addEventListener('mouseenter',function(ev){
  134. setCss(mast,'cursor', 'move')
  135. setCss(mast,'display', 'block')
  136. computed(ev)
  137. })
  138. currentBox.addEventListener('mousemove',computed)
  139. currentBox.addEventListener('mouseleave',function(ev){
  140. setCss(mast,'cursor', 'default')
  141. setCss(mast,'display', 'none')
  142. })
  143. </script>
  144. </html>

jQuery版本

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>放大镜</title>
  7. <style>
  8. .magnifier {
  9. box-sizing: border-box;
  10. margin: 20px auto;
  11. width: 600px;
  12. }
  13. .magnifier .abbre,
  14. .magnifier .origin {
  15. float: left;
  16. }
  17. .magnifier .abbre {
  18. position: relative;
  19. box-sizing: border-box;
  20. width: 250px;
  21. height: 240px;
  22. }
  23. .magnifier .abbre img {
  24. width: 100%;
  25. height: 100%;
  26. }
  27. .magnifier .abbre .mark {
  28. display: none;
  29. position: absolute;
  30. top: 0;
  31. left: 0;
  32. width: 20px;
  33. height: 10px;
  34. background: rgba(255, 0, 0, .3);
  35. cursor: move;
  36. }
  37. .magnifier .origin {
  38. display: none;
  39. position: relative;
  40. box-sizing: border-box;
  41. width: 350px;
  42. height: 340px;
  43. overflow: hidden;
  44. }
  45. .magnifier .origin img {
  46. position: absolute;
  47. top: 0;
  48. left: 0;
  49. }
  50. </style>
  51. </head>
  52. <body>
  53. <section class="magnifier clearfix">
  54. <!-- 左侧缩略图 -->
  55. <div class="abbre">
  56. <img src="images/1.jpeg" alt="">
  57. <div class="mark"></div>
  58. </div>
  59. <!-- 右侧原图(大图) -->
  60. <div class="origin">
  61. <img src="images/1.jpeg" alt="">
  62. </div>
  63. </section>
  64. <script src="js/jquery/dist/jquery.min.js"></script>
  65. <script>
  66. // 1.等待DOM结构加载完 DOMContentLoaded
  67. // 2.形成一个闭包,保证私有性
  68. $(function () {
  69. let $magnifier = $('.magnifier'),
  70. $abbre = $magnifier.find('.abbre'),
  71. $mark = $abbre.find('.mark'),
  72. $origin = $magnifier.find('.origin'),
  73. $originImg = $origin.find('img');
  74. // 首先按照比例计算大图的样式
  75. let abbreW = $abbre.width(),
  76. abbreH = $abbre.height(),
  77. markW = $mark.width(),
  78. markH = $mark.height(),
  79. originW = $origin.width(),
  80. originH = $origin.height(),
  81. originImgW = null,
  82. originImgH = null,
  83. offset = $abbre.offset();
  84. originImgW = originW / (markW / abbreW);
  85. originImgH = originH / (markH / abbreH);
  86. $originImg.css({
  87. width: originImgW,
  88. height: originImgH
  89. });
  90. // 处理鼠标在ABBRE中进入,离开,移动的相关操作
  91. function computed(ev) {
  92. // 计算MARK的位置以及根据MARK的移动计算出大图的移动距离
  93. let markT = ev.pageY - offset.top - markH / 2,
  94. markL = ev.pageX - offset.left - markW / 2,
  95. originImgL = null,
  96. originImgT = null;
  97. // 边界判断
  98. let minL = 0,
  99. minT = 0,
  100. maxL = abbreW - markW,
  101. maxT = abbreH - markH;
  102. markL = markL < minL ? minL : (markL > maxL ? maxL : markL);
  103. markT = markT < minT ? minT : (markT > maxT ? maxT : markT);
  104. originImgL = markL / abbreW * originImgW;
  105. originImgT = markT / abbreH * originImgH;
  106. $mark.css({
  107. left: markL,
  108. top: markT
  109. });
  110. $originImg.css({
  111. left: -originImgL,
  112. top: -originImgT
  113. });
  114. }
  115. $abbre.mouseenter(function (ev) {
  116. $mark.css('display', 'block');
  117. $origin.css('display', 'block');
  118. computed(ev);
  119. })
  120. .mousemove(computed)
  121. .mouseleave(function (ev) {
  122. $mark.css('display', 'none');
  123. $origin.css('display', 'none');
  124. });
  125. });
  126. </script>
  127. </body>
  128. </html>