美文网首页程序员今日看点
Material Design的Toast小控件

Material Design的Toast小控件

作者: im宇 | 来源:发表于2016-09-14 22:02 被阅读416次

    写在前面:
    这是一篇菜鸟的学习笔记,记录效果实现过程,没有考虑安全、兼容、性等问题。供新手参考,也希望前辈们指点。

    效果描述:

    这是一个Material Design风格的Toast效果实现。我希望能够将该效果写成通用型控件,以后方便自己复制粘贴。效果动画如下:

    video.gif

    Toast链接展示

    代码要点:

    • var定义一个新的div,里面在加个p标签并设置css样式:
    var toastdiv = "<div id='comToastBox'"
                        +"class='toast-class'>"
                        +"<p style='color: #ffffff ;font-family: 微软雅黑;padding: 0 40px 0 40px'>"+hint+"</p>"+"</div>";
    
    • jquery动态增加标签元素:
    $(document.body).append(toastdiv);
    
    • jquery动画:
    $("#comToastBox").animate({top:'10%', opacity:'1.0'},300)
                        .delay(2000)
                        .animate({top:'5%',opacity:'0.5'},300,function(){$("#comToastBox").remove();});
    

    完整代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="GB2312">
        <title>Title</title>
        <style type="text/css">
            .toast-class{
                border-radius: 2px;
                border: 1px solid #323232;
                background-color:#323232;
                z-index:999;
                opacity: 0.5;
                position:fixed;
                top:15%;
                right:10%;
                box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);
            }
        </style>
        <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    
    
        <script type="text/javascript">
            $(document).ready(function(){
    
                $("#send").click(function() {
                    showToast("发送成功");
                });
    
            });
            function showToast(hint){
    
                var toastdiv = "<div id='comToastBox'"
                        +"class='toast-class'>"
                        +"<p style='color: #ffffff ;font-family: 微软雅黑;padding: 0 40px 0 40px'>"+hint+"</p>"+"</div>";
    
                $(document.body).append(toastdiv);
                $("#comToastBox").animate({top:'10%', opacity:'1.0'},300)
                        .delay(2000)
                        .animate({top:'5%',opacity:'0.5'},300,function(){$("#comToastBox").remove();});
            }
        </script>
    </head>
    <body>
        <button id="send">显示Toast</button>
    </body>
    </html>
    

    更新
    本次更新主要将之前代码的html、css、js分离开来


    提取css、js代码:

    • 创建toast.css文件,输入如下代码:
    .toast-div{
                border-radius: 2px;
                border: 1px solid #323232;
                background-color:#323232;
                z-index:999;
                opacity: 0.5;
                position:fixed;
                top:15%;
                right:10%;
                box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);
            }
    .toast-p{
                color: #ffffff ;
                font-family: 微软雅黑;
                padding: 0 40px 0 40px;
        }
    
    • 创建toast.js文件,输入如下代码:
    function showToast(hint){
        var toastdiv = "<div id='comToastBox'"
            +"class='toast-div'>"
            +"<p class='toast-p'>"+hint+"</p>"+"</div>";
    
        $(document.body).append(toastdiv);
        $("#comToastBox").animate({top:'10%', opacity:'1.0'},300)
            .delay(2000)
            .animate({top:'5%',opacity:'0.5'},300,function(){$("#comToastBox").remove();});
    }
    
    • html代码改为:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="GB2312">
        <title>Title</title>
        
        <link rel="stylesheet" type="text/css" href="toast.css"><link>
        <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
        <script type="text/javascript" src="toast.js"></script>
    </head>
    <body>
        <button id="send" onclick="showToast('这是一个Toast!')">显示Toast</button>
    </body>
    </html>
    

    更新
    本次更新修复原来连续点击重叠问题


    修改后界面效果如下:

    demo.gif

    修改js代码解决连续点击bug,代码如下:

    var queue = new Array();//使用一个队列来存放toast信息
    var flag = false;//为了使doLoop同一时间段只一个实例工作
    
    function showToast(hint){
        
            queue.unshift(hint);//信息入队列
            doLoop();
        
    }
    
    function doLoop(){
            if(flag == false){
                    flag = true;
                    if(queue.length != 0){
                            var toastdiv = "<div id='comToastBox'"
                    +"class='toast-div'>"
                    +"<p class='toast-p'>"+queue.pop()+"</p>"+"</div>";
                        $(document.body).append(toastdiv);
                        $("#comToastBox").animate({top:'10%', opacity:'1.0'},300)
                            .delay(2000)
                            .animate({top:'5%',opacity:'0.5'},300,function(){$("#comToastBox").remove();flag = false;doLoop();});
                    }
                    else{
                            flag = false;
                    }
                    
            }
    }
    

    更新,2016.10.6
    本次更新使用了类以及单例模式重构代码,更新内容如下


    只附上js文件更新部分,其他可移步Toast示例代码

    /*Toast控件类,使用了单例模式*/
    function ToastClass(){
        if(ToastClass.instance !== undefined){
            return ToastClass.instance;
        }
        ToastClass.instance = this;
        this.toastQueue = new Array();//使用一个队列来存放toast信息
        this.toastFlag = false;//为了使doLoop同一时间段只一个实例工作
        
        this.showToast = function(hint){
            this.toastQueue.unshift(hint);
            doLoop(this);
        }
        
        var doLoop = function(_this){
            if(_this.toastFlag == false){
                        _this.toastFlag = true;
                        if(_this.toastQueue.length != 0){
                                var toastdiv = "<div id='mmdToastDiv'"
                        +"class='mmd-toast-div'>"
                        +"<p class='mmd-toast-p'>"+_this.toastQueue.pop()+"</p>"+"</div>";
                            $(document.body).append(toastdiv);
                            $("#mmdToastDiv").animate({top:'10%', opacity:'1.0'},300)
                                .delay(2000)
                                .animate({top:'5%',opacity:'0.5'},300,function(){$("#mmdToastDiv").remove();_this.toastFlag = false; doLoop(_this);});
                        }
                        else{
                                _this.toastFlag = false;
                        }
                        
                }
        }
    }
    /*Toast控件类对html的接口*/
    function mmdShowToast(hint){
        toast = new ToastClass();
        toast.showToast(hint);
    }
    

    最后附上源代码:

    Toast示例代码

    相关文章

      网友评论

        本文标题:Material Design的Toast小控件

        本文链接:https://www.haomeiwen.com/subject/fqgvettx.html