UNPKG

ng-cw-v12

Version:

Angular UI Component Library

138 lines 17.8 kB
import { Directive, Input, Output, EventEmitter } from '@angular/core'; import * as i0 from "@angular/core"; export class PulsatingDirective { constructor(el, renderer) { this.el = el; this.renderer = renderer; /** 动画时长,单位ms */ this.ncDuration = 1500; /** 默认浅蓝色光晕 */ this.ncColor = '#0096ff'; /** 最大光晕宽度 */ this.ncSize = '8px'; /** 停止动画时间,ms,0表示不停止 */ this.ncStopTime = 0; /** 是否启用脉冲动画 */ this._enbaled = true; /** 双向绑定输出事件 */ this.ncEnabledChange = new EventEmitter(); this.shouldStop = false; this.isInitialized = false; // 为每个实例生成唯一的动画名称 this.animationName = `ncPulse_${Math.random().toString(36).substring(2, 11)}`; } set ncEnabled(val) { this._enbaled = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncEnabled() { return this._enbaled; } ngOnInit() { this.createPulsatingContainer(); this.isInitialized = true; if (this.ncEnabled) { this.startAnimation(); } } ngOnChanges(changes) { if (this.isInitialized && changes['ncEnabled']) { if (this.ncEnabled) { this.startAnimation(); } else { this.stopAnimation(); } } } ngOnDestroy() { if (this.stopTimer) { clearTimeout(this.stopTimer); } } createPulsatingContainer() { this.pulsatingContainer = this.renderer.createElement('div'); this.renderer.addClass(this.pulsatingContainer, 'nc-pulsating-container'); // 设置基础样式 this.renderer.setStyle(this.pulsatingContainer, 'position', 'absolute'); this.renderer.setStyle(this.pulsatingContainer, 'inset', '0'); this.renderer.setStyle(this.pulsatingContainer, 'borderRadius', 'inherit'); this.renderer.setStyle(this.pulsatingContainer, 'pointerEvents', 'none'); this.renderer.setStyle(this.pulsatingContainer, 'zIndex', '0'); const elementPosition = getComputedStyle(this.el.nativeElement).position; if (!elementPosition || elementPosition === 'static') { this.renderer.setStyle(this.el.nativeElement, 'position', 'relative'); } // 添加关键帧动画样式 this.styleElement = this.renderer.createElement('style'); const keyframes = ` @keyframes ${this.animationName} { 0% { box-shadow: 0 0 0 0 ${this.ncColor}; } 50% { box-shadow: 0 0 0 ${this.ncSize} ${this.ncColor}; opacity: 0.5; } 100% { box-shadow: 0 0 0 0 ${this.ncColor}; } } `; this.renderer.appendChild(this.styleElement, this.renderer.createText(keyframes)); this.renderer.appendChild(this.el.nativeElement, this.styleElement); // 将容器添加到宿主元素中 this.renderer.appendChild(this.el.nativeElement, this.pulsatingContainer); // 监听动画迭代事件,用于平滑停止 this.renderer.listen(this.pulsatingContainer, 'animationiteration', () => { if (this.shouldStop) { this.renderer.setStyle(this.pulsatingContainer, 'animation', 'none'); this.shouldStop = false; } }); } startAnimation() { if (!this.pulsatingContainer) return; this.shouldStop = false; this.renderer.setStyle(this.pulsatingContainer, 'animation', `${this.animationName} ${this.ncDuration}ms ease-in-out infinite`); // 如果设置了停止时间,则在指定时间后标记需要停止 if (this.ncStopTime > 0) { this.stopTimer = setTimeout(() => { this.stopAnimation(); // 当因为 ncStopTime 停止动画时,更新 ncEnabled 值并发出事件 this.ncEnabled = false; this.ncEnabledChange.emit(false); }, this.ncStopTime); } } stopAnimation() { if (!this.pulsatingContainer) return; if (this.stopTimer) { clearTimeout(this.stopTimer); this.stopTimer = null; } this.shouldStop = true; } } PulsatingDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PulsatingDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); PulsatingDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.1.5", type: PulsatingDirective, selector: "[ncPulsating]", inputs: { ncDuration: "ncDuration", ncColor: "ncColor", ncSize: "ncSize", ncStopTime: "ncStopTime", ncEnabled: "ncEnabled" }, outputs: { ncEnabledChange: "ncEnabledChange" }, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PulsatingDirective, decorators: [{ type: Directive, args: [{ selector: '[ncPulsating]' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { ncDuration: [{ type: Input }], ncColor: [{ type: Input }], ncSize: [{ type: Input }], ncStopTime: [{ type: Input }], ncEnabled: [{ type: Input }], ncEnabledChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsc2F0aW5nLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvcHVsc2F0aW5nL3B1bHNhdGluZy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBeUIsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDOztBQUszSSxNQUFNLE9BQU8sa0JBQWtCO0lBNkI3QixZQUFvQixFQUFjLEVBQVUsUUFBbUI7UUFBM0MsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUE1Qi9ELGdCQUFnQjtRQUNQLGVBQVUsR0FBVyxJQUFJLENBQUM7UUFDbkMsY0FBYztRQUNMLFlBQU8sR0FBVyxTQUFTLENBQUM7UUFDckMsYUFBYTtRQUNKLFdBQU0sR0FBVyxLQUFLLENBQUM7UUFDaEMsdUJBQXVCO1FBQ2QsZUFBVSxHQUFXLENBQUMsQ0FBQztRQUNoQyxlQUFlO1FBQ1AsYUFBUSxHQUFZLElBQUksQ0FBQztRQVNqQyxlQUFlO1FBQ0wsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBSWhELGVBQVUsR0FBRyxLQUFLLENBQUM7UUFHbkIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHNUIsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNoRixDQUFDO0lBckJELElBQ0ksU0FBUyxDQUFDLEdBQXFCO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxLQUFLLElBQUksR0FBRyxLQUFLLE9BQU8sQ0FB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RXJDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQzs7K0dBbklVLGtCQUFrQjttR0FBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBSDlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7aUJBQzFCO3lIQUdVLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlGLFNBQVM7c0JBRFosS0FBSztnQkFTSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbbmNQdWxzYXRpbmddJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUHVsc2F0aW5nRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgLyoqIOWKqOeUu+aXtumVv++8jOWNleS9jW1zICovXHJcbiAgQElucHV0KCkgbmNEdXJhdGlvbjogbnVtYmVyID0gMTUwMDtcclxuICAvKiog6buY6K6k5rWF6JOd6Imy5YWJ5pmVICovXHJcbiAgQElucHV0KCkgbmNDb2xvcjogc3RyaW5nID0gJyMwMDk2ZmYnO1xyXG4gIC8qKiDmnIDlpKflhYnmmZXlrr3luqYgKi9cclxuICBASW5wdXQoKSBuY1NpemU6IHN0cmluZyA9ICc4cHgnO1xyXG4gIC8qKiDlgZzmraLliqjnlLvml7bpl7TvvIxtc++8jDDooajnpLrkuI3lgZzmraIgKi9cclxuICBASW5wdXQoKSBuY1N0b3BUaW1lOiBudW1iZXIgPSAwO1xyXG4gIC8qKiDmmK/lkKblkK/nlKjohInlhrLliqjnlLsgKi9cclxuICBwcml2YXRlIF9lbmJhbGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBuY0VuYWJsZWQodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9lbmJhbGVkID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBnZXQgbmNFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYmFsZWQ7XHJcbiAgfVxyXG5cclxuICAvKiog5Y+M5ZCR57uR5a6a6L6T5Ye65LqL5Lu2ICovXHJcbiAgQE91dHB1dCgpIG5jRW5hYmxlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBwdWxzYXRpbmdDb250YWluZXIhOiBIVE1MRWxlbWVudDtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFuaW1hdGlvbk5hbWU6IHN0cmluZztcclxuICBwcml2YXRlIHNob3VsZFN0b3AgPSBmYWxzZTtcclxuICBwcml2YXRlIHN0b3BUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgc3R5bGVFbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xyXG4gICAgLy8g5Li65q+P5Liq5a6e5L6L55Sf5oiQ5ZSv5LiA55qE5Yqo55S75ZCN56ewXHJcbiAgICB0aGlzLmFuaW1hdGlvbk5hbWUgPSBgbmNQdWxzZV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jcmVhdGVQdWxzYXRpbmdDb250YWluZXIoKTtcclxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5uY0VuYWJsZWQpIHtcclxuICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCAmJiBjaGFuZ2VzWyduY0VuYWJsZWQnXSkge1xyXG4gICAgICBpZiAodGhpcy5uY0VuYWJsZWQpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuc3RvcFRpbWVyKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnN0b3BUaW1lcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVB1bHNhdGluZ0NvbnRhaW5lcigpIHtcclxuICAgIHRoaXMucHVsc2F0aW5nQ29udGFpbmVyID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5wdWxzYXRpbmdDb250YWluZXIsICduYy1wdWxzYXRpbmctY29udGFpbmVyJyk7XHJcbiAgICAvLyDorr7nva7ln7rnoYDmoLflvI9cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wdWxzYXRpbmdDb250YWluZXIsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnB1bHNhdGluZ0NvbnRhaW5lciwgJ2luc2V0JywgJzAnKTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wdWxzYXRpbmdDb250YWluZXIsICdib3JkZXJSYWRpdXMnLCAnaW5oZXJpdCcpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnB1bHNhdGluZ0NvbnRhaW5lciwgJ3BvaW50ZXJFdmVudHMnLCAnbm9uZScpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnB1bHNhdGluZ0NvbnRhaW5lciwgJ3pJbmRleCcsICcwJyk7XHJcblxyXG4gICAgY29uc3QgZWxlbWVudFBvc2l0aW9uID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpLnBvc2l0aW9uO1xyXG4gICAgaWYgKCFlbGVtZW50UG9zaXRpb24gfHwgZWxlbWVudFBvc2l0aW9uID09PSAnc3RhdGljJykge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5re75Yqg5YWz6ZSu5bin5Yqo55S75qC35byPXHJcbiAgICB0aGlzLnN0eWxlRWxlbWVudCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcclxuICAgIGNvbnN0IGtleWZyYW1lcyA9IGBcclxuICAgICAgQGtleWZyYW1lcyAke3RoaXMuYW5pbWF0aW9uTmFtZX0ge1xyXG4gICAgICAgIDAlIHtcclxuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDAgJHt0aGlzLm5jQ29sb3J9O1xyXG4gICAgICAgIH1cclxuICAgICAgICA1MCUge1xyXG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgJHt0aGlzLm5jU2l6ZX0gJHt0aGlzLm5jQ29sb3J9O1xyXG4gICAgICAgICAgb3BhY2l0eTogMC41O1xyXG4gICAgICAgIH1cclxuICAgICAgICAxMDAlIHtcclxuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDAgJHt0aGlzLm5jQ29sb3J9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgYDtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5zdHlsZUVsZW1lbnQsIHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChrZXlmcmFtZXMpKTtcclxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy5lbC5uYXRpdmVFbGVtZW50LCB0aGlzLnN0eWxlRWxlbWVudCk7XHJcblxyXG4gICAgLy8g5bCG5a655Zmo5re75Yqg5Yiw5a6/5Li75YWD57Sg5LitXHJcbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5wdWxzYXRpbmdDb250YWluZXIpO1xyXG5cclxuICAgIC8vIOebkeWQrOWKqOeUu+i/reS7o+S6i+S7tu+8jOeUqOS6juW5s+a7keWBnOatolxyXG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5wdWxzYXRpbmdDb250YWluZXIsICdhbmltYXRpb25pdGVyYXRpb24nLCAoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNob3VsZFN0b3ApIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucHVsc2F0aW5nQ29udGFpbmVyLCAnYW5pbWF0aW9uJywgJ25vbmUnKTtcclxuICAgICAgICB0aGlzLnNob3VsZFN0b3AgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QW5pbWF0aW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLnB1bHNhdGluZ0NvbnRhaW5lcikgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2hvdWxkU3RvcCA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnB1bHNhdGluZ0NvbnRhaW5lciwgJ2FuaW1hdGlvbicsXHJcbiAgICAgIGAke3RoaXMuYW5pbWF0aW9uTmFtZX0gJHt0aGlzLm5jRHVyYXRpb259bXMgZWFzZS1pbi1vdXQgaW5maW5pdGVgKTtcclxuXHJcbiAgICAvLyDlpoLmnpzorr7nva7kuoblgZzmraLml7bpl7TvvIzliJnlnKjmjIflrprml7bpl7TlkI7moIforrDpnIDopoHlgZzmraJcclxuICAgIGlmICh0aGlzLm5jU3RvcFRpbWUgPiAwKSB7XHJcbiAgICAgIHRoaXMuc3RvcFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XHJcbiAgICAgICAgLy8g5b2T5Zug5Li6IG5jU3RvcFRpbWUg5YGc5q2i5Yqo55S75pe277yM5pu05pawIG5jRW5hYmxlZCDlgLzlubblj5Hlh7rkuovku7ZcclxuICAgICAgICB0aGlzLm5jRW5hYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubmNFbmFibGVkQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgICB9LCB0aGlzLm5jU3RvcFRpbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdG9wQW5pbWF0aW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLnB1bHNhdGluZ0NvbnRhaW5lcikgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLnN0b3BUaW1lcikge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zdG9wVGltZXIpO1xyXG4gICAgICB0aGlzLnN0b3BUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zaG91bGRTdG9wID0gdHJ1ZTtcclxuICB9XHJcbn0iXX0=