During development, it is often necessary to use a loading indicator to provide interactive feedback to the user, such as when making an XHR request. Implement a loading indicator component, and important parts have been annotated.
<!DOCTYPE html>
<html>
<head>
<title>loading</title>
<style type="text/css">
#__loading__{ /* Set up the overlay */
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__{ /* Inner container to center the SVG */
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.__show__{ /* Show */
opacity: 1 !important;
z-index: 10000 !important;
visibility: visible !important;
transition: all .5s !important;
}
<!DOCTYPE html>
<html>
<head>
<style>
button{
cursor: pointer;
}
</style>
</head>
<body>
<button onclick="show()">Loading</button>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
<div>Text is only used for testing the mask effect</div>
</body>
<script>
class Loading{
constructor(){
let uniqueID = "__loading__"; // Start with __ to prevent ID conflicts
const exist = document.querySelector("#" + this.uniqueID); // Check if the DOM structure has already been initialized
if(exist){
this.instance = exist; // If it exists, assign the instance directly
}else{
let instance = document.createElement("div"); // Create an instance
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; // Assign the instance to the object
document.body.appendChild(this.instance); // Add the instance to the body
}
}
start(){
this.instance.classList.add("__show__"); // Show
}
stop(){
this.instance.classList.remove("__show__"); // Hide
}
}
</script>
</html>
// As a module, export the instance directly
// export default new Loading();
const loading = new Loading();
function show() {
loading.start();
setTimeout(() => loading.stop(), 1000);
}
</script>
</html>
With 6 types of LOADING animation implemented in SVG.
<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="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="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