基于HTML5 Canvas 實(shí)現(xiàn)彈出框效果

用戶鼠標(biāo)移入時(shí),有彈出框出現(xiàn),這樣的需求很常見。這在處理HTML元素實(shí)現(xiàn)時(shí)簡單,但是如果是對HTML5 Canvas 構(gòu)成的圖形進(jìn)行處理,這種方法不再適用,因?yàn)镃anvas使用的是另外一套機(jī)制,無論在Canvas上繪制多少圖形,Canvas都是一個(gè)整體。而圖形本身實(shí)際都是Canvas的一部分,不可單獨(dú)獲取,所以也就無法直接給某個(gè)圖形增加JavaScript事件。然而,在HT for Web中,這種需求很容易實(shí)現(xiàn),場景如下:
這個(gè)場景圖是基于HT for Web的JSON文件,可能大家對怎么生成這樣的JSON文件有疑惑,其實(shí)這里是基于這個(gè)麻雀雖小五臟俱全的“HTML5拓?fù)鋱D編輯器”(http://www.hightopo.com/demo/2deditor_20151010/HT-2D-Editor.html)進(jìn)行了擴(kuò)展,很容易就自定義出滿足我需求拓?fù)渚庉嬈?。不僅如此,在這個(gè)Demo中,定義的三種類型彈框的矢量圖‘tips1.json’、‘tips2.json’、‘tips3.json’是通過這個(gè)矢量編輯器(http://www.hightopo.com/demo/vector-editor/index.html)簡單繪制了下,也還蠻好用。在上述場景中,用戶將鼠標(biāo)移入到草地等對象時(shí),會(huì)有彈出框顯示它的詳細(xì)信息,Demo地址:http://www.hightopo.com/demo/blog_meadow_20170605/index.html
具體實(shí)現(xiàn)如下:
準(zhǔn)備工作
引入我們的HT(http://www.hightopo.com/):
<script src='ht.js'></script> dataModel = new ht.DataModel(); graphView = new ht.graph.GraphView(dataModel); graphView.addToDOM();
HT提供了自定義的JSON格式的矢量描述形式,以HT標(biāo)準(zhǔn)定義的JSON矢量格式,也可以作為圖片進(jìn)行注冊和使用,HT的矢量方式比傳統(tǒng)格式更節(jié)省空間,縮放不失真,戳HT for Web了解詳細(xì)信息。這里,將三種形狀的JSON彈出框注冊成圖片以便后續(xù)調(diào)用:
ht.Default.setImage('tips1', 'symbols/tips1.json'); ht.Default.setImage('tips2', 'symbols/tips2.json'); ht.Default.setImage('tips3', 'symbols/tips3.json');
然后獲取有交互效果的對象,其中各個(gè)對象中的屬性名是給各個(gè)圖元設(shè)置好的標(biāo)簽名:
//樹 var tree = { 'tree1' : true, 'tree2' : true, 'tree3' : true }; //草地 var grass = { 'grass1' : true, 'grass2' : true, 'grass3' : true }; //山 var mountain = { 'mountain': true };
彈出框
其實(shí)彈出框的本質(zhì)是一個(gè)Node,當(dāng)用戶鼠標(biāo)移入移出時(shí),
1、控制Node的隱藏和顯示可以達(dá)到彈框的效果;
2、鼠標(biāo)位置的改變伴隨著Node位置的改變;
3、鼠標(biāo)移入到不同的對象上時(shí),Node上的貼圖也跟著發(fā)生變化;
4、Node中的屬性值也隨著鼠標(biāo)位置發(fā)生變化。
所以,要實(shí)現(xiàn)彈框,首先應(yīng)新建Node,并將其的層級(jí)設(shè)置為‘higher’,在這之前還需要將場景圖的JSON文件反序列化,并且給反序列化后的圖元均設(shè)置為層級(jí)‘lower’,防止被已有的圖元擋住:
ht.Default.xhrLoad('meadow.json', function(text) { const json = ht.Default.parse(text); if(json.title) document.title = json.title; dataModel.deserialize(json); //設(shè)置層級(jí) dataModel.each(function(data){ data.setLayer('lower'); }); //新建node var node = new ht.Node(); node.s('2d.visible',false); node.setLayer('higher'); dataModel.add(node); })
然后,對底層的DIV監(jiān)聽mousemove事件,判斷鼠標(biāo)的位置是否在上述三個(gè)對象之上,根據(jù)對象類型,調(diào)用layout()函數(shù)對Node重新布局:
graphView.getView().addEventListener('mousemove', function(e) { node.s('2d.visible',false); var hoverData = graphView.getDataAt(e); pos = graphView.getLogicalPoint(e); if(!hoverData) return; if(tree[hoverData.getTag()]){ layout(node, pos, 'tips1'); } else if (grass[hoverData.getTag()]) { layout(node, pos, 'tips2'); } else if (mountain[hoverData.getTag()]) { layout(node, pos, 'tips3'); } });
layout()函數(shù)所做的事情,已經(jīng)在前面詳細(xì)的闡述,其中,彈框中屬性值的更新是將JSON文件的的text屬性進(jìn)行數(shù)據(jù)綁定,綁定的格式很簡單,只需將以前的參數(shù)值用一個(gè)帶func屬性的對象替換即可,func的內(nèi)容有一下幾種類型:
1、function類型,直接調(diào)用該函數(shù),并傳入相關(guān)Data和view對象,由函數(shù)返回值決定參數(shù)值,即func(data, view);調(diào)用。
2、string類型:
style@***開頭,則返回data.getStyle(***)值,其中***代表style的屬性名。
attr@***開頭,則返回data.getAttr(***)值,其中***代表attr的屬性名。
field@***開頭,則返回data.***值,其中***代表attr的屬性名。
如果不匹配以上幾種情況,則直接將string類型作為data對象的函數(shù)名調(diào)用data***(view),返回值作為參數(shù)值。
相關(guān)文章
html5結(jié)合Canvas實(shí)現(xiàn)的樹葉飄落動(dòng)畫特效源碼
html5結(jié)合Canvas實(shí)現(xiàn)的樹葉飄落動(dòng)畫特效源碼是一段實(shí)現(xiàn)了樹葉飄落效果的代碼,非常適合作為背景使用,本段代碼適應(yīng)于所有網(wǎng)頁使用,有需要的朋友們歡迎前來下載使用2017-05-02html5 canvas實(shí)現(xiàn)的煙花噴泉?jiǎng)赢嬏匦г创a
這是一款基于html5 canvas實(shí)現(xiàn)的煙花噴泉?jiǎng)赢嬏匦г创a。畫面上呈現(xiàn)出逼真的煙花噴射動(dòng)畫效果2017-05-02HTML5 Canvas騰訊AlloyTeam Web魔幻線條框架curvejs
curvejs是騰訊AlloyTeam打造的一款魔幻線條框架,基于html5 canvas,可以制作出任何炫酷的線條效果2017-05-02html5 canvas實(shí)現(xiàn)鼠標(biāo)經(jīng)過星星一顆一顆連成線動(dòng)畫特效源碼
這是一款基于html5 canvas實(shí)現(xiàn)鼠標(biāo)經(jīng)過星星一顆一顆連成線動(dòng)畫特效源碼。畫面上有這顏色漸變的星空,鼠標(biāo)滑過可呈現(xiàn)出星星由線連接的動(dòng)畫效果2017-04-28html5 canvas實(shí)現(xiàn)的粒子線條連接背景動(dòng)畫特效源碼
這是一款基于html5 canvas實(shí)現(xiàn)的粒子線條連接背景動(dòng)畫特效源碼。畫面中心向外隨機(jī)出現(xiàn)彩色原點(diǎn)做無規(guī)律運(yùn)動(dòng),且原點(diǎn)之間有線條相連2017-04-25html5 canvas實(shí)現(xiàn)運(yùn)動(dòng)的水母動(dòng)畫特效源碼
這是一款基于html5 canvas實(shí)現(xiàn)運(yùn)動(dòng)的水母動(dòng)畫特效源碼。畫面上由彩色線條構(gòu)成的水母呈現(xiàn)出帶有3D立體效果的逼真游動(dòng)動(dòng)畫特效2017-04-24