點擊這里跳轉至GitHub項目
ZoomMarker
一款用于圖片滾動放大拖動,且可以添加標記的jQuery插件
在項目中需要實現類似地圖應用那樣的,具有鼠標滾動縮放和拖動功能的插件效果,且可以添加具有回調功能的標記點。在網上找了一圈都沒有找到合適的,所以圖方便自己寫了一個。
如有任何功能問題或改進意見,歡迎反饋,感謝。
Preview效果預覽
點擊這里查看使用ZoomMarker和EasyLoading構建的圖片拖拽、縮放、標記及加載動畫的示例,使用鼠標或觸屏點擊在圖片上添加標記點,鼠標懸浮在上面查看懸浮提示窗口,使用頂部按鈕實現圖片切換、清空標記點和加載動畫示例等。
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_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]坐標出發,至點擊坐標點結束的紅線。
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坐標 |