點(diǎn)擊這里跳轉(zhuǎn)至GitHub項(xiàng)目
ZoomMarker
一款用于圖片滾動放大拖動洞渤,且可以添加標(biāo)記的jQuery插件
在項(xiàng)目中需要實(shí)現(xiàn)類似地圖應(yīng)用那樣的,具有鼠標(biāo)滾動縮放和拖動功能的插件效果这溅,且可以添加具有回調(diào)功能的標(biāo)記點(diǎn)组民。在網(wǎng)上找了一圈都沒有找到合適的悲靴,所以圖方便自己寫了一個臭胜。
如有任何功能問題或改進(jìn)意見,歡迎反饋癞尚,感謝耸三。
Preview效果預(yù)覽
點(diǎn)擊這里查看使用ZoomMarker和EasyLoading構(gòu)建的圖片拖拽、縮放浇揩、標(biāo)記及加載動畫的示例仪壮,使用鼠標(biāo)或觸屏點(diǎn)擊在圖片上添加標(biāo)記點(diǎn),鼠標(biāo)懸浮在上面查看懸浮提示窗口胳徽,使用頂部按鈕實(shí)現(xiàn)圖片切換积锅、清空標(biāo)記點(diǎn)和加載動畫示例等。
Version版本
version | date | detail |
---|---|---|
0.1.5 | 2019.4.9 | 添加圖像位置和大小重置接口 |
0.1.4 | 2019.4.1 | 添加圖像拖動鎖邊功能 |
0.1.3 | 2019.4.1 | 修復(fù)移動端ChromeV8內(nèi)核圖片拖動及marker點(diǎn)擊觸發(fā)問題 |
0.1.2 | 2019.2.21 | 添加標(biāo)記點(diǎn)可拖動選項(xiàng) |
0.1.1 | 2019.2.21 | 添加縮放鎖定參數(shù) |
0.1.0 | 2019.2.13 | 添加Canvas繪圖層接口养盗,優(yōu)化多圖層環(huán)境體驗(yàn) |
0.0.11 | 2019.2.7 | 多圖層環(huán)境下乏沸,點(diǎn)擊非當(dāng)前圖層時將攔截圖層切換的發(fā)送消息 |
0.0.10 | 2018.11.6 | 解決多圖像下圖片和標(biāo)記點(diǎn)的迭代順序問題 |
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 | 添加圖像居中接口,修復(fù)重復(fù)初始化問題 |
0.0.4 | 2017.11.11 | 修正圖片顯示比例錯誤的問題 |
0.0.3 | 2017.11.8 | 優(yōu)化接口API |
0.0.2 | 2017.11.3 | 引入Hammer.js處理鼠標(biāo)操作 |
0.0.1 | 2017.10.25 | 初始版本爪瓜,基礎(chǔ)功能 |
Require依賴
name | min-version | detail |
---|---|---|
jQuery | 3.3.1 | JavaScript的DOM操作框架 |
jquery.mousewheel | 1.6 | jQuery鼠標(biāo)滾輪監(jiān)聽插件 |
Hammer.js | 2.0.4 | 多點(diǎn)觸控插件 |
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插件,它也可以單獨(dú)使用谅猾。如果您的項(xiàng)目中不需要使用加載動畫柄慰,則不需要
引入該插件。
<link rel="stylesheet" href="css/easy-loading.css">
<script src="js/easy-loading.js"></script>
添加必要的html標(biāo)簽税娜,注意img標(biāo)簽必須包含唯一的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()中調(diào)用初始化方法
$(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文件資源敬矩,我們已經(jīng)在該工程對應(yīng)目錄下添加這兩個文件找都。
現(xiàn)在你可以看到效果了属韧,單擊鼠標(biāo)拖動圖片,鼠標(biāo)滾輪滾動放大縮小圖片,添加的標(biāo)記也會跟著移動栗恩。
[圖片上傳失敗...(image-3ac8ba-1554905883763)]
2. 使用Canvas畫布繪圖
Canvas畫布功能在圖片div標(biāo)簽上覆蓋一層Canvas繪圖層,可通過該圖層繪制圖形。
為了使用Canvas畫布功能,需要在初始化ZoomMarker對象時手動配置enable_canvas為true勤家。
$('#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圖層的大小和圖片的實(shí)際像素大小相同。
如下例子在鼠標(biāo)點(diǎn)擊圖像時柳恐,手動繪制一條從[100, 100]坐標(biāo)出發(fā)伐脖,至點(diǎn)擊坐標(biāo)點(diǎn)結(jié)束的紅線。
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參數(shù)
初始化時可傳入以下可選參數(shù)胎撤。
param | function | default |
---|---|---|
rate | 縮放速率 | 0.2 |
src | 圖片資源 | null |
width | 圖片加載寬度 | 500 |
min | 圖片最小寬度 | 300 |
max | 圖片最大寬度 | null |
markers | 標(biāo)記點(diǎn)參數(shù)數(shù)組 | [] |
marker_size | 默認(rèn)標(biāo)記點(diǎn)尺寸 | 20 |
enable_drag | 允許拖拽 | true |
auto_index_z | 自動配置層級 | true |
enable_canvas | 添加Canvas繪圖層 | false |
zoom_lock | 縮放鎖定 | false |
move_limit | 拖動鎖邊 | false |
rate
缺省值0.2
該浮點(diǎn)型參數(shù)決定了圖片滾動放大時的速率晓殊,值越大圖片縮放速度越快断凶,范圍{0, 1}伤提。
src
缺省值null,不加載圖片
圖片加載的路徑
width
用于配置圖片加載后的寬度认烁,請不要使用100%之類的相對寬度定位肿男,會影響ZoomMarker的工作。
如果你要使圖片的寬度與父節(jié)點(diǎn)寬度相同却嗡,可以使用jQuery的方法獲取父節(jié)點(diǎn)寬度舶沛,或直接獲取"zoom-marker-div"標(biāo)簽的寬度,如:
$("#zoom-marker-img").parent().width();
$("#zoom-marker-div").width();
min
限定圖片縮放的最小寬度窗价,默認(rèn)最小寬度為300px如庭。
max
限定圖片縮放的最大寬度,默認(rèn)不做限制撼港。
markers
記錄了標(biāo)記點(diǎn)的參數(shù)坪它,包含以下幾個參數(shù)。
{
src: "img/marker.png", // (required)圖片加載路徑
x: 500, // (required)標(biāo)記點(diǎn)在圖片中的X坐標(biāo)
y: 500, // (required)標(biāo)記點(diǎn)在圖片中的Y坐標(biāo)
click: function(object){
// 點(diǎn)擊回調(diào)方法帝牡,object為marker的jQuery對象
}
}
marker_size
標(biāo)記點(diǎn)尺寸只能為正方形往毡,通過這個參數(shù)可以配置標(biāo)記點(diǎn)的大小,你也可以在"zoomMarker_AddMarker"添加標(biāo)記點(diǎn)方法中通過參數(shù)配置單個標(biāo)記點(diǎn)的大小靶溜。
enable_drag
是否允許當(dāng)前圖像拖拽
auto_index_z
自動管理圖像和標(biāo)記點(diǎn)的層級信息开瞭,在點(diǎn)擊和拖拽的時候自動將當(dāng)前圖像和標(biāo)記點(diǎn)置頂
enable_canvas
添加Canvas繪圖層,因?yàn)榭赡苡绊懶阅苷窒ⅲJ(rèn)關(guān)閉
zoom_lock
縮放鎖定嗤详,開啟則以圖片中點(diǎn)作為縮放中點(diǎn),默認(rèn)關(guān)閉
關(guān)閉狀態(tài)下以鼠標(biāo)或雙指縮放中心作為圖片放大或縮小的中點(diǎn)
move_limit
拖動鎖邊瓷炮,開啟則只允許圖片在父容器內(nèi)部拖動
Methods方法
ZoomMarker的方法全都以"zoomMarker_"開頭断楷,直接在你的圖片標(biāo)簽jQuery對象上使用jQuery插件的方法調(diào)用即可,如清空所有標(biāo)記點(diǎn):
$("#viewArea").zoomMarker_CleanMarker();
name | function |
---|---|
zoomMarker_LoadImage(src) | 加載圖像 |
zoomMarker_Zoom(center, scale) | 縮放圖片 |
zoomMarker_Move(x, y) | 移動圖片 |
zoomMarker_AddMarker(marker) | 添加標(biāo)記點(diǎn) |
zoomMarker_RemoveMarker(markerId) | 刪除標(biāo)記點(diǎn) |
zoomMarker_CleanMarker() | 清空標(biāo)記點(diǎn) |
zoomMarker_GetPicSize() | 獲取記載圖片尺寸 |
zoomMarker_EnableDrag(enable) | 是否允許圖像拖拽 |
zoomMarker_TopIndexZ() | 圖像和標(biāo)記點(diǎn)置頂 |
zoomMarker_Canvas() | 獲取canvas繪圖層上下文 |
zoomMarker_CanvasClean() | 清空canvas畫布 |
zoomMarker_ResetImage() | 重置圖像位置及大小 |
zoomMarker_LoadImage(src)
用于加載圖像崭别,src傳入圖片URL或本地路徑冬筒。
param | function |
---|---|
src | 圖像資源路徑或URL |
zoomMarker_Zoom(center, scale)
縮放圖片恐锣。
param | function |
---|---|
center | 縮放中心點(diǎn),相對于document的絕對坐標(biāo) |
scale | 縮放比例舞痰,浮點(diǎn)型土榴,如1.5為縮放到原圖的1.5倍大小 |
zoomMarker_Move(x, y)
移動圖片位置,笛卡爾坐標(biāo)系响牛,左上角坐標(biāo)為(0, 0)玷禽。
param | function |
---|---|
x | 圖片左上角的目標(biāo)縱坐標(biāo) |
y | 圖片左上角的目標(biāo)橫坐標(biāo) |
zoomMarker_AddMarker(marker)
添加標(biāo)記點(diǎn)并返回添加標(biāo)記點(diǎn)的相關(guān)參數(shù),marker的配置參數(shù)如下表所示呀打。
配置中的"x"和"y"參數(shù)均為標(biāo)記點(diǎn)在圖像中的坐標(biāo)位置矢赁。
param | function | detault | required |
---|---|---|---|
x | 標(biāo)記點(diǎn)在圖像中的X坐標(biāo) | null | Y |
y | 標(biāo)記點(diǎn)在圖像中的Y坐標(biāo) | null | Y |
src | 標(biāo)記點(diǎn)圖標(biāo)資源 | null | Y |
size | 標(biāo)記點(diǎn)圖標(biāo)尺寸 | 20 | N |
dialog | 懸浮對話框 | null | N |
hint | 標(biāo)記點(diǎn)內(nèi)部內(nèi)容 | null | N |
click | 標(biāo)記點(diǎn)擊回調(diào) | null | N |
draggable | 標(biāo)記點(diǎn)可拖動開關(guān) | null | Y |
(1) dialog
param | function | detault | required |
---|---|---|---|
value | 對話框內(nèi)容 | "" | N |
style | CSS樣式 | {} | N |
offsetX | 對話框X坐標(biāo)偏移 | 0 | N |
offsetY | 對話框Y坐標(biāo)偏移 | 0 | N |
(2) hint
param | function | detault | required |
---|---|---|---|
value | 標(biāo)記點(diǎn)內(nèi)容 | "" | N |
style | CSS樣式 | {} | N |
(3) return函數(shù)返回對象
param | function |
---|---|
id | 標(biāo)記點(diǎn)ID |
marker | 標(biāo)記點(diǎn)的jQuery對象 |
param | 用戶傳入的標(biāo)記點(diǎn)配置參數(shù) |
zoomMarker_RemoveMarker(markerId)
刪除標(biāo)記點(diǎn),傳入標(biāo)記點(diǎn)ID贬丛,ID可從"zoomMarker_AddMarker(marker)"返回結(jié)構(gòu)體中的"id"項(xiàng)獲取撩银。
zoomMarker_CleanMarker()
清空所有標(biāo)記點(diǎn)。
zoomMarker_GetPicSize()
獲取加載圖片的真實(shí)尺寸豺憔,只有當(dāng)圖片加載結(jié)束的時候才會返回正確的圖片尺寸额获。
return函數(shù)返回對象
param | function |
---|---|
width | 圖片寬度 |
height | 圖片高度 |
zoomMarker_EnableDrag(enable)
設(shè)置是否允許圖像拖動。
zoomMarker_TopIndexZ()
圖像和對應(yīng)的標(biāo)記點(diǎn)有層級關(guān)系恭应,通過這個方法將當(dāng)前圖像和標(biāo)記點(diǎn)層級置頂抄邀。
zoomMarker_Canvas()
需要在初始化圖像時配置enable_canvas參數(shù)為true。
獲取Canvas的上下文context昼榛,通過Canvas繪圖方法在圖像上繪制圖形境肾。
需要注意的是,繪圖坐標(biāo)都是以圖像的分辨率為基準(zhǔn)胆屿。
zoomMarker_CanvasClean()
清空Canvas的繪圖數(shù)據(jù)奥喻。
zoomMarker_ResetImage()
重置圖像尺寸和位置,包括marker和canvas信息莺掠。
Event事件
通過"on"或"bind"監(jiān)聽ZoomMarker發(fā)送的事件衫嵌。
// 監(jiān)聽圖片資源加載結(jié)束消息,更新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 | 標(biāo)記點(diǎn)點(diǎn)擊 | markerObj | 標(biāo)記點(diǎn)對象 |
zoom_marker_mouse_click | 圖片點(diǎn)擊 | mouseObj | 圖片點(diǎn)擊對象 |
size
param | function |
---|---|
width | 圖片寬度 |
height | 圖片高度 |
markerObj
param | function |
---|---|
id | 標(biāo)記點(diǎn)ID |
marker | 標(biāo)記點(diǎn)的jQuery對象 |
param | 用戶傳入的標(biāo)記點(diǎn)配置參數(shù) |
mouseObj
param | function |
---|---|
pageX | 點(diǎn)擊位置在document中的X坐標(biāo) |
pageY | 點(diǎn)擊位置在document中的Y坐標(biāo) |
x | 點(diǎn)擊位置在圖像坐標(biāo)中的X坐標(biāo) |
y | 點(diǎn)擊位置在圖像坐標(biāo)中的Y坐標(biāo) |