zoukankan      html  css  js  c++  java
  • 实现加载提示组件

    实现加载提示组件

    在开发时经常需要用到加载提示,例如发起一个XHR请求时就需要给予用户一个交互的反馈,实现一个加载提示组件,重要的部分已经做出注释。

    实例

    <!DOCTYPE html>
    <html>
    <head>
        <title>loading</title>
        <style type="text/css">
            #__loading__{ /* 设置遮罩层 */
                position: fixed;
                 100%;
                height: 100%;
                top: 0;
                left: 0;
                z-index: -10000;
                opacity: 0;
                visibility: hidden;
                background-color: rgba(255, 255, 255, .9);
                transition: all .5s;
            }
    
            #__loading__ > .__container__{ /* 内部容器 居中SVG */
                 100%;
                height: 100%;
                display: flex;
                align-items: center;
                justify-content: center;
            }
    
            .__show__{ /* 显示 */
                opacity: 1 !important;
                z-index: 10000 !important;
                visibility: visible !important;
                transition: all .5s !important;
            }
    
            button{
                cursor: pointer;
            }
        </style>
    </head>
    <body>
        <button onclick="show()" >Loading</button>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
        <div>文字仅作为测试遮罩效果用</div>
    </body>
    <script>
        class Loading{
            constructor(){
                let uniqueID = "__loading__"; // __开头防止ID冲突
                const exist = document.querySelector("#" + this.uniqueID); // 判断是否已初始化存在DOM结构
                if(exist){
                    this.instance = exist; // 存在则实例直接赋予
                }else{
                    let instance = document.createElement("div"); // 创建实例
                    instance.id = uniqueID;
                    instance.innerHTML = `
                        <div class="__container__">
                            <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="37px" height="37px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50" xml:space="preserve">
                                <path fill="#4C98F7" d="M43.935,25.145c0-10.318-8.364-18.683-18.683-18.683c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615c8.072,0,14.615,6.543,14.615,14.615H43.935z" transform="rotate(275.098 25 25)">
                                    <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="0.6s" repeatCount="indefinite"></animateTransform>
                                </path>
                            </svg>
                        </div>
                    `.replace(/[s]+/g, " ");
                    this.instance = instance; // 对象赋值实例
                    document.body.appendChild(this.instance); // body下添加实例
                }
            }
            start(){
                this.instance.classList.add("__show__"); // 显示
            }   
            stop(){
                this.instance.classList.remove("__show__"); // 隐藏
            }
        }
    
        // 作为模块则直接导出实例
        // export default new Loading();
    
        const loading = new Loading(); 
    
        function show() {
            loading.start();
            setTimeout(() => loading.stop(), 1000);
        }
    </script>
    
    </html>
    

    附带6SVG实现的LOADING提示动画。

    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30px" height="30px" viewBox="0 0 40 40" enable-background="new 0 0 40 40" xml:space="preserve">
      <path opacity="0.2" fill="#4C98F7" d="M20.201,5.169c-8.254,0-14.946,6.692-14.946,14.946c0,8.255,6.692,14.946,14.946,14.946
          s14.946-6.691,14.946-14.946C35.146,11.861,28.455,5.169,20.201,5.169z M20.201,31.749c-6.425,0-11.634-5.208-11.634-11.634
          c0-6.425,5.209-11.634,11.634-11.634c6.425,0,11.633,5.209,11.633,11.634C31.834,26.541,26.626,31.749,20.201,31.749z"></path>
      <path fill="#4C98F7" d="M26.013,10.047l1.654-2.866c-2.198-1.272-4.743-2.012-7.466-2.012h0v3.312h0
          C22.32,8.481,24.301,9.057,26.013,10.047z" transform="rotate(42.1171 20 20)">
          <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 20 20" to="360 20 20" dur="0.5s" repeatCount="indefinite"></animateTransform>
      </path>
    </svg>
    
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30px" height="30px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50" xml:space="preserve">
        <path fill="#4C98F7" d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z" transform="rotate(275.098 25 25)">
            <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="0.6s" repeatCount="indefinite"></animateTransform>
        </path>
    </svg>
    
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30px" height="30px" viewBox="0 0 50 50" style="enable-background:new 0 0 50 50" xml:space="preserve">
        <path fill="#4C98F7" d="M43.935,25.145c0-10.318-8.364-18.683-18.683-18.683c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615c8.072,0,14.615,6.543,14.615,14.615H43.935z" transform="rotate(275.098 25 25)">
            <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="0.6s" repeatCount="indefinite"></animateTransform>
        </path>
    </svg>
    
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="30px" height="30px" viewBox="0 0 24 24" style="enable-background:new 0 0 50 50" xml:space="preserve">
       <rect x="0" y="0" width="4" height="7" fill="#4C98F7" transform="scale(1 1.94336)">
           <animateTransform attributeType="xml" attributeName="transform" type="scale" values="1,1; 1,3; 1,1" begin="0s" dur="0.6s" repeatCount="indefinite"></animateTransform>       
       </rect>
       <rect x="10" y="0" width="4" height="7" fill="#4C98F7" transform="scale(1 2.72331)">
           <animateTransform attributeType="xml" attributeName="transform" type="scale" values="1,1; 1,3; 1,1" begin="0.2s" dur="0.6s" repeatCount="indefinite"></animateTransform>       
       </rect>
       <rect x="20" y="0" width="4" height="7" fill="#4C98F7" transform="scale(1 1.38997)">
           <animateTransform attributeType="xml" attributeName="transform" type="scale" values="1,1; 1,3; 1,1" begin="0.4s" dur="0.6s" repeatCount="indefinite"></animateTransform>       
       </rect>
    </svg>
    
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24px" height="30px" viewBox="0 0 24 30" style="enable-background:new 0 0 50 50" xml:space="preserve">
        <rect x="0" y="0" width="4" height="10" fill="#4C98F7" transform="translate(0 9.4336)">
            <animateTransform attributeType="xml" attributeName="transform" type="translate" values="0 0; 0 20; 0 0" begin="0" dur="0.6s" repeatCount="indefinite"></animateTransform>
        </rect>
        <rect x="10" y="0" width="4" height="10" fill="#4C98F7" transform="translate(0 17.2331)">
            <animateTransform attributeType="xml" attributeName="transform" type="translate" values="0 0; 0 20; 0 0" begin="0.2s" dur="0.6s" repeatCount="indefinite"></animateTransform>
        </rect>
        <rect x="20" y="0" width="4" height="10" fill="#4C98F7" transform="translate(0 3.89973)">
            <animateTransform attributeType="xml" attributeName="transform" type="translate" values="0 0; 0 20; 0 0" begin="0.4s" dur="0.6s" repeatCount="indefinite"></animateTransform>
        </rect>
    </svg>
    
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="24px" height="30px" viewBox="0 0 24 30" style="enable-background:new 0 0 50 50" xml:space="preserve">
        <rect x="0" y="9.22656" width="4" height="12.5469" fill="#4C98F7">
            <animate attributeName="height" attributeType="XML" values="5;21;5" begin="0s" dur="0.6s" repeatCount="indefinite"></animate>
            <animate attributeName="y" attributeType="XML" values="13; 5; 13" begin="0s" dur="0.6s" repeatCount="indefinite"></animate>
        </rect>
        <rect x="10" y="5.22656" width="4" height="20.5469" fill="#4C98F7">
            <animate attributeName="height" attributeType="XML" values="5;21;5" begin="0.15s" dur="0.6s" repeatCount="indefinite"></animate>
            <animate attributeName="y" attributeType="XML" values="13; 5; 13" begin="0.15s" dur="0.6s" repeatCount="indefinite"></animate>
        </rect>
        <rect x="20" y="8.77344" width="4" height="13.4531" fill="#4C98F7">
            <animate attributeName="height" attributeType="XML" values="5;21;5" begin="0.3s" dur="0.6s" repeatCount="indefinite"></animate>
            <animate attributeName="y" attributeType="XML" values="13; 5; 13" begin="0.3s" dur="0.6s" repeatCount="indefinite"></animate>
        </rect>
    </svg>
    

    每日一题

    https://github.com/WindrunnerMax/EveryDay
    

    参考

    https://zhuanlan.zhihu.com/p/74440436
    https://blog.csdn.net/wo_shi_ma_nong/article/details/88833828
    https://github.com/ElemeFE/element/tree/dev/packages/loading/src
    
  • 相关阅读:
    poj 3411 Paid Roads
    uva 111 A History Grading
    hdu 4248 A Famous Stone Collector
    阶乘模版
    uva Coin Change
    POJ图论分类
    求 组合数 dp
    判断点是否在三角形中(三角形的有向积计算)
    扩展欧几里德
    UVA 116 Unidirectional TSP (白书dp)
  • 原文地址:https://www.cnblogs.com/WindrunnerMax/p/14207602.html
Copyright © 2011-2022 走看看