清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
<!-- 定义组件 --> <template> <!-- 组件模板 --> <style> :host { display: block; width: 120px; height: 120px; font: 24px monospace; } .circle-sector { width: 100%; height: 100%; box-sizing: border-box; border-radius: 50%; background-color: #39B4CC; padding: 10px; will-change: background-image; } :host(.big) .circle-sector { padding: 15px; } .circle-sector .inner { background: #E6F4F7; width: 100%; height: 100%; box-sizing: border-box; border-radius: 50%; text-align: center; } .circle-sector .inner::before { content: ""; height: 100%; visibility: hidden; display: inline-block; vertical-align: middle; } </style> <div class="circle-sector"> <div class="inner"></div> </div> </template> <script> // 在本文件被导入后自动执行 (function(thisDoc) { "use strict"; // 启用严格模式 // 所有实例元素对象的公共prototype var XProgress = Object.create(HTMLElement.prototype, { value: {// 公有属性 get: function() { return this._value; }, set: function(process) { this._value = process; if (!this._circleSector || !this._innerText) return; if (process < .5) { this._circleSector.style.backgroundImage = "linear-gradient(" + (90 + 360 * process) + "deg, transparent 50%, #A2ECFB 50%)," + "linear-gradient(90deg, #A2ECFB 50%, transparent 50%)" } else { this._circleSector.style.backgroundImage = "linear-gradient(" + (90 + 360 * (process - .5)) + "deg, transparent 50%, #39B4CC 50%)," + "linear-gradient(90deg, #A2ECFB 50%, transparent 50%)" } this._innerText.textContent = (process * 100).toFixed(1) + "%"; this.setAttribute("value", process); this.dispatchEvent(new CustomEvent("changed", { detail: { value: process } })); } } }); // 公有方法 XProgress.animate = function(process, forTime) { var startTime, startProcess = this.value; var _this = this; this.cancelAnimate(); var fn = function (time) { startTime = startTime || time; var p = (time - startTime) / forTime * (process - startProcess) + startProcess; if ((process > startProcess && p >= process) || (process < startProcess && p <= process)) { p = process; _this._animateHandle = undefined; } else { _this._animateHandle = requestAnimationFrame(fn); } _this.value = p; _this.dispatchEvent(new CustomEvent(_this._animateHandle ? "animating" : "animated", { detail: { value: process } })); }; this._animateHandle = requestAnimationFrame(fn); }; XProgress.cancelAnimate = function() { if (this._animateHandle !== undefined) { cancelAnimationFrame(this._animateHandle); this._animateHandle = undefined; } }; // 组件被创建时执行,相当于构造函数 XProgress.createdCallback = function() { // 创建Shadow root,自定义模板放入其中 var sr = this.createShadowRoot(); var template = thisDoc.querySelector("template"); var node = document.importNode(template.content, true); this._circleSector = node.querySelector(".circle-sector"); this._innerText = this._circleSector.querySelector(".inner"); var initValue = this._value || Number(this.getAttribute("value")); if (!isNaN(initValue)) { this.value = initValue; } sr.appendChild(node); }; // 注册组件 document.registerElement("x-progress", { prototype: XProgress }); })(document.currentScript.ownerDocument); // ownerDocument指向被导入的文档对象(本文件) </script>