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 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8 <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> 9 <style> 10 .magnifierbox{ 11 margin:20px auto; 12 width:600px; 13 height:300px; 14 overflow:hidden; 15 position:relative; 16 } 17 .magnifierbox .smallbox,.magnifierbox .bigbox{ 18 float:left; 19 width:300px; 20 height:100%; 21 overflow:hidden; 22 position:relative; 23 } 24 .magnifierbox .bigbox img { 25 position:absolute; 26 top:0; 27 left:0; 28 } 29 .magnifierbox .smallbox .mark{ 30 position:absolute; 31 top:0; 32 left:0; 33 z-index:10; 34 width:100px; 35 height:100px; 36 background:#E01D20; 37 opacity:0.3; 38 filter:alpha(opacity=30); 39 cursor:move; 40 } 41 .magnifierbox .smallbox .mark{ 42 display:none; 43 } 44 </style> 45 </head> 46 <body> 47 <section class="magnifierbox"> 48 <div class="smallbox"> 49 <img src="./small.jpg" alt=""> 50 <div class="mark"></div> 51 </div> 52 <div class="bigbox"> 53 <img src="./big.jpg" alt=""> 54 </div> 55 </section> 56 57 <script> 58 <!--1、鼠标进入和离开smallbox,需要控制mark盒子以及bigbox的显示和隐藏 --> 59 <!--2、控制mark盒子在samllbox中运动,但是不能超过界限 --> 60 <!--3、当mark和子在samllbox移动的时候,根据mark盒子移动的距离,--> 61 <!-- 计算出bigbox移动的距离(samllbox移动一点距离,bigbox盒子移动方向与samllbox移动相反, --> 62 <!-- 且x/y轴移动是三倍,这里做的是两个图是1:3的关系) --> 63 <!-- add方法是讲一个元素加入到一个jquery集合中 --> 64 $(function(){ 65 var $magnifierbox = $(".magnifierbox"), 66 $smallbox = $magnifierbox.find(".smallbox"), 67 $mark = $magnifierbox.find(".mark"), 68 $bigbox = $magnifierbox.find(".bigbox"), 69 $bigimg = $bigbox.find("img"); 70 71 $smallbox.on("mouseenter",function(event){ 72 <!-- 刚进入盒子计算宽高需要确定盒子位置 --> 73 computedMark(event) 74 $mark.add($bigbox).css("display","block") 75 }).on("mouseleave",function(){ 76 $mark.add($bigbox).css("display","none") 77 }).on("mousemove",function(event){ 78 <!-- jqeruy对event对象经过包装过了,对所有的浏览器都兼容 --> 79 <!--mark盒子移动时计算盒子的距离 --> 80 computedMark(event); 81 }) 82 83 <!-- <--实时计算mark盒子的位置--> --> 84 function computedMark(event){ 85 <!-- 获取magnifierbox盒子距离html左上角顶点的距离 --> 86 var pL = $magnifierbox.offset().left, 87 pT = $magnifierbox.offset().top, 88 mcL = event.clientX, #鼠标距离左上角X距离 89 mcT = event.clientY, #鼠标距离左上角Y距离 90 mw = $mark.innerWidth(), #mark宽度 91 mh = $mark.innerHeight(), #mark高度 92 dpL = (mcL - pL)-mw/2, #mark盒子距离父盒子左上角X距离 93 dpT = (mcT - pT)-mh/2, #mark盒子距离父盒子左上角Y距离 94 sw = $smallbox.width(), #mark父盒子宽度 95 sh = $smallbox.height(), ##mark父盒子高度 96 swMax = sw - mw, #mark能移动的最小宽度 97 shMax = sh - mh, #mark能移动的最大高度 98 swMin = 0, #mark能移动的最小宽度 99 shMin = 0; #mark能移动的最小高度 100 dpL = dpL < swMin?swMin:(dpL>swMax?swMax:dpL); 101 dpT = dpT < shMin?shMin:(dpT>shMax?shMax:dpT); 102 <!--设置mark盒子移动位置:注意:这里将是鼠标箭头移到了mark盒子中点位置 --> 103 $mark.css({ 104 top:dpT, 105 left:dpL, 106 }) 107 <!-- 注意:小图和大图相差三倍,如果不是整数比例还得计算 --> 108 $bigimg.css({ 109 top:-dpT*3, 110 left:-dpL*3, 111 }) 112 } 113 }) 114 115 </script> 116 </body> 117 </html>