首頁 web前端 H5教程 分享HTML5實作彈出框的效果範例

分享HTML5實作彈出框的效果範例

May 10, 2018 pm 02:57 PM
html5

這篇文章主要介紹了基於HTML5 Canvas 實現彈出框效果,需要的朋友可以參考下

用戶滑鼠移入時,有彈出框出現,這樣的需求很常見。這在處理HTML元素實作時簡單,但是如果是對HTML5 Canvas 構成的圖形進行處理,這種方法不再適用,因為Canvas使用的是另外一套機制,無論在Canvas上繪製多少圖形,Canvas都是一個整體。而圖形本身實際上都是Canvas的一部分,不可單獨獲取,所以也無法直接為某個圖形增加JavaScript事件。然而,在HT for Web中,這種需求很容易實現,場景如下:

#  這個場景圖是基於HT for Web的JSON文件,可能大家對怎麼生成這樣的JSON檔案有疑惑,其實這裡是基於這個麻雀雖小五臟俱全的「HTML5拓撲圖編輯器」(www.hightopo.com/demo/2deditor_20151010/HT-2D-Editor.html)進行了擴展,很容易就自訂出滿足我需求拓樸編輯器。不僅如此,在這個Demo中,定義的三種類型彈框的向量圖'tips1.json'、'tips2.json'、'tips3.json'是透過這個向量編輯器(http://www.hightopo. com/demo/vector-editor/index.html)簡單繪製了下,也還蠻好用。在上述場景中,當使用者將滑鼠移入到草地等物件時,會有彈出框顯示它的詳細訊息,Demo位址:http://www.hightopo.com/demo/blog_meadow_20170605/index.html

#具體實現如下:

準備工作

   引入我們的HT(www.hightopo.com/):

<script src=&#39;ht.js&#39;></script>
dataModel = new ht.DataModel();
graphView = new ht.graph.GraphView(dataModel);
graphView.addToDOM();
登入後複製

   HT提供了自訂的JSON格式的向量描述形式,以HT標準定義的JSON向量格式,也可以作為圖片進行註冊和使用,HT的向量方式比傳統格式更節省空間,縮放不失真,戳HT for Web了解詳細資訊。這裡,將三種形狀的JSON彈出框註冊成圖片以便後續調用:

ht.Default.setImage(&#39;tips1&#39;, &#39;symbols/tips1.json&#39;);
ht.Default.setImage(&#39;tips2&#39;, &#39;symbols/tips2.json&#39;);
ht.Default.setImage(&#39;tips3&#39;, &#39;symbols/tips3.json&#39;);
登入後複製

 然後獲取有交互效果的對象,其中各個對像中的屬性名是給各個圖元設置好的標籤名:

//树
var tree = {
     &#39;tree1&#39; : true,
     &#39;tree2&#39; : true,
     &#39;tree3&#39; : true
};
//草地
var grass = {
     &#39;grass1&#39; : true,
     &#39;grass2&#39; : true,
     &#39;grass3&#39; : true
 };
//山
var mountain = {
    &#39;mountain&#39;: true
};
登入後複製

彈出方塊

    其實彈出方塊的本質是一個Node,當使用者滑鼠移入移出時,

#1、控制Node的隱藏和顯示可以達到彈框的效果;

2、滑鼠位置的改變伴隨著Node位置的改變;

3、滑鼠移入到不同的物件上時,Node上的貼圖也跟著改變;

4、Node中的屬性值也隨著滑鼠位置改變。

    所以,要實現彈框,首先應新建Node,並將其的層級設為'higher',在這之前還需要將場景圖的JSON檔案反序列化,並且給反序列化後的圖元皆設定為層級'lower',防止被現有的圖元擋住:

ht.Default.xhrLoad(&#39;meadow.json&#39;, function(text) {
    const json = ht.Default.parse(text);                   
    if(json.title) document.title = json.title;
    dataModel.deserialize(json);
    //设置层级
    dataModel.each(function(data){
        data.setLayer(&#39;lower&#39;);
    });
    //新建node
    var node = new ht.Node();                   
    node.s(&#39;2d.visible&#39;,false);
    node.setLayer(&#39;higher&#39;);
    dataModel.add(node);
})
登入後複製

  然後,對底層的p監聽mousemove事件,判斷滑鼠的位置是否在上述三個物件之上,根據物件類型,呼叫layout()函數對Node重新佈局:

graphView.getView().addEventListener(&#39;mousemove&#39;, function(e) {
     node.s(&#39;2d.visible&#39;,false);
     var hoverData = graphView.getDataAt(e);
     pos = graphView.getLogicalPoint(e);
     if(!hoverData) return;
     if(tree[hoverData.getTag()]){
        layout(node, pos, &#39;tips1&#39;);
     } else if (grass[hoverData.getTag()]) {
        layout(node, pos, &#39;tips2&#39;);
     } else if (mountain[hoverData.getTag()]) {
        layout(node, pos, &#39;tips3&#39;);
     }
});
登入後複製

  layout()函數所做的事情,已經在前面詳細的闡述,其中,彈框中屬性值的更新是將JSON文件的的text屬性進行資料綁定,綁定的格式很簡單,只需將先前的參數值用一個帶有func屬性的物件替換即可,func的內容有幾種類型:

#1 、function類型,直接呼叫函數,並傳入相關Data和view對象,由函數傳回值決定參數值,即func(data, view);呼叫。

2、string類型:

      style@***開頭,則傳回data.getStyle(***)值,其中***代表style的物件名稱。

      attr@***開頭,則傳回data.getAttr(***)值,其中***代表attr的屬性名稱。

      field@***開頭,則傳回data.***值,其中***代表attr的屬性名稱。

      若不符合以上幾種情況,則直接將string類型作為data物件的函數名稱呼叫data***(view),並傳回值作為參數值。

    除了func屬性外,還可以設定value屬性作為預設值,如果對應的func取得的值為undefined或null時,則會採用value屬性定義的預設值,詳情可見HT for Web資料綁定手冊(http://www.hightopo.com/guide/guide/core/datamodel/ht-datamodel-guide.html)。例如,在這裡,'tips1.json'檔案中對陽光值進行資料綁定的結果如下:

"text": {
        "func": "attr@sunshine",
        "value": "阳光值"
      },
登入後複製

 下面貼上layout()函數的原始程式碼:

function layout(node, pos, type){
                node.s(&#39;2d.visible&#39;,true);
                node.setImage(type);                  
                if(type == &#39;tips1&#39;){
                    node.setPosition(pos.x + node.getWidth()/2, pos.y - node.getHeight()/2);
                    node.a({
                        &#39;sunshine&#39;  :   &#39;阳光值   :     &#39;+ (pos.x/1000).toFixed(2),
                        &#39;rain&#39;  :   &#39;雨露值   :     &#39;+ (pos.y/1000).toFixed(2),
                        &#39;love&#39;  :   &#39;爱心值   :    ***&#39;
                    });
                } else if(type == &#39;tips2&#39;){
                    node.setPosition(pos.x , pos.y - node.getHeight()/2);
                    node.a({
                        &#39;temp&#39;  :   &#39;温度   :     30&#39;,
                        &#39;humidity&#39;  :   &#39;湿度   :     &#39;+Math.round(pos.x/100)+&#39;%&#39;
                    });
                } else if(type == &#39;tips3&#39;){
                    node.setPosition(pos.x - node.getWidth()/2, pos.y - node.getHeight()/2);
                    node.a({
                        &#39;hight&#39;  :   &#39;海拔   :    &#39; + Math.round(pos.y)+&#39;米&#39;,
                        &#39;landscapes&#39;  :   &#39;地貌   :    喀斯特&#39;
                    });
                }
            }
登入後複製

雲端移動

    最後,我們的Demo還有個雲端移動的動畫效果,在HT的資料模型驅動的圖形元件的設計架構下,動畫可理解為將某些屬性由起始值逐漸變成目標值的過程,HT提供了ht.Default.startAnim的動畫函數,ht.Default.startAnim支援Frame-Based和Time-Based兩種方式的動畫:

Frame-Based方式用户通过指定frames动画帧数,以及interval动画帧间隔参数控制动画效果;

Time-Based方式用户只需要指定duration的动画周期的毫秒数即可,HT将在指定的时间周期内完成动画。

详情见HT for Web。

在这里我们用的是Time-Based方式,源码如下:

var cloud = dataModel.getDataByTag(&#39;cloud&#39;);
parent = dataModel.getDataByTag(&#39;mountain&#39;);
round1 = parent.getPosition().x - parent.getWidth()/2 + cloud.getWidth()/2;
round2 = parent.getPosition().x + parent.getWidth()/2 - cloud.getWidth()/2;
end = round1;
//云运动动画
var animParam = {
    duration: 10000,
    finishFunc: function() {
         end = (end == round1) ? round2 : round1;
         ht.Default.startAnim(animParam);
    },
    action: function(v, t) {
         var p = cloud.getPosition();
         cloud.setPosition(p.x + (end - p.x) * v , p.y);
     }
};
ht.Default.startAnim(animParam);
登入後複製

以上是分享HTML5實作彈出框的效果範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

See all articles