首页 >> 大全

JS原生放大镜

2023-09-10 大全 26 作者:考证青年

利用原生JS写一个放大

本文用于记录在学习写一个放大镜

放大镜的关键原理

鼠标在小图片上移动时,通过捕抓鼠标在小图片上的位置定位大图片的相应位置

做放大镜特效需要的元素

1.小图片

2.大图片

3.存放小图片和大图片的容器

4.一个放大镜

涉及的技术点

鼠标的移入移出鼠标移动3个事件

这里写图片描述

重点

1.如何让小图片的图片和大图片同时移动。坐标的计算。

这里写图片描述

主要计算的是一个比例

右边的放大部分相对于左边的放大镜来说,是一个固定的位置

图片中的ABCD都是按照相同的比例来放大的

左边放大镜的为X,小盒子的为B

右边显示的部分额为C,整一个大盒子的为D

我们需要计算的就是大盒子中的图片的left值。

因为大盒子是小盒子的等比例放大

X/B-A=?/D-C

图片中的ABCD都是可以求到的

通过X/B-A求到left的系数

        var parX  = left/(smallbox.offsetWidth-fdj.offsetWidth);

同理得到top的

     var parY = top/(smallbox.offsetHeight-fdj.offsetHeight);

然后

 oimg.style.left=-parX*(oimg.offsetWidth-bigbox.offsetWidth)+'px';oimg.style.top=-parY*(oimg.offsetHeight-bigbox.offsetHeight)+'px';

注意这里的parx和Y是负数,因为要反方向的移动

整体代码

页面部分


<html lang="en">
<head><meta charset="UTF-8"><title>Titletitle>
head>
<body><div id="box"><div id="box1"><div id="float-box">div><img src="./macbook-small.jpg" alt="">div><div id="box2"><img src="./macbook-big.jpg" alt="">div>div>
body>html>

css样式部分

    <style>*{padding: 0;margin: 0}#box{display: block;width: 400px;height: 255px;margin: 50px;position: relative;border: 1px solid #ccc;}#box1{position: relative;z-index: 1}#float-box{display: none;width: 160px;height: 120px;position: absolute;background: #ffffcc;border: 1px solid #ccc;opacity: 0.5;cursor: move}#box2{display: none;position: absolute;top: 0;left: 460px;width: 400px;height: 300px;overflow: hidden;border: 1px solid #ccc;z-index: 1}#box2 img{position: absolute;z-index: 5}style>

JS实现部分

<script>
window.onload=function () {var oBox = document.getElementById('box');  //获取整体盒子var smallbox=document.getElementById('box1'); //获取左边小盒子var fdj = document.getElementById('float-box'); //左边的放大镜var bigbox = document.getElementById('box2');  //右边的盒子var oimg = bigbox.getElementsByTagName('img')[0]; //右边盒子中的图片smallbox.onmouseover=function () {  //鼠标移入事件fdj.style.display='block';bigbox.style.display='block';}smallbox.onmouseout=function () {  //鼠标移出事件fdj.style.display='none';bigbox.style.display='none';}smallbox.onmousemove=function (ev) {  //鼠标移动事件var ev = ev||event;  //兼容var left=ev.clientX-oBox.offsetLeft-smallbox.offsetLeft-fdj.offsetWidth/2;  //放大镜的left,/2是为了鼠标在放大镜的中间,美观var top=ev.clientY-oBox.offsetTop-smallbox.offsetTop-fdj.offsetHeight/2; //放大镜的top,/2是为了鼠标在放大镜的中间,美观if(left<0){ //判断left的值,不让放大镜超出小盒子left=0;}else if(left>(smallbox.offsetWidth-fdj.offsetWidth)){left=smallbox.offsetWidth-fdj.offsetWidth;}if(top<0){ //判断top的值,不让放大镜超出小盒子top=0;}else if(top>(smallbox.offsetHeight-fdj.offsetHeight)){top=smallbox.offsetHeight-fdj.offsetHeight;}var parX  = left/(smallbox.offsetWidth-fdj.offsetWidth);var parY = top/(smallbox.offsetHeight-fdj.offsetHeight);//改变放大镜和右边图片的left和topfdj.style.left=left+'px';fdj.style.top=top+'px';oimg.style.left=-parX*(oimg.offsetWidth-bigbox.offsetWidth)+'px';oimg.style.top=-parY*(oimg.offsetHeight-bigbox.offsetHeight)+'px';}}script>

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了