JavaScript实现放大镜效果代码示例


Posted in Javascript onApril 29, 2020

JavaScript实现放大镜效果:

<!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>
    .smallBgImg {
      width: 350px;
      height: 350px;
      border: 1px solid #ccc;
      box-sizing: border-box;
      background-clip: padding-box;
      float: left;
      position: relative;
      cursor: pointer;
    }

    .move {
      border: 1px solid #ccc;
      box-sizing: border-box;
      background: rgba(165, 201, 66, 0.5);
      position: absolute;
      left: 0;
      top: 0;
    }

    .bigBgImg {
      width: 540px;
      height: 540px;
      border: 1px solid #ccc;
      box-sizing: border-box;
      background-clip: padding-box;
      float: left;
      margin-left: 10px;
    }

    .hidden {
      display: none;
    }
  </style>
</head>

<body>
  <div class="smallBgImg">
    <div class="move hidden">

    </div>
  </div>
  <div class="bigBgImg hidden">

  </div>
  <script>
    (function () {
      //基本信息配置
      var config = {
        smallImg: "./image/smallImg.jpg", //小图路径
        smallDom: document.getElementsByClassName("smallBgImg")[0], //小图 dom对象
        bigImg: "./image/bigImg.jpg", //大图路径
        bigDom: document.getElementsByClassName("bigBgImg")[0], //大图 dom对象
        moveDom: document.getElementsByClassName("move")[0], //移动方块的dom对象
        smallSize: { //小图尺寸
          width: 350,
          height: 350
        },
        bigSize: { //大图尺寸
          width: 800,
          height: 800
        },
        divBigSize: { //大图框的尺寸
          width: 540,
          height: 540
        }
      };
      //根据比例尺计算移动框的宽高 移动框/小图尺寸 = 大框尺寸/大图尺寸
      config.moveSize = {
        width: config.divBigSize.width * config.smallSize.width / config.bigSize.width,
        height: config.divBigSize.height * config.smallSize.height / config.bigSize.height
      };
      //小图style的计算值
      config.smallComputedStyle = window.getComputedStyle(config.smallDom);
      //大图style的计算值
      config.bigComputedStyle = window.getComputedStyle(config.bigDom);
      //移动方块style的计算值
      config.moveComputedStyle = window.getComputedStyle(config.moveDom);

      initSmallImg();
      initBigImg();
      initMoveDiv();

      //初始化小图
      function initSmallImg() {
        config.smallDom.style.background = `url("${config.smallImg}") no-repeat left top/contain`; //设置背景图片
        config.smallDom.onmousemove = function (e) { //鼠标移入事件
          //展示移动小块
          config.moveDom.style.display = "block";
          var move = window.getComputedStyle(config.moveDom);
          //获取鼠标在小图中的坐标
          var position = getPosition(e);
          //设置移动框的位置
          setPosition(position);

          //展示大图框
          config.bigDom.style.display = "block";
          //大图框中展示部分大图
          displayBigBgImgSize();
        }

        config.smallDom.onmouseout = function () {
          //移动小块隐藏,大图隐藏
          config.moveDom.style.display = config.bigDom.style.display = "none";
        }
      }

      //初始化大图
      function initBigImg() {
        config.bigDom.style.background = `url("${config.bigImg}") no-repeat`; //设置背景图片
      }

      //初始化移动框
      function initMoveDiv() {
        config.moveDom.style.width = config.moveSize.width + "px";
        config.moveDom.style.height = config.moveSize.height + "px";
      }

      //获取鼠标的坐标位置
      function getPosition(e) {
        if (e.target == config.smallDom) { //若鼠标出现在小图中,事件源是小图
          return { //直接获取鼠标距离事件源的横坐标和纵坐标
            x: e.offsetX,
            y: e.offsetY
          };
        } else { //鼠标出现在移动框中,事件源是移动框
          return {
            x: e.offsetX + parseFloat(config.moveComputedStyle.left) +
              1, //鼠标距离事件源的横坐标 + 事件源在smallDom中的left值 + 边框值
            y: e.offsetY + parseFloat(config.moveComputedStyle.top) +
//鼠标距离事件源的纵坐标 + 事件源在smallDom中的top值 + 边框值
          }
        }
      }

      //设置移动方块的位置
      function setPosition(position) {
        //鼠标要始终在移动方块中央位置
        config.moveDom.style.left = position.x - parseFloat(config.moveComputedStyle.width) / 2 + "px";
        config.moveDom.style.top = position.y - parseFloat(config.moveComputedStyle.height) / 2 + "px";

        //要限制移动框的范围在小图中,否则会超出小图
        var left = parseInt(config.moveComputedStyle.left);
        var top = parseInt(config.moveComputedStyle.top);
        if (left < 0) { //最左
          config.moveDom.style.left = "0px";
        }
        if (left > config.smallSize.width - config.moveSize.width) { //最右
          config.moveDom.style.left = config.smallSize.width - config.moveSize.width + "px";
        }
        if (top < 0) { //最上
          config.moveDom.style.top = "0px";
        }
        if (top > config.smallSize.height - config.moveSize.height) { //最下
          config.moveDom.style.top = config.smallSize.height - config.moveSize.height + "px";
        }
      }

      //展示部分大图
      function displayBigBgImgSize() {

        //移动框的left/小图width = 大图框的left/大图width
        var moveLeft = parseInt(config.moveComputedStyle.left);
        var moveTop = parseInt(config.moveComputedStyle.top);
        config.bigDom.style.backgroundPosition =
          `-${moveLeft*config.bigSize.width/config.smallSize.width}px -${moveTop*config.bigSize.height/config.smallSize.height}px`;
      }
    }());
  </script>
</body>

</html>

index.html

效果展示:

JavaScript实现放大镜效果代码示例

代码中的大图片和小图片要自己找,并且替换掉代码中的图片路径。

做放大镜效果做重要的一点是,要找到黄色移动块、小图、部分大图、大图,这四个之间的比例尺

黄色移动块 /小图 = 部分大图 / 大图

JavaScript实现放大镜效果代码示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现文本框中焦点在最后位置
Mar 04 Javascript
js 判断js函数、变量是否存在的简单示例代码
Mar 04 Javascript
JQuery中的html()、text()、val()区别示例介绍
Sep 01 Javascript
JavaScript获取一个范围内日期的方法
Apr 24 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
Jul 27 Javascript
基于Jquery easyui 选中特定的tab
Nov 17 Javascript
AngularJS数据源的多种获取方式汇总
Feb 02 Javascript
AngularJS入门教程引导程序
Aug 18 Javascript
全面解析Bootstrap表单样式的使用
Sep 09 Javascript
Three.js入门之hello world以及如何绘制线
Sep 25 Javascript
vue input 输入校验字母数字组合且长度小于30的实现代码
May 16 Javascript
React 无状态组件(Stateless Component) 与高阶组件
Aug 14 Javascript
React组件设计模式之组合组件应用实例分析
Apr 29 #Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
Apr 29 #Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
Apr 29 #Javascript
JS实现手写 forEach算法示例
Apr 29 #Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 #Javascript
Node.js API详解之 string_decoder用法实例分析
Apr 29 #Javascript
深入浅析vue全局环境变量和模式
Apr 28 #Javascript
You might like
去除php注释和去除空格函数分享
2014/03/13 PHP
php UNIX时间戳用法详解
2017/02/16 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
JavaScript函数详解
2014/11/17 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
jQuery实现手风琴特效
2021/01/11 jQuery
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
python中快速进行多个字符替换的方法小结
2016/12/15 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
Django框架models使用group by详解
2020/03/11 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
Python中的面向接口编程示例详解
2021/01/17 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
后勤工作职责
2013/12/22 职场文书
领导视察欢迎词
2014/01/15 职场文书
市场营销策划方案
2014/06/11 职场文书
最新离婚协议书范本
2014/08/19 职场文书
商场父亲节活动方案
2014/08/27 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
大学生自荐信范文
2015/03/05 职场文书
2016年母亲节寄语
2015/12/04 职场文书
spring 项目实现限流方法示例
2022/07/15 Java/Android