ZoomMarker 一款用于圖片滾動放大拖動,且可以添加標(biāo)記的jQuery插件

點(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)擊這里查看使用ZoomMarkerEasyLoading構(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_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圖層的大小和圖片的實(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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楔绞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子唇兑,更是在濱河造成了極大的恐慌酒朵,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扎附,死亡現(xiàn)場離奇詭異蔫耽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門匙铡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來图甜,“玉大人,你說我怎么就攤上這事鳖眼『谝悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵钦讳,是天一觀的道長矿瘦。 經(jīng)常有香客問我,道長愿卒,這世上最難降的妖魔是什么缚去? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮琼开,結(jié)果婚禮上易结,老公的妹妹穿的比我還像新娘。我一直安慰自己稠通,他們只是感情好衬衬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布买猖。 她就那樣靜靜地躺著改橘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪玉控。 梳的紋絲不亂的頭發(fā)上飞主,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音高诺,去河邊找鬼碌识。 笑死,一個胖子當(dāng)著我的面吹牛虱而,可吹牛的內(nèi)容都是我干的筏餐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼牡拇,長吁一口氣:“原來是場噩夢啊……” “哼魁瞪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惠呼,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤导俘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剔蹋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旅薄,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年泣崩,在試婚紗的時候發(fā)現(xiàn)自己被綠了少梁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洛口。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凯沪,靈堂內(nèi)的尸體忽然破棺而出绍弟,到底是詐尸還是另有隱情,我是刑警寧澤著洼,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布樟遣,位于F島的核電站,受9級特大地震影響身笤,放射性物質(zhì)發(fā)生泄漏豹悬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一液荸、第九天 我趴在偏房一處隱蔽的房頂上張望瞻佛。 院中可真熱鬧,春花似錦娇钱、人聲如沸伤柄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽适刀。三九已至,卻和暖如春煤蹭,著一層夾襖步出監(jiān)牢的瞬間笔喉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工硝皂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留常挚,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓稽物,卻偏偏與公主長得像奄毡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贝或,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1吼过、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,969評論 3 119
  • well,一個月的天數(shù)傀缩,又是一個階段那先。 開始學(xué)習(xí)。 記:
    琉璃色的貓閱讀 270評論 0 0
  • 昨日玫瑰已采 今日三朵玫瑰 1.早起 2.回聽惠婷老師答疑 3.閱讀新書 【幸福實(shí)修99天目標(biāo)】 1.臣服父母赡艰,每...
    葉青丁當(dāng)媽閱讀 175評論 0 1
  • 今天售淡,天上烏云一片,下著傾盆大雨,可是我的心情十分開心揖闸,激動揍堕。 因?yàn)槲医裉鞂W(xué)會了煎蛋,你們一定很想...
    帥氣的黃子陽閱讀 299評論 0 3