代码如下

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. * {
  8. padding: 0;
  9. margin: 0;
  10. }
  11. #box {
  12. position: relative;
  13. width: 1000px;
  14. height: 400px;
  15. background-color: rosybrown;
  16. overflow: hidden;
  17. left: 50%;
  18. margin-left: -500px;
  19. top: 100px;
  20. }
  21. #map {
  22. position: absolute;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <div id="box">
  28. <img src="map_test.png" alt="" id="map">
  29. </div>
  30. </body>
  31. <script>
  32. var box = document.getElementById("box");
  33. var map = document.getElementById("map");
  34. var isRun, // 是否可移动
  35. startX, // 鼠标落下的位置
  36. startY,
  37. endX, // 鼠标放开的位置
  38. endY,
  39. rX, // 图片最终的位置(中间量)
  40. rY,
  41. scaleSize = 1, // 缩放比例
  42. bgX = 0, // left 图片的最终位置
  43. bgY = 0; // top
  44. var box_width = parseFloat(window.getComputedStyle(box, false)["width"].slice(0, -2));
  45. var box_height = parseFloat(window.getComputedStyle(box, false)["height"].slice(0, -2));
  46. var map_width = parseFloat(window.getComputedStyle(map, false)["width"].slice(0, -2));
  47. var map_height = parseFloat(window.getComputedStyle(map, false)["height"].slice(0, -2));
  48. function restart() {
  49. // 初始设置显示全部地图
  50. var map_w, map_h;
  51. if (box_width / box_height > map_width / map_height) {
  52. // 此时以高为基准
  53. scaleSize = box_height / map_height;
  54. map_h = box_height;
  55. map_w = map_width * scaleSize;
  56. bgX = (box_width - map_w) / 2;
  57. bgY = 0;
  58. } else {
  59. // 此时以宽为基准
  60. scaleSize = box_width / map_width;
  61. map_h = map_height * scaleSize;
  62. map_w = box_width;
  63. bgX = 0;
  64. bgY = (box_height - map_h) / 2;
  65. }
  66. map.style.height = map_h + "px";
  67. map.style.width = map_w + "px";
  68. map.style.top = bgY + "px";
  69. map.style.left = bgX + "px";
  70. }
  71. restart();
  72. box.onmousedown = function (ev) {
  73. if (ev.which === 1) {
  74. // 鼠标左键
  75. isRun = true;
  76. startX = ev.pageX;
  77. startY = ev.pageY;
  78. return false;
  79. }
  80. if (ev.which === 2) {
  81. restart();
  82. return false;
  83. }
  84. };
  85. box.onmouseup = function (ev) {
  86. if (ev.which === 1) {
  87. isRun = false;
  88. bgX = rX;
  89. bgY = rY;
  90. }
  91. return false;
  92. };
  93. box.onmousemove = function (ev) {
  94. if (ev.which === 1 && isRun) {
  95. endX = ev.pageX;
  96. endY = ev.pageY;
  97. rX = bgX + endX - startX;
  98. rY = bgY + endY - startY;
  99. map.style.left = rX + "px";
  100. map.style.top = rY + "px";
  101. }
  102. };
  103. box.onwheel = function (ev) {
  104. // 以鼠标为中心缩放
  105. // 1.记录鼠标当前位置(相对于window)
  106. var x = ev.pageX;
  107. var y = ev.pageY;
  108. // 2.阻止默认事件
  109. ev.preventDefault();
  110. // ev.target 滚轮滑动的目标
  111. // 3.计算出鼠标相对于地图的位置
  112. x = x - box.offsetLeft;
  113. y = y - box.offsetTop;
  114. // 4.记录滚轮的变化值 -100/+100
  115. var change_scale = -(ev.deltaY) / 1000;
  116. var current_scale = scaleSize;
  117. current_scale += change_scale;
  118. // 5.限制缩放的倍数0.1-10
  119. current_scale = current_scale < 0.1 ? 0.1 : (current_scale > 10 ? 10 : current_scale);
  120. // 6.计算出相对于图片的同样倍数对应的位移距离
  121. bgX = bgX - (x - bgX) * (current_scale - scaleSize) / scaleSize;
  122. bgY = bgY - (y - bgY) * (current_scale - scaleSize) / scaleSize;
  123. scaleSize = current_scale;
  124. // 7.更新属性
  125. map.style.width = map_width * scaleSize + "px";
  126. map.style.height = map_height * scaleSize + "px";
  127. map.style.top = bgY + "px";
  128. map.style.left = bgX + "px";
  129. // 注意:要求box标签的父级标签不能出现定位属性,否则会以出现定位属性的父级为基准计算offset
  130. }
  131. </script>
  132. </html>

HTML/JavaScript实现地图以鼠标为圆心缩放和移动的更多相关文章

  1. javascript百度地图使用(根据地名定位、根据经纬度定位)

    需要购买阿里云产品和服务的,点击此链接领取优惠券红包,优惠购买哦,领取后一个月内有效: https://promotion.aliyun.com/ntms/yunparter/invite.html? ...

  2. JavaScript进阶系列07,鼠标事件

    鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...

  3. FineReport中如何用JavaScript自定义地图标签

    在日常使用地图过程中,通常会遇到地图标签,提示点等显示不满足我们的需求,需要进行JavaScript代码编写. 例如:在使用地图过程中,会发现很多地名显示的位置偏离.这时候就需要使用JavaScrip ...

  4. 每天一个JavaScript实例-铺货鼠标点击位置并将元素移动到该位置

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  5. javascript高德地图实现点击marker消失marker

    javascript高德地图实现点击marker消失marker <pre> var markers = []; var positions = [[120.17718, 30.21772 ...

  6. javascript高德地图放到网页中的方法

    javascript高德地图放到网页中的方法 1 先获取到经纬度http://lbs.amap.com/console/show/picker 2 下面代码直接设置下中心点 和标记点就可以了 < ...

  7. 在unity中用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放

    在场景中添加一个Plan,Camera,Directional Light,Cube.添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上). 1 ...

  8. javascript 百度地图

    官方地址 http://lbsyun.baidu.com/index.php?title=jspopular 示例地址 http://developer.baidu.com/map/jsdemo.ht ...

  9. JS高德地图应用 ---- 鼠标点击加入标记 & POI搜索

    代码如下 (填入Key值) : <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...

随机推荐

  1. Linux gcc链接动态库出错:LIBRARY_PATH和LD_LIBRARY_PATH的区别

    昨天在自己的CentOs7.1上写makefile的时候,发现在一个C程序在编译并链接一个已生成好的lib动态库的时候出错.链接命令大概是这样的: [root@typecodes tcpmsg]# g ...

  2. Python Special Methods - 特殊方法

    特殊方法 特殊方法的存在是为了给 Python 解释器调用的,通常自己并不需要直接调用它们.也就是说不应该使用 my_object.__len__() 这种写法,而应该使用 len(my_object ...

  3. PWA 学习笔记

    深入学习网址:https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps 一. 基本介绍 1. 渐进式:适用所有浏览器,因为它是 ...

  4. python3安装pycrypto

    这几天想用py3弄一个系统,需要用到WeChat-sdk这个包,在pip install wechat-sdk的时候报了一系列的错误,最后定位是安装pycrypto出错,各种度娘之后说要安装vs201 ...

  5. oracle数据库重要的查询语句

    查看所有数据文件(dbf文件)的存放位置 SQL> select name from v$datafile; 标红色的为默认表空间文件 SQL> select name from v$da ...

  6. gcd综合

    问题: 如果正整数大于了1000有什么影响? 1.递推式gcd: int gcd(int a,int b) { ) { int c=a%b; a=b; b=c; } return a; } 2.递归式 ...

  7. python3-cookbook笔记:第九章 元编程

    python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...

  8. 使用 linux kernel +busybox 定制linux系统

    目的: 了解linux的启动过程 主要内容: 1.grub 是启动程序的bootloader 2.linux-kernel 是linux的开源内核 3.busybox 是linux的工具集合 启动顺序 ...

  9. PMP--1.7 项目治理

    治理凌驾于管理之上 组织治理用于影响项目治理. 组织治理需要组织根据组织文化.项目类型和组织需求裁剪治理框架,适用于当前组织. 其实组织治理的内容,在项目管理初期不需要详细了解,组织治理的内容都是高层 ...

  10. go 面向对象

    结构体 创建结构体变量和访问结构体字段 package main import "fmt" //创建结构体变量和访问结构体字段 type Person struct { Name ...