ZoomMarker 一款用于图片滚动放大拖动,且可以添加标记的jQuery插件

点击这里跳转至GitHub项目

ZoomMarker

一款用于图片滚动放大拖动,且可以添加标记的jQuery插件

在项目中需要实现类似地图应用那样的,具有鼠标滚动缩放和拖动功能的插件效果,且可以添加具有回调功能的标记点。在网上找了一圈都没有找到合适的,所以图方便自己写了一个。
如有任何功能问题或改进意见,欢迎反馈,感谢。

Preview效果预览

点击这里查看使用ZoomMarkerEasyLoading构建的图片拖拽、缩放、标记及加载动画的示例,使用鼠标或触屏点击在图片上添加标记点,鼠标悬浮在上面查看悬浮提示窗口,使用顶部按钮实现图片切换、清空标记点和加载动画示例等。

Version版本

version date detail
0.1.5 2019.4.9 添加图像位置和大小重置接口
0.1.4 2019.4.1 添加图像拖动锁边功能
0.1.3 2019.4.1 修复移动端ChromeV8内核图片拖动及marker点击触发问题
0.1.2 2019.2.21 添加标记点可拖动选项
0.1.1 2019.2.21 添加缩放锁定参数
0.1.0 2019.2.13 添加Canvas绘图层接口,优化多图层环境体验
0.0.11 2019.2.7 多图层环境下,点击非当前图层时将拦截图层切换的发送消息
0.0.10 2018.11.6 解决多图像下图片和标记点的迭代顺序问题
0.0.9 2018.11.5 解决缩放图片后图片大小不一致问题
0.0.8 2018.9.25 支持同时显示多个图片控件
0.0.7 2018.9.25 添加允许和禁止图像拖动接口
0.0.6 2018.7.24 解决jQuery的context废弃undefined问题
0.0.5 2017.11.13 添加图像居中接口,修复重复初始化问题
0.0.4 2017.11.11 修正图片显示比例错误的问题
0.0.3 2017.11.8 优化接口API
0.0.2 2017.11.3 引入Hammer.js处理鼠标操作
0.0.1 2017.10.25 初始版本,基础功能

Require依赖

name min-version detail
jQuery 3.3.1 JavaScript的DOM操作框架
jquery.mousewheel 1.6 jQuery鼠标滚轮监听插件
Hammer.js 2.0.4 多点触控插件
EasyLoading.js 0.1.0 (可选) 加载动画库

在本例子中,还使用了自行编写的开源加载动画插件EasyLoading,该插件同样需要jQuery支持。
如果您对EasyLoading感兴趣,欢迎加星。

Usages用法

1. 快速使用

引入ZoomMarker的JavaScript和CSS文件

<link rel="stylesheet" href="css/zoom-marker.css">
<script src="js/zoom-marker.js"></script>

引入第三方依赖库

<script src="js/jquery-1.11.3.min.js"></script>
<script src="js/jquery.mousewheel.min.js"></script>
<script src="js/hammer.min.js"></script>

在示例中,使用了图像加载动画,为此您还需要引入EasyLoading插件,它也可以单独使用。如果您的项目中不需要使用加载动画,则不需要
引入该插件。

<link rel="stylesheet" href="css/easy-loading.css">
<script src="js/easy-loading.js"></script>

添加必要的html标签,注意img标签必须包含唯一的id属性

<div id="zoom-marker-div" class="zoom-marker-div">
    <img class="zoom-marker-img" id="zoom-marker-img" alt="..." name="viewArea"  draggable="false"/>
</div>

在ready()中调用初始化方法

$(document).ready(function () {
    $('#zoom-marker-img').zoomMarker({
        src: "img/mountain.jpg",
        rate: 0.2,
        width: 600,
        max: 3000,
        markers:[
            {src:"img/marker.svg", x:500, y:500}
            ]
    });
})

在上述例子中,你还需要在img/目录下添加一个名为moutain.jpg的文件用于显示图片,在img/目录下添加名为marker.svg的文件作为marker文件资源,我们已经在该工程对应目录下添加这两个文件。
现在你可以看到效果了,单击鼠标拖动图片,鼠标滚轮滚动放大缩小图片,添加的标记也会跟着移动。

[图片上传失败...(image-3ac8ba-1554905883763)]

2. 使用Canvas画布绘图

Canvas画布功能在图片div标签上覆盖一层Canvas绘图层,可通过该图层绘制图形。
为了使用Canvas画布功能,需要在初始化ZoomMarker对象时手动配置enable_canvastrue

$('#zoom-marker-img').zoomMarker({
    src: "img/mountain.jpg",
    rate: 0.2,
    width: 400,
    max: 3000,
    markers:[
        {src:"img/marker.svg", x:200, y:200}
    ],
    enable_canvas: true
});

Canvas图层的大小和图片的实际像素大小相同。
如下例子在鼠标点击图像时,手动绘制一条从[100, 100]坐标出发,至点击坐标点结束的红线。

item.on("zoom_marker_mouse_click", function(event, position){
    // 画线
    const context = item.zoomMarker_Canvas();
    if(context !== null) {
        context.strokeStyle = 'red';
        context.moveTo(position.x, position.y);
        context.lineTo(100,100);
        context.stroke();
    }
});

Parameters参数

初始化时可传入以下可选参数。

param function default
rate 缩放速率 0.2
src 图片资源 null
width 图片加载宽度 500
min 图片最小宽度 300
max 图片最大宽度 null
markers 标记点参数数组 []
marker_size 默认标记点尺寸 20
enable_drag 允许拖拽 true
auto_index_z 自动配置层级 true
enable_canvas 添加Canvas绘图层 false
zoom_lock 缩放锁定 false
move_limit 拖动锁边 false

rate

缺省值0.2
该浮点型参数决定了图片滚动放大时的速率,值越大图片缩放速度越快,范围{0, 1}。

src

缺省值null,不加载图片
图片加载的路径

width

用于配置图片加载后的宽度,请不要使用100%之类的相对宽度定位,会影响ZoomMarker的工作。
如果你要使图片的宽度与父节点宽度相同,可以使用jQuery的方法获取父节点宽度,或直接获取"zoom-marker-div"标签的宽度,如:

$("#zoom-marker-img").parent().width();
$("#zoom-marker-div").width();

min

限定图片缩放的最小宽度,默认最小宽度为300px。

max

限定图片缩放的最大宽度,默认不做限制。

markers

记录了标记点的参数,包含以下几个参数。

{
    src: "img/marker.png",   // (required)图片加载路径
    x: 500,                  // (required)标记点在图片中的X坐标
    y: 500,                  // (required)标记点在图片中的Y坐标
    click: function(object){
        // 点击回调方法,object为marker的jQuery对象
    }
}

marker_size

标记点尺寸只能为正方形,通过这个参数可以配置标记点的大小,你也可以在"zoomMarker_AddMarker"添加标记点方法中通过参数配置单个标记点的大小。

enable_drag

是否允许当前图像拖拽

auto_index_z

自动管理图像和标记点的层级信息,在点击和拖拽的时候自动将当前图像和标记点置顶

enable_canvas

添加Canvas绘图层,因为可能影响性能,默认关闭

zoom_lock

缩放锁定,开启则以图片中点作为缩放中点,默认关闭
关闭状态下以鼠标或双指缩放中心作为图片放大或缩小的中点

move_limit

拖动锁边,开启则只允许图片在父容器内部拖动

Methods方法

ZoomMarker的方法全都以"zoomMarker_"开头,直接在你的图片标签jQuery对象上使用jQuery插件的方法调用即可,如清空所有标记点:

    $("#viewArea").zoomMarker_CleanMarker();
name function
zoomMarker_LoadImage(src) 加载图像
zoomMarker_Zoom(center, scale) 缩放图片
zoomMarker_Move(x, y) 移动图片
zoomMarker_AddMarker(marker) 添加标记点
zoomMarker_RemoveMarker(markerId) 删除标记点
zoomMarker_CleanMarker() 清空标记点
zoomMarker_GetPicSize() 获取记载图片尺寸
zoomMarker_EnableDrag(enable) 是否允许图像拖拽
zoomMarker_TopIndexZ() 图像和标记点置顶
zoomMarker_Canvas() 获取canvas绘图层上下文
zoomMarker_CanvasClean() 清空canvas画布
zoomMarker_ResetImage() 重置图像位置及大小

zoomMarker_LoadImage(src)

用于加载图像,src传入图片URL或本地路径。

param function
src 图像资源路径或URL

zoomMarker_Zoom(center, scale)

缩放图片。

param function
center 缩放中心点,相对于document的绝对坐标
scale 缩放比例,浮点型,如1.5为缩放到原图的1.5倍大小

zoomMarker_Move(x, y)

移动图片位置,笛卡尔坐标系,左上角坐标为(0, 0)。

param function
x 图片左上角的目标纵坐标
y 图片左上角的目标横坐标

zoomMarker_AddMarker(marker)

添加标记点并返回添加标记点的相关参数,marker的配置参数如下表所示。
配置中的"x"和"y"参数均为标记点在图像中的坐标位置。

param function detault required
x 标记点在图像中的X坐标 null Y
y 标记点在图像中的Y坐标 null Y
src 标记点图标资源 null Y
size 标记点图标尺寸 20 N
dialog 悬浮对话框 null N
hint 标记点内部内容 null N
click 标记点击回调 null N
draggable 标记点可拖动开关 null Y
(1) dialog
param function detault required
value 对话框内容 "" N
style CSS样式 {} N
offsetX 对话框X坐标偏移 0 N
offsetY 对话框Y坐标偏移 0 N
(2) hint
param function detault required
value 标记点内容 "" N
style CSS样式 {} N
(3) return函数返回对象
param function
id 标记点ID
marker 标记点的jQuery对象
param 用户传入的标记点配置参数

zoomMarker_RemoveMarker(markerId)

删除标记点,传入标记点ID,ID可从"zoomMarker_AddMarker(marker)"返回结构体中的"id"项获取。

zoomMarker_CleanMarker()

清空所有标记点。

zoomMarker_GetPicSize()

获取加载图片的真实尺寸,只有当图片加载结束的时候才会返回正确的图片尺寸。

return函数返回对象
param function
width 图片宽度
height 图片高度

zoomMarker_EnableDrag(enable)

设置是否允许图像拖动。

zoomMarker_TopIndexZ()

图像和对应的标记点有层级关系,通过这个方法将当前图像和标记点层级置顶。

zoomMarker_Canvas()

需要在初始化图像时配置enable_canvas参数为true。
获取Canvas的上下文context,通过Canvas绘图方法在图像上绘制图形。
需要注意的是,绘图坐标都是以图像的分辨率为基准。

zoomMarker_CanvasClean()

清空Canvas的绘图数据。

zoomMarker_ResetImage()

重置图像尺寸和位置,包括marker和canvas信息。

Event事件

通过"on"或"bind"监听ZoomMarker发送的事件。

// 监听图片资源加载结束消息,更新UI资源。
$('#zoom-marker-img').on("zoom_marker_img_loaded", function(event, size){
    console.log("image has been loaded with size: "+JSON.stringify(size));
    /** 更新UI操作 **/
    ...
});
name function param detail
zoom_marker_img_load 图片开始加载 src 图片资源路径或URL
zoom_marker_img_loaded 图片已加载完成 size 图片尺寸
zoom_marker_click 标记点点击 markerObj 标记点对象
zoom_marker_mouse_click 图片点击 mouseObj 图片点击对象

size

param function
width 图片宽度
height 图片高度

markerObj

param function
id 标记点ID
marker 标记点的jQuery对象
param 用户传入的标记点配置参数

mouseObj

param function
pageX 点击位置在document中的X坐标
pageY 点击位置在document中的Y坐标
x 点击位置在图像坐标中的X坐标
y 点击位置在图像坐标中的Y坐标
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,967评论 3 119
  • well,一个月的天数,又是一个阶段。 开始学习。 记:
    琉璃色的猫阅读 269评论 0 0
  • 昨日玫瑰已采 今日三朵玫瑰 1.早起 2.回听惠婷老师答疑 3.阅读新书 【幸福实修99天目标】 1.臣服父母,每...
    叶青丁当妈阅读 175评论 0 1
  • 今天,天上乌云一片,下着倾盆大雨,可是我的心情十分开心,激动。 因为我今天学会了煎蛋,你们一定很想...
    帅气的黄子阳阅读 299评论 0 3