前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现加载提示组件

实现加载提示组件

作者头像
WindrunnerMax
发布2020-12-31 11:06:02
6420
发布2020-12-31 11:06:02
举报
文章被收录于专栏:Czy‘s BlogCzy‘s Blog

实现加载提示组件

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

实例

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <title>loading</title>
    <style type="text/css">
        #__loading__{ /* 设置遮罩层 */
            position: fixed;
            width: 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 */
            width: 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提示动画。

代码语言:javascript
复制
<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>

每日一题

代码语言:javascript
复制
https://github.com/WindrunnerMax/EveryDay

参考

代码语言:javascript
复制
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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-12-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现加载提示组件
    • 实例
      • 每日一题
        • 参考
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档