顯示層封裝及實現與優化(無動畫+css3動畫+js動畫)

来源:https://www.cnblogs.com/chenyingying0/archive/2020/02/22/12343787.html
-Advertisement-
Play Games

showhide.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>showhide</title> <link rel="stylesheet" href="../css/base.css"> <s ...


showhide.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>showhide</title>
    <link rel="stylesheet" href="../css/base.css">
    <style>
        body{
            width:400px;
            margin:0 auto;
        }
        button{
            width:50%;
            height:30px;
            background: #abcdef;
        }
        .box{
            width:360px;
            height:260px;
            background-color:pink;
            padding:20px;
        }
    </style>
</head>
<body>
    <button id="btn-show" class="btn">顯示</button><button id="btn-hide" class="btn">隱藏</button>
    <div class="box"></div>

    <script src="../js/jquery.js"></script>
    <script>
        var silent={
            show:function($elem,showCall,shownCall){
                if(typeof showCall === "function") showCall();
                $elem.show();
                if(typeof shownCall === "function") shownCall();
            },
            hide:function($elem,hideCall,hiddenCall){
                if(typeof showCall === "function") hideCall();
                $elem.hide();
                if(typeof shownCall === "function") hiddenCall();
            }
        }
        var css3={
            fade:{
            },
            slideUpDown:{
            },
            slideLeftRight:{
            },
            fadeSlideUpDown:{
            },
            fadeSlideLeftRight:{
            }
        }
        var js={
            fade:{
            },
            slideUpDown:{
            },
            slideLeftRight:{
            },
            fadeSlideUpDown:{
            },
            fadeSlideLeftRight:{
            }
        }

        var box=$(".box");
        var btnShow=$("#btn-show");
        var btnHide=$("#btn-hide");

        btnShow.on("click",function(){
            silent.show(box,function(){
                box.html("我要顯示啦");
            },function(){
                setTimeout(function(){
                    box.html(box.html()+" 我已經顯示啦");
                },1000)            
            });
        });

        btnHide.on("click",function(){
            silent.hide(box,function(){

            },function(){
        
            });
        });

    </script>
</body>
</html>

效果圖

 

 

 這種方式有一個缺點,就是不適合多人協作的情況

因此選用發佈訂閱的方式,使用 jquery的 trigger 來觸發事件

實現多人協作互不幹擾

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>showhide</title>
    <link rel="stylesheet" href="../css/base.css">
    <style>
        body{
            width:400px;
            margin:0 auto;
        }
        button{
            width:50%;
            height:30px;
            background: #abcdef;
        }
        .box{
            width:360px;
            height:260px;
            background-color:pink;
            padding:20px;
        }
    </style>
</head>
<body>
    <button id="btn-show" class="btn">顯示</button><button id="btn-hide" class="btn">隱藏</button>
    <div class="box"></div>

    <script src="../js/jquery.js"></script>
    <script>
        var silent={
            show:function($elem){
                $elem.trigger("show");
                $elem.show();
                $elem.trigger("shown");
            },
            hide:function($elem){
                $elem.trigger("hide");
                $elem.hide();
                $elem.trigger("hidden");
            }
        }
        var css3={
            fade:{
            },
            slideUpDown:{
            },
            slideLeftRight:{
            },
            fadeSlideUpDown:{
            },
            fadeSlideLeftRight:{
            }
        }
        var js={
            fade:{
            },
            slideUpDown:{
            },
            slideLeftRight:{
            },
            fadeSlideUpDown:{
            },
            fadeSlideLeftRight:{
            }
        }

        var box=$(".box");

        $("#btn-show").on("click",function(){
            silent.show(box);
        });
        $("#btn-hide").on("click",function(e){
            silent.hide(box);
        });

        // 模擬多人協作,A操作文本
        box.on("show shown",function(e){
            //console.log(e.type);
            if(e.type==="show"){
                box.html("我要顯示了");
            }
            if(e.type==="shown"){
                setTimeout(function(){
                    box.html(box.html()+"我已經顯示了");
                },1000);                
            }
        });

        // 模擬多人協作,B操作背景色
        box.on("show shown",function(e){
            if(e.type==="show"){
                box.css("background-color","lightgreen");
            }
            if(e.type==="shown"){
                setTimeout(function(){
                    box.css("background-color","orange");
                },1000);                
            }
        });


    </script>
</body>
</html>

效果圖

 

 

 

 

 

 需要增加判斷機制,在已經顯示的情況下,點擊顯示不再觸發顯示事件,避免性能浪費

解決連續點擊多次觸發的情況

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>showhide</title>
    <link rel="stylesheet" href="../css/base.css">
    <style>
        body{
            width:400px;
            margin:0 auto;
        }
        button{
            width:50%;
            height:30px;
            background: #abcdef;
        }
        .box{
            width:360px;
            height:260px;
            background-color:pink;
            padding:20px;
        }
    </style>
</head>
<body>
    <button id="btn-show" class="btn">顯示</button><button id="btn-hide" class="btn">隱藏</button>
    <div class="box"></div>

    <script src="../js/jquery.js"></script>
    <script>
        var silent={
            show:function($elem){
                // 顯示狀態下不再重覆顯示
                if($elem.data("status")==="show") return;
                if($elem.data("status")==="shown") return;

                // 通過設置data-status的屬性來判斷當前的狀態
                $elem.data("status","show").trigger("show");
                $elem.show();
                $elem.data("status","shown").trigger("shown");
            },
            hide:function($elem){
                if($elem.data("status")==="hide") return;
                if($elem.data("status")==="hidden") return;

                $elem.data("status","hide").trigger("hide");
                $elem.hide();
                $elem.data("status","hidden").trigger("hidden");
            }
        }
        var css3={
            fade:{
            },
            slideUpDown:{
            },
            slideLeftRight:{
            },
            fadeSlideUpDown:{
            },
            fadeSlideLeftRight:{
            }
        }
        var js={
            fade:{
            },
            slideUpDown:{
            },
            slideLeftRight:{
            },
            fadeSlideUpDown:{
            },
            fadeSlideLeftRight:{
            }
        }

        var box=$(".box");

        $("#btn-show").on("click",function(){
            silent.show(box);
        });
        $("#btn-hide").on("click",function(e){
            silent.hide(box);
        });

        box.on("show shown",function(e){
            //console.log(e.type);
            if(e.type==="show"){
                box.html("我要顯示了");
            }
            if(e.type==="shown"){
                setTimeout(function(){
                    box.html(box.html()+"我已經顯示了");
                },1000);                
            }
        });

    </script>
</body>
</html>

但由於初始時box並沒有設置data-status屬性,因此總能至少執行一次

因此需要引入初始化操作,根據元素的狀態添加初始的data-status屬性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>showhide</title>
    <link rel="stylesheet" href="../css/base.css">
    <style>
        body{
            width:400px;
            margin:0 auto;
        }
        button{
            width:50%;
            height:30px;
            background: #abcdef;
        }
        .box{
            width:360px;
            height:260px;
            background-color:pink;
            padding:20px;
        }
    </style>
</head>
<body>
    <button id="btn-show" class="btn">顯示</button><button id="btn-hide" class="btn">隱藏</button>
    <div class="box"></div>

    <script src="../js/jquery.js"></script>
    <script>
        var silent={
            init:function($elem){
                // elem.is(":hidden")判斷元素是否處於隱藏狀態
                if($elem.is(":hidden")){
                    $elem.data("status","hidden");
                }else{
                    $elem.data("status","shown");
                }
            },
            show:function($elem){
                // 顯示狀態下不再重覆顯示
                if($elem.data("status")==="show") return;
                if($elem.data(	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對象對於JavaScript至關重要,在ES6中對象又加了很多新特性。 對象字面量:屬性的簡潔表示法 ES6允許對象的屬性直接寫變數,這時候屬性名是變數名,屬性值是變數值。 let attr1 = "ES6"; let attr2 = 'testDemo'; let testObj = {attr1 ...
  • 有關浮動和清浮動問題,個人理解是float:left或者float:right的css樣式打破div標準流獨占一行的傳統,脫離了文檔流,所造成的浮動頁面影響類似"捆橡皮筋,當你把橡皮都拿走了,橡皮筋就回縮了",這時候,你要做的就是考慮如何有效的防止橡皮筋回縮,就是防止我們佈局的div盒子回縮,那清浮... ...
  • 如何通過absoulue與relative配合把一個盒子或者是把2個div塊同時放到頁面中央部分?定位完成後為什麼又需要margin-left與margin-top各往回走50%的長度,別忘記用z-index定位高度,請看下麵代碼展示: ...
  • <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <button class="btn">按鈕</button> <script src="../js/j ...
  • 用 showhide 改寫dropdown 模塊: 1.首先在 css中新增動畫相關樣式 /*showhide組件的樣式*/ .fadeOut{ opacity: 0; visibility: hidden; } /*收縮樣式*/ .slideUpDownCollapse{ height:0 !im ...
  • table表格中border-collapse: collapse;/*表格邊框是否合併*/border-spacing: 10px;/*表格邊框之間的距離*/定位詳情可以閱讀position屬性值4缺一帶你瞭解相對還是絕對抑或是固定定位,實現div絕對居中法/*父定位子絕對,子的坐標系是父的左上角... ...
  • 滑鼠cursor常見樣式crosshair;/*十字形狀*/cursor:pointer;/*小手形狀*/cursor:wait;/*等待形狀*/cursor:text;/*預設 文本形狀*/cursor:default;/*箭頭指示形狀*/cursor:help;/*幫助形狀*/ 列表(list... ...
  • 前言 在一般的代碼中很少會接觸到進位和位運算,但這不代表我們可以不去學習它。作為一位編程人員,這些都是基礎知識。如果你沒有學過這方面的知識,也不要慌,接下來的知識並不會很難。本文你將會學習到: 進位轉換 按位操作符 Javascript進位轉換 手動實現進位轉換 進位轉換 以下使用常見的十進位和二進 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...