js实现放大镜!
今天老王交我们写了放大镜
分享一下战果:
| <!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> | |
| * { | |
| padding: 0; | |
| margin: 0; | |
| } | |
| a { | |
| text-decoration: none; | |
| color: inherit; | |
| } | |
| li { | |
| list-style: none; | |
| } | |
| img { | |
| vertical-align: top; | |
| } | |
| .w { | |
| width: 1140px; | |
| margin: 0 auto; | |
| } | |
| .preview-intro { | |
| margin-top: 100px; | |
| } | |
| .preview-intro .preview-wrap { | |
| width: 400px; | |
| float: left; | |
| margin-right: 100px; | |
| /* background-color: coral; */ | |
| position: relative; | |
| } | |
| .preview-intro .preview-wrap .preview { | |
| width: 400px; | |
| height: 400px; | |
| border: 1px solid #000; | |
| position: relative; | |
| } | |
| .preview-intro .preview-wrap .preview .shadow { | |
| width: 150px; | |
| height: 150px; | |
| background-color: rgba(0, 0, 0, 0.5); | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| display: none; | |
| } | |
| .preview-intro .preview-wrap .preview img { | |
| width: 100%; | |
| height: 100%; | |
| } | |
| .preview-scale { | |
| position: absolute; | |
| width: 400px; | |
| height: 400px; | |
| background-color: rgba(125, 255, 255, 0.5); | |
| position: absolute; | |
| left: 500px; | |
| top: 0; | |
| overflow: hidden; | |
| display: none; | |
| } | |
| .preview-scale img { | |
| width: 1066px; | |
| height: 1066px; | |
| position: absolute; | |
| left: 0; | |
| top: 0; | |
| /* z-index: -1; */ | |
| } | |
| .preview-intro .itemInfo { | |
| overflow: hidden; | |
| background-color: pink; | |
| height: 600px; | |
| } | |
| .previewList { | |
| display: flex; | |
| } | |
| .previewList li { | |
| flex: 1; | |
| margin: 10px; | |
| border: 2px solid transparent; | |
| } | |
| .previewList .active { | |
| border-color: red; | |
| } | |
| .previewList li img { | |
| width: 100%; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="preview-intro w"> | |
| <div class="preview-wrap left"> | |
| <div class="preview"> | |
| <div class="shadow"></div> | |
| <img class="smallImg" src="../images/girlsmall1.jpg" alt=""> | |
| </div> | |
| <div class="preview-scale"> | |
| <img class="bigImg" src="../images/girlbig1.jpg" alt=""> | |
| </div> | |
| <div class="previewList"> | |
| <li class="active"><img src="../images/girlsmall1.jpg" bigImg="../images/girlbig1.jpg" alt=""></li> | |
| <li><img src="../images/girlsmall2.jpg" bigImg="../images/girlbig2.jpg" alt=""></li> | |
| <li><img src="../images/girlsmall3.jpg" bigImg="../images/girlbig3.jpg" alt=""></li> | |
| <li><img src="../images/girlsmall4.jpg" bigImg="../images/girlbig4.jpg" alt=""></li> | |
| </div> | |
| </div> | |
| <!-- <div class="itemInfo right"></div> --> | |
| </div> | |
| </body> | |
| <script> | |
| // 放大镜 | |
| // 1. 等比例缩放(放大时 也是等比例的) => 布局 | |
| // shadow smallImg | |
| // ------------ = ---------- | |
| // previewScale bigImg | |
| // 2. 左边 移动的shadow 右边移动的是图片(定位) | |
| // 3. shadow 和 右边大图片移动的方向是相反的,shadow移动的距离和大图片移动的距离也是等比例的 | |
| // smallImgList = [] | |
| // bigImgList = [] | |
| // 下标对应 | |
| var previewWrap = document.getElementsByClassName("preview-wrap")[0]; | |
| var preview = document.getElementsByClassName("preview")[0]; | |
| var shadow = document.getElementsByClassName("shadow")[0]; | |
| var previewScale = document.getElementsByClassName("preview-scale")[0]; | |
| var smallImg = document.getElementsByClassName("smallImg")[0]; | |
| var bigImg = document.getElementsByClassName("bigImg")[0]; | |
| var previewList = document.querySelectorAll(".previewList li"); | |
| // clientWidth/clientHeight 快捷取值 对于隐藏的元素(shadow,previewScale) 不生效 | |
| // 解决方法2 | |
| // b. 等元素显示之后再获取 => 在onmousemove中取值 | |
| var smallImgList = ["../images/girlsmall1.jpg", "../images/girlsmall2.jpg", "../images/girlsmall3.jpg", "../images/girlsmall4.jpg"]; | |
| var bigImgList = ["../images/girlbig1.jpg", "../images/girlbig2.jpg", "../images/girlbig3.jpg", "../images/girlbig4.jpg"]; | |
| for (let i = 0; i < previewList.length; i++) { | |
| let li = previewList[i]; | |
| li.onmouseenter = function () { | |
| for (let j = 0; j < previewList.length; j++) { | |
| previewList[j].classList.remove("active"); | |
| } | |
| this.classList.add("active"); | |
| // 第一种 | |
| // var img = this.children[0]; // li>img | |
| // console.log(img); | |
| // var smallUrl = img.getAttribute("src"); | |
| // var bigUrl = img.getAttribute("bigImg"); | |
| // console.log(smallUrl, bigUrl); | |
| // smallImg.src = smallUrl; | |
| // bigImg.src = bigUrl; | |
| // 第二种 | |
| smallImg.src = smallImgList[i]; | |
| bigImg.src = bigImgList[i]; | |
| } | |
| } | |
| preview.onmouseenter = function () { | |
| previewScale.style.display = "block"; | |
| shadow.style.display = "block"; | |
| } | |
| preview.onmousemove = function (e) { | |
| var e = e || window.event; | |
| // b. 等元素显示之后再获取 => 在onmousemove中取值 | |
| var maxLeft = preview.clientWidth - shadow.clientWidth; | |
| var maxTop = preview.clientHeight - shadow.clientHeight; | |
| console.log(preview.clientWidth, shadow.clientWidth); | |
| // console.log(maxLeft, maxTop); | |
| var scale = previewScale.clientWidth / shadow.clientWidth; //放大镜缩放比例 | |
| console.log(scale); | |
| // 为什么找preview的offsetLeft,offsetTop 值为0; | |
| // 因为布局影响 previewWrap 设置了position:relative,所以此时preview返回的是相对于previewWrap的偏移 0 0 , 为了找到真正偏移 所以我们向外跳了一层 找previewWrap相对于文档左边和上边的偏移 | |
| var x = e.pageX - previewWrap.offsetLeft - shadow.clientWidth / 2; | |
| var y = e.pageY - previewWrap.offsetTop - shadow.clientHeight / 2; | |
| if (x < 0) x = 0; | |
| if (x >= maxLeft) x = maxLeft; | |
| if (y < 0) y = 0; | |
| if (y > maxTop) y = maxTop; | |
| // console.log(previewWrap.offsetLeft, previewWrap.offsetTop); | |
| shadow.style.left = x + "px"; | |
| shadow.style.top = y + "px"; | |
| // 右边移动的是大图片 | |
| bigImg.style.left = -scale * x + "px"; | |
| bigImg.style.top = -scale * y + "px"; | |
| } | |
| preview.onmouseleave = function () { | |
| previewScale.style.display = "none"; | |
| shadow.style.display = "none"; | |
| } | |
| </script> | |
| </html> |
图片加载不出来,但原理不变! 要注意右边盒子消失时,重新计算鼠标到document左边的距离.
哈哈哈哈,写出来还蛮有成就感的!

浙公网安备 33010602011771号