实现加载提示组件

实现加载提示组件

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

实例#

Copy
<!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提示动画。

Copy
<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>

每日一题#

Copy
https://github.com/WindrunnerMax/EveryDay

参考#

Copy
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
posted @   WindRunnerMax  阅读(132)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
CONTENTS