點擊這里跳轉(zhuǎn)至GitHub項目
ZoomMarker
一款用于圖片滾動放大拖動,且可以添加標記的jQuery插件
在項目中需要實現(xiàn)類似地圖應(yīng)用那樣的,具有鼠標滾動縮放和拖動功能的插件效果,且可以添加具有回調(diào)功能的標記點。在網(wǎng)上找了一圈都沒有找到合適的,所以圖方便自己寫了一個。
如有任何功能問題或改進意見,歡迎反饋,感謝。
Preview效果預覽
點擊這里查看使用ZoomMarker和EasyLoading構(gòu)建的圖片拖拽、縮放、標記及加載動畫的示例,使用鼠標或觸屏點擊在圖片上添加標記點,鼠標懸浮在上面查看懸浮提示窗口,使用頂部按鈕實現(xiàn)圖片切換、清空標記點和加載動畫示例等。
Version版本
| version | date | detail |
|---|---|---|
| 0.1.5 | 2019.4.9 | 添加圖像位置和大小重置接口 |
| 0.1.4 | 2019.4.1 | 添加圖像拖動鎖邊功能 |
| 0.1.3 | 2019.4.1 | 修復移動端ChromeV8內(nèi)核圖片拖動及marker點擊觸發(fā)問題 |
| 0.1.2 | 2019.2.21 | 添加標記點可拖動選項 |
| 0.1.1 | 2019.2.21 | 添加縮放鎖定參數(shù) |
| 0.1.0 | 2019.2.13 | 添加Canvas繪圖層接口,優(yōu)化多圖層環(huán)境體驗 |
| 0.0.11 | 2019.2.7 | 多圖層環(huán)境下,點擊非當前圖層時將攔截圖層切換的發(fā)送消息 |
| 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 | 優(yōu)化接口API |
| 0.0.2 | 2017.11.3 | 引入Hammer.js處理鼠標操作 |
| 0.0.1 | 2017.10.25 | 初始版本,基礎(chǔ)功能 |
Require依賴
| name | min-version | detail |
|---|---|---|
| jQuery | 3.3.1 | JavaScript的DOM操作框架 |
| jquery.mousewheel | 1.6 | jQuery鼠標滾輪監(jiān)聽插件 |
| 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()中調(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)在你可以看到效果了,單擊鼠標拖動圖片,鼠標滾輪滾動放大縮小圖片,添加的標記也會跟著移動。
[圖片上傳失敗...(image-3ac8ba-1554905883763)]
2. 使用Canvas畫布繪圖
Canvas畫布功能在圖片div標簽上覆蓋一層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圖層的大小和圖片的實際像素大小相同。
如下例子在鼠標點擊圖像時,手動繪制一條從[100, 100]坐標出發(fā),至點擊坐標點結(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 | 標記點參數(shù)數(shù)組 | [] |
| marker_size | 默認標記點尺寸 | 20 |
| enable_drag | 允許拖拽 | true |
| auto_index_z | 自動配置層級 | true |
| enable_canvas | 添加Canvas繪圖層 | false |
| zoom_lock | 縮放鎖定 | false |
| move_limit | 拖動鎖邊 | false |
rate
缺省值0.2
該浮點型參數(shù)決定了圖片滾動放大時的速率,值越大圖片縮放速度越快,范圍{0, 1}。
src
缺省值null,不加載圖片
圖片加載的路徑
width
用于配置圖片加載后的寬度,請不要使用100%之類的相對寬度定位,會影響ZoomMarker的工作。
如果你要使圖片的寬度與父節(jié)點寬度相同,可以使用jQuery的方法獲取父節(jié)點寬度,或直接獲取"zoom-marker-div"標簽的寬度,如:
$("#zoom-marker-img").parent().width();
$("#zoom-marker-div").width();
min
限定圖片縮放的最小寬度,默認最小寬度為300px。
max
限定圖片縮放的最大寬度,默認不做限制。
markers
記錄了標記點的參數(shù),包含以下幾個參數(shù)。
{
src: "img/marker.png", // (required)圖片加載路徑
x: 500, // (required)標記點在圖片中的X坐標
y: 500, // (required)標記點在圖片中的Y坐標
click: function(object){
// 點擊回調(diào)方法,object為marker的jQuery對象
}
}
marker_size
標記點尺寸只能為正方形,通過這個參數(shù)可以配置標記點的大小,你也可以在"zoomMarker_AddMarker"添加標記點方法中通過參數(shù)配置單個標記點的大小。
enable_drag
是否允許當前圖像拖拽
auto_index_z
自動管理圖像和標記點的層級信息,在點擊和拖拽的時候自動將當前圖像和標記點置頂
enable_canvas
添加Canvas繪圖層,因為可能影響性能,默認關(guān)閉
zoom_lock
縮放鎖定,開啟則以圖片中點作為縮放中點,默認關(guān)閉
關(guān)閉狀態(tài)下以鼠標或雙指縮放中心作為圖片放大或縮小的中點
move_limit
拖動鎖邊,開啟則只允許圖片在父容器內(nèi)部拖動
Methods方法
ZoomMarker的方法全都以"zoomMarker_"開頭,直接在你的圖片標簽jQuery對象上使用jQuery插件的方法調(diào)用即可,如清空所有標記點:
$("#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)
添加標記點并返回添加標記點的相關(guān)參數(shù),marker的配置參數(shù)如下表所示。
配置中的"x"和"y"參數(shù)均為標記點在圖像中的坐標位置。
| param | function | detault | required |
|---|---|---|---|
| x | 標記點在圖像中的X坐標 | null | Y |
| y | 標記點在圖像中的Y坐標 | null | Y |
| src | 標記點圖標資源 | null | Y |
| size | 標記點圖標尺寸 | 20 | N |
| dialog | 懸浮對話框 | null | N |
| hint | 標記點內(nèi)部內(nèi)容 | null | N |
| click | 標記點擊回調(diào) | null | N |
| draggable | 標記點可拖動開關(guān) | null | Y |
(1) dialog
| param | function | detault | required |
|---|---|---|---|
| value | 對話框內(nèi)容 | "" | N |
| style | CSS樣式 | {} | N |
| offsetX | 對話框X坐標偏移 | 0 | N |
| offsetY | 對話框Y坐標偏移 | 0 | N |
(2) hint
| param | function | detault | required |
|---|---|---|---|
| value | 標記點內(nèi)容 | "" | N |
| style | CSS樣式 | {} | N |
(3) return函數(shù)返回對象
| param | function |
|---|---|
| id | 標記點ID |
| marker | 標記點的jQuery對象 |
| param | 用戶傳入的標記點配置參數(shù) |
zoomMarker_RemoveMarker(markerId)
刪除標記點,傳入標記點ID,ID可從"zoomMarker_AddMarker(marker)"返回結(jié)構(gòu)體中的"id"項獲取。
zoomMarker_CleanMarker()
清空所有標記點。
zoomMarker_GetPicSize()
獲取加載圖片的真實尺寸,只有當圖片加載結(jié)束的時候才會返回正確的圖片尺寸。
return函數(shù)返回對象
| param | function |
|---|---|
| width | 圖片寬度 |
| height | 圖片高度 |
zoomMarker_EnableDrag(enable)
設(shè)置是否允許圖像拖動。
zoomMarker_TopIndexZ()
圖像和對應(yīng)的標記點有層級關(guān)系,通過這個方法將當前圖像和標記點層級置頂。
zoomMarker_Canvas()
需要在初始化圖像時配置enable_canvas參數(shù)為true。
獲取Canvas的上下文context,通過Canvas繪圖方法在圖像上繪制圖形。
需要注意的是,繪圖坐標都是以圖像的分辨率為基準。
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 | 標記點點擊 | markerObj | 標記點對象 |
| zoom_marker_mouse_click | 圖片點擊 | mouseObj | 圖片點擊對象 |
size
| param | function |
|---|---|
| width | 圖片寬度 |
| height | 圖片高度 |
markerObj
| param | function |
|---|---|
| id | 標記點ID |
| marker | 標記點的jQuery對象 |
| param | 用戶傳入的標記點配置參數(shù) |
mouseObj
| param | function |
|---|---|
| pageX | 點擊位置在document中的X坐標 |
| pageY | 點擊位置在document中的Y坐標 |
| x | 點擊位置在圖像坐標中的X坐標 |
| y | 點擊位置在圖像坐標中的Y坐標 |