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閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網絡請求組件 FMDB本地數據庫組件 SD...
    陽明先生_X自主閱讀 16,000評論 3 119
  • well,一個月的天數,又是一個階段。 開始學習。 記:
    琉璃色的貓閱讀 276評論 0 0
  • 昨日玫瑰已采 今日三朵玫瑰 1.早起 2.回聽惠婷老師答疑 3.閱讀新書 【幸福實修99天目標】 1.臣服父母,每...
    葉青丁當媽閱讀 179評論 0 1
  • 今天,天上烏云一片,下著傾盆大雨,可是我的心情十分開心,激動。 因為我今天學會了煎蛋,你們一定很想...
    帥氣的黃子陽閱讀 308評論 0 3