使用jquery封裝的動畫腳本(無動畫、css3動畫、js動畫)

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

自己封裝好的showhide.js 包含無動畫、css3動畫、js動畫 包括:fade(淡入淡出) slideUpDown(上下滑動) slideLeftRight(左右滑動) fadeSlideUpDown(淡入淡出+上下滑動) fadeSlideLeftRight (淡入淡出+左右滑動) (fu ...


自己封裝好的showhide.js

包含無動畫、css3動畫、js動畫

包括:fade(淡入淡出)  slideUpDown(上下滑動)  slideLeftRight(左右滑動)  fadeSlideUpDown(淡入淡出+上下滑動)  fadeSlideLeftRight (淡入淡出+左右滑動)

(function($){
    var transition=window.mt.transition;//支持的transition寫法
    var isSupport=window.mt.isSupport;//是否支持transition

    // 公共init
    function init($elem,hiddenCall){
        if($elem.is(":hidden")){
            $elem.data("status","hidden");
            if(typeof hiddenCall==="function") hiddenCall();
        }else{
            $elem.data("status","shown");
        }    
    }
    //公共show
    function show($elem,callback){
        if($elem.data("status")==="show") return;
        if($elem.data("status")==="shown") return;

        $elem.data("status","show").trigger("show");
        callback();
    }
    // 公共hide
    function hide($elem,callback){
        if($elem.data("status")==="hide") return;
        if($elem.data("status")==="hidden") return;

        $elem.data("status","hide").trigger("hide");
        callback();
    }
    // 無動畫方式
    var silent={
        init:init,
        show:function($elem){
            show($elem,function(){
                $elem.show();
                $elem.data("status","shown").trigger("shown");
            });
        },
        hide:function($elem){
            hide($elem,function(){
                $elem.hide();
                $elem.data("status","hidden").trigger("hidden");
            });
        }
    }
    // css3動畫方式
    var css3={
        _init:function($elem,className){
            $elem.addClass("transition");
            init($elem,function(){
                $elem.addClass(className);
            });        
        },
        _show:function($elem,className){
            $elem.off(transition).one(transition,function(){//動畫執行完畢後執行shown
                $elem.data("status","shown").trigger("shown");
            })
            $elem.show();
            setTimeout(function(){
                $elem.removeClass(className);
            },20);            
        },
        _hide:function($elem,className){
            $elem.off(transition).one(transition,function(){
                $elem.hide();
                $elem.data("status","hidden").trigger("hidden");
            })
            $elem.addClass(className);
        },
        //淡入淡出
        fade:{
            init:function($elem){
                css3._init($elem,"fadeOut");
            },
            show:function($elem){
                show($elem,function(){
                    css3._show($elem,"fadeOut");    
                });
            },
            hide:function($elem){
                hide($elem,function(){
                    css3._hide($elem,"fadeOut");
                });
            }
        },
        //上下滑動
        slideUpDown:{
            init:function($elem){        
                //$elem.height($elem.height());//獲取到元素被內容撐開的高度,動態設置高度
                css3._init($elem,"slideUpDownCollapse");
            },
            show:function($elem){
                show($elem,function(){
                    css3._show($elem,"slideUpDownCollapse");        
                });
            },
            hide:function($elem){
                hide($elem,function(){
                    css3._hide($elem,"slideUpDownCollapse");
                });
            }
        },
        //左右滑動
        slideLeftRight:{
            init:function($elem){        
                $elem.width($elem.width());//獲取到元素被內容撐開的高度,動態設置高度
                css3._init($elem,"slideLeftRightCollapse");
            },
            show:function($elem){
                show($elem,function(){
                    css3._show($elem,"slideLeftRightCollapse");        
                });
            },
            hide:function($elem){
                hide($elem,function(){
                    css3._hide($elem,"slideLeftRightCollapse");
                });
            }
        },
        //淡入淡出式上下滑動
        fadeSlideUpDown:{
            init:function($elem){        
                $elem.height($elem.height());//獲取到元素被內容撐開的高度,動態設置高度
                css3._init($elem,"fadeOut slideUpDownCollapse");
            },
            show:function($elem){
                show($elem,function(){
                    css3._show($elem,"fadeOut slideUpDownCollapse");        
                });
            },
            hide:function($elem){
                hide($elem,function(){
                    css3._hide($elem,"fadeOut slideUpDownCollapse");
                });
            }
        },
        //淡入淡出式左右滑動
        fadeSlideLeftRight:{
            init:function($elem){        
                $elem.width($elem.width());//獲取到元素被內容撐開的高度,動態設置高度
                css3._init($elem,"fadeOut slideLeftRightCollapse");
            },
            show:function($elem){
                show($elem,function(){
                    css3._show($elem,"fadeOut slideLeftRightCollapse");        
                });
            },
            hide:function($elem){
                hide($elem,function(){
                    css3._hide($elem,"fadeOut slideLeftRightCollapse");
                });
            }
        }
    }
    // js動畫方式
    var js={
        _init:function($elem,callback){
            $elem.removeClass("transition");
            init($elem,callback);        
        },
        _show:function($elem,mode){
            show($elem,function(){
                $elem.stop()[mode](function(){
                    $elem.data("status","shown").trigger("shown");
                });            
            });        
        },
        _hide:function($elem,mode){
            hide($elem,function(){
                $elem.stop()[mode](function(){
                    $elem.data("status","hidden").trigger("hidden");
                });            
            });        
        },
        //自定義初始化公共部分
        _customInit:function($elem,options){//options是一個對象,包含所有要改變的屬性        
            var styles={};
            for(var o in options){
                styles[o]=$elem.css(o);
            }

            $elem.data("styles",styles);//如果不保存,則styles為局部,無法在其他函數中使用

            js._init($elem,function(){
                $elem.css(options);
            });
        },
        _customShow:function($elem){
            show($elem,function(){
                var styles=$elem.data("styles");

                $elem.show();
                //使用animate進行動畫            
                $elem.stop().animate(styles,function(){//動畫結束後的回調
                    $elem.data("status","shown").trigger("shown");
                });
            });        
        },
        _customHide:function($elem,options){
            hide($elem,function(){        
                $elem.stop().animate(options,function(){//動畫結束後的回調
                    $elem.hide();
                    $elem.data("status","hidden").trigger("hidden");
                });
            });
        },
        fade:{
            init:function($elem){
                js._init($elem);
            },
            show:function($elem){
                js._show($elem,"fadeIn");
            },
            hide:function($elem){
                js._hide($elem,"fadeOut");
            }        
        },
        slideUpDown:{
            init:function($elem){
                js._init($elem);
            },
            show:function($elem){
                js._show($elem,"slideDown");
            },
            hide:function($elem){
                js._hide($elem,"slideUp");
            }    
        },
        slideLeftRight:{
            init:function($elem){
                js._customInit($elem,{
                    "width":0,
                    "padding-left":0,
                    "padding-right":0
                });
            },
            show:function($elem){
                js._customShow($elem);
            },
            hide:function($elem){
                js._customHide($elem,{
                    "width":0,
                    "padding-left":0,
                    "padding-right":0
                });
            }            
        },
        fadeSlideUpDown:{
            init:function($elem){
                js._customInit($elem,{
                    "opacity":0,
                    "height":0,
                    "padding-top":0,
                    "padding-bottom":0
                });
            },
            show:function($elem){
                js._customShow($elem);
            },
            hide:function($elem){
                js._customHide($elem,{
                    "opacity":0,
                    "height":0,
                    "padding-top":0,
                    "padding-bottom":0
                });
            }    
        },
        fadeSlideLeftRight:{
            init:function($elem){
                js._customInit($elem,{
                    "opacity":0,
                    "width":0,
                    "padding-left":0,
                    "padding-right":0
                });
            },
            show:function($elem){
                js._customShow($elem);
            },
            hide:function($elem){
                js._customHide($elem,{
                    "opacity":0,
                    "width":0,
                    "padding-left":0,
                    "padding-right":0
                });
            }    
        }
    }

    //設置預設參數
    var defaults={
        css3:false,
        js:false,
        animation:"fade"
    };

    //封裝一個函數
    function showHide($elem,options){
        var mode=null;

        if(options.css3 && isSupport){//css3動畫
            mode=css3[options.animation] || css3[defaults.animation];//容錯
        }else if(options.js){//js動畫
            mode=js[options.animation] || js[defaults.animation];
        }else{//無動畫
            mode=silent;
        }

        mode.init($elem);

        return {
            show:$.proxy(mode.show,this,$elem),
            hide:$.proxy(mode.hide,this,$elem)            
        };    
    }

    // 改成jquery插件方式        
    $.fn.extend({
        showHide:function(opt){
            //this指向調用該插件的元素,這裡是box
            //可能是一個元素,也可以是多個元素,因此使用each遍歷
            return this.each(function(){
                var ui=$(this);
                // 如果options傳遞的是參數對象,則options屬性與defaults屬性進行合併,存入空對象中賦值給options
                // 如果options傳遞的不是對象,則為false,屬性為defaults預設屬性,並賦值給options
                // $.extend(target, obj1, objn) 對象合併
                var options=$.extend({},defaults,typeof opt==="object" && opt);
                    
                /*
                    opt為參數對象時,如:
                    box.showHide({
                        css3:true,
                        animation:"slideLeftRight"            
                    });
                */        
                var mode=ui.data("showHide");    
                //mode對象實例只需要生成一次                    
                if(!mode){
                    mode=showHide(ui,options);//mode返回包含show和hide方法的一個對象
                    ui.data("showHide",mode);
                }
                
                /*
                    opt為show或者hide字元串時,如:
                    box.showHide("show");
                */
                //如果options是show或者hide的字元串,則執行方法
                if(typeof mode[opt]==="function"){
                    mode[opt]();
                }
            })
            
        }
    });

})(jQuery);

頁面使用方法:

<!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:400px;
            /*height:300px;*//*height撐開*/    
            /*padding:150px 0;*//*padding撐開*/        
            background-color:pink;
            overflow:hidden;/*被內容撐開高度,需要設置溢出隱藏*/
        }
        .transition{
            -webkit-transition:all .5s;
            -moz-transition:all .5s;
            -ms-transition:all .5s;
            -o-transition:all .5s;
            transition:all .5s;
        }
        .fadeOut{
            opacity: 0;
            visibility: hidden;
        }
        /*收縮樣式*/
        .slideUpDownCollapse{
            height:0 !important;/*避免因為優先順序不夠而無法生效*/
            padding-top:0 !important;
            padding-bottom:0 !important;
        }
        .slideLeftRightCollapse{
            width:0 !important;/*避免因為優先順序不夠而無法生效*/
            padding-left:0 !important;
            padding-right:0 !important;
        }
    </style>
</head>
<body>
    <button id="btn-show" class="btn">顯示</button><button id="btn-hide" class="btn">隱藏</button>
    <div class="box">
        內容<br>
        撐開<br>
        高度<br>
    </div>
    <button class="btn">測試占位問題</button>

    <script src="../js/jquery.js"></script>
    <script src="../js/transition.js"></script>
    <script src="../js/showhide.js"></script>
    <script>

        var box=$(".box");

        //jquery插件方式傳參
        box.showHide({
            css3:true,
            animation:"slideLeftRight"            
        });//返回一個包含show和hide方法的對象mode

        $("#btn-show").on("click",function(){
            //jquery插件方式調用
            box.showHide("show");
        });
        $("#btn-hide").on("click",function(e){
            //jquery插件方式調用
            box.showHide("hide");
        });

        box.on("show shown hide hidden",function(e){
            if(e.type==="show"){
                console.log("show");
            }
            if(e.type==="shown"){
                console.log("shown");        
            }
            if(e.type==="hide"){
                console.log("hide");                        
            }
            if(e.type==="hidden"){
                console.log("hidden");                    
            }
        });

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

註意:引入的transition.js在之前的文章中已貼:https://www.cnblogs.com/chenyingying0/p/12363649.html

base.css:https://www.cnblogs.com/chenyingying0/p/12363689.html

簡單解釋一下:

 

 這塊是設置選擇css3動畫的slideLeftRight效果

當然在showhide.js里是有設置過預設選項的

 

 

 

 這裡的elem.showHide("show")  elem.showHide("hide") 分別代表顯示和隱藏操作

 

 這塊分別是當元素開始顯示 顯示完成 開始隱藏 隱藏完成時要進行的操作

可以自己定義


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

-Advertisement-
Play Games
更多相關文章
  • Android.bp是用來替換Android.mk的配置文件,它使用Blueprint框架來解析。Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong則是專為Android編譯而設計的工具,Blueprint只是解析文件的形式,而Soong則解釋內容的含義,最終 ...
  • Api分類 internal api 翻譯為內部API,理解為供sdk內部使用的API。 這類介面最初打算就是不對外公開的,有點private的意思。 hide api 在源碼中看到使用@hide 標記的方法或類,就是hide的。 這類介面本意是要公開,但是當前階段仍然不穩定或未開發完成。所以暫時不 ...
  • @[TOC] 面向過程編程P OP(Process oriented programming) 面向過程就是分析出解決問題的步驟,然後用函數把這些步驟一步一步實現,使用的時候再一個一個的依次調用就可以了。 優點:性能比面向對象高,適合跟硬體聯繫很緊密的東西,例如單片機就採用的面向過程編程 缺點:沒有 ...
  • 效果圖 直接放代碼 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>cat</title> <link rel="stylesheet" href="../css/base.css"> <link rel=" ...
  • 遇到這個問題,我在網上找了好多資料,最終於解決了!!! ★,° :.☆( ̄▽ ̄)/$: .°★ 。 我遇到的問題是這樣的:鏈接mysql完全按照官網上做的,但是在yarn dev 時就是一直報錯,錯誤我就不貼出來了,看不懂
  • 整個新年,大多數的我們都在家休了個超長的假期,COVID 19 的疫情總會過去,一個多月的時間,不知大家在家是否有思考自己後續的路應該怎麼走,是否應該堅持走下去? 幸福的軟體研發人員? 我暫且將所有的互聯網研發從業人員都統稱為軟體研發人員。嚴峻的疫情對我們有影響嗎?這裡的影響如果只是指研發工作的話, ...
  • 先放圖 首先要引用的文件有: base.css https://www.cnblogs.com/chenyingying0/p/12363689.html jquery.js transition.js https://www.cnblogs.com/chenyingying0/p/12363649 ...
  • 首先曬出封裝好的dropdown.js (function($){ 'use strict';//使用嚴格模式 //構造函數形式 function Dropdown(elem,options){ //保存到this中才能公用 this.elem=elem; this.options=options; ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...