UNPKG

ng-cw-v12

Version:

Angular UI component library

154 lines 17.1 kB
import { Component, Input } from '@angular/core'; import * as i0 from "@angular/core"; export class NumberTickerComponent { constructor(elementRef) { this.elementRef = elementRef; /** 要显示的数字 */ this._value = 0; /** 起始数值 */ this.ncStartValue = 0; /** 开始前的延迟 */ this.ncDelay = 0; /** 小数位数 */ this.ncDecimalPlaces = 0; /** 动画持续时间(毫秒) */ this.ncDuration = 3000; /** 是否在视图可见时才开始动画 */ this._startOnView = false; /** 是否只执行一次动画 */ this._once = false; this.observer = null; this.animationFrame = null; this.timeout = null; this.currentValue = 0; this.displayValue = '0'; } set ncValue(value) { this._value = value; setTimeout(() => { this.start(); }); } get ncValue() { return this._value; } set ncStartOnView(val) { this._startOnView = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncStartOnView() { return this._startOnView; } set ncOnce(val) { this._once = val !== null && val !== undefined && val !== false && val !== 'false'; } get ncOnce() { return this._once; } ngOnInit() { } ngOnDestroy() { this.clear(); } start() { this.clear(); // 初始值:无论什么方向,都从startValue开始 this.currentValue = this.ncStartValue; this.updateDisplayValue(); if (!this.ncStartOnView) { this.timeout = setTimeout(() => { this.startAnimation(); }, this.ncDelay); } else { this.setupIntersectionObserver(); } } clear() { if (this.observer) { this.observer.disconnect(); } if (this.animationFrame) { cancelAnimationFrame(this.animationFrame); } if (this.timeout) { clearTimeout(this.timeout); } } setupIntersectionObserver() { this.observer = new IntersectionObserver((entries) => { if (entries[0].isIntersecting) { this.timeout = setTimeout(() => { this.startAnimation(); }, this.ncDelay); if (this.ncOnce) { if (this.observer) { this.observer.disconnect(); } } } else if (!this.ncOnce) { this.resetAnimation(); } }, { threshold: 0.1 }); this.observer.observe(this.elementRef.nativeElement); } startAnimation() { this.animate(); } resetAnimation() { if (this.timeout) { clearTimeout(this.timeout); } if (this.animationFrame) { cancelAnimationFrame(this.animationFrame); } this.currentValue = this.ncStartValue; this.updateDisplayValue(); } animate() { const startTime = performance.now(); const startVal = this.currentValue; // 目标值:无论什么方向,都动画到value const targetVal = this.ncValue; const difference = targetVal - startVal; const animateStep = (currentTime) => { const elapsed = currentTime - startTime; const progress = Math.min(elapsed / this.ncDuration, 1); // 使用缓动函数(ease-out) const easedProgress = 1 - Math.pow(1 - progress, 3); this.currentValue = startVal + (difference * easedProgress); this.updateDisplayValue(); if (progress < 1) { this.animationFrame = requestAnimationFrame(animateStep); } }; this.animationFrame = requestAnimationFrame(animateStep); } updateDisplayValue() { this.displayValue = this.currentValue.toFixed(this.ncDecimalPlaces); } } NumberTickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NumberTickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); NumberTickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: NumberTickerComponent, selector: "nc-number-ticker", inputs: { ncValue: "ncValue", ncStartValue: "ncStartValue", ncDelay: "ncDelay", ncDecimalPlaces: "ncDecimalPlaces", ncDuration: "ncDuration", ncStartOnView: "ncStartOnView", ncOnce: "ncOnce" }, ngImport: i0, template: "<span class=\"number-ticker\">{{displayValue}}</span>", styles: [":host{display:inline-block}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NumberTickerComponent, decorators: [{ type: Component, args: [{ selector: 'nc-number-ticker', templateUrl: './number-ticker.component.html', styleUrls: ['./number-ticker.component.less'] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { ncValue: [{ type: Input }], ncStartValue: [{ type: Input }], ncDelay: [{ type: Input }], ncDecimalPlaces: [{ type: Input }], ncDuration: [{ type: Input }], ncStartOnView: [{ type: Input }], ncOnce: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLXRpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL251bWJlci10aWNrZXIvbnVtYmVyLXRpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL251bWJlci10aWNrZXIvbnVtYmVyLXRpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQWMsTUFBTSxlQUFlLENBQUM7O0FBT2hGLE1BQU0sT0FBTyxxQkFBcUI7SUErQ2hDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUE5QzFDLGFBQWE7UUFDTCxXQUFNLEdBQVcsQ0FBQyxDQUFDO1FBVzNCLFdBQVc7UUFDRixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUNsQyxhQUFhO1FBQ0osWUFBTyxHQUFXLENBQUMsQ0FBQztRQUM3QixXQUFXO1FBQ0Ysb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDckMsaUJBQWlCO1FBQ1IsZUFBVSxHQUFXLElBQUksQ0FBQztRQUNuQyxvQkFBb0I7UUFDWixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQVF0QyxnQkFBZ0I7UUFDUixVQUFLLEdBQVksS0FBSyxDQUFDO1FBU3ZCLGFBQVEsR0FBZ0MsSUFBSSxDQUFDO1FBQzdDLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUNyQyxZQUFPLEdBQVEsSUFBSSxDQUFDO1FBRTVCLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLGlCQUFZLEdBQVcsR0FBRyxDQUFDO0lBRW1CLENBQUM7SUE1Qy9DLElBQ0ksT0FBTyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztR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SUFBSSxDQUFDLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7O2tIQWhKVSxxQkFBcUI7c0dBQXJCLHFCQUFxQiwwUENQbEMsdURBQW1EOzJGRE90QyxxQkFBcUI7a0JBTGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsV0FBVyxFQUFFLGdDQUFnQztvQkFDN0MsU0FBUyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7aUJBQzlDO2lHQUtLLE9BQU87c0JBRFYsS0FBSztnQkFXRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUYsYUFBYTtzQkFEaEIsS0FBSztnQkFVRixNQUFNO3NCQURULEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduYy1udW1iZXItdGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL251bWJlci10aWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9udW1iZXItdGlja2VyLmNvbXBvbmVudC5sZXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgTnVtYmVyVGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiog6KaB5pi+56S655qE5pWw5a2XICovXG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKVxuICBzZXQgbmNWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3RhcnQoKTtcbiAgICB9KTtcbiAgfVxuICBnZXQgbmNWYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICAvKiog6LW35aeL5pWw5YC8ICovXG4gIEBJbnB1dCgpIG5jU3RhcnRWYWx1ZTogbnVtYmVyID0gMDtcbiAgLyoqIOW8gOWni+WJjeeahOW7tui/nyAqL1xuICBASW5wdXQoKSBuY0RlbGF5OiBudW1iZXIgPSAwO1xuICAvKiog5bCP5pWw5L2N5pWwICovXG4gIEBJbnB1dCgpIG5jRGVjaW1hbFBsYWNlczogbnVtYmVyID0gMDtcbiAgLyoqIOWKqOeUu+aMgee7reaXtumXtO+8iOavq+enku+8iSAqL1xuICBASW5wdXQoKSBuY0R1cmF0aW9uOiBudW1iZXIgPSAzMDAwO1xuICAvKiog5piv5ZCm5Zyo6KeG5Zu+5Y+v6KeB5pe25omN5byA5aeL5Yqo55S7ICovXG4gIHByaXZhdGUgX3N0YXJ0T25WaWV3OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHNldCBuY1N0YXJ0T25WaWV3KHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xuICAgIHRoaXMuX3N0YXJ0T25WaWV3ID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xuICB9XG4gIGdldCBuY1N0YXJ0T25WaWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGFydE9uVmlldztcbiAgfVxuICAvKiog5piv5ZCm5Y+q5omn6KGM5LiA5qyh5Yqo55S7ICovXG4gIHByaXZhdGUgX29uY2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgc2V0IG5jT25jZSh2YWw6IGJvb2xlYW4gfCBzdHJpbmcpIHtcbiAgICB0aGlzLl9vbmNlID0gdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gZmFsc2UgJiYgdmFsICE9PSAnZmFsc2UnO1xuICB9XG4gIGdldCBuY09uY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX29uY2U7XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVyOiBJbnRlcnNlY3Rpb25PYnNlcnZlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0aW1lb3V0OiBhbnkgPSBudWxsO1xuXG4gIGN1cnJlbnRWYWx1ZTogbnVtYmVyID0gMDtcbiAgZGlzcGxheVZhbHVlOiBzdHJpbmcgPSAnMCc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHsgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIC8vIOWIneWni+WAvO+8muaXoOiuuuS7gOS5iOaWueWQke+8jOmDveS7jnN0YXJ0VmFsdWXlvIDlp4tcbiAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRoaXMubmNTdGFydFZhbHVlO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG5cbiAgICBpZiAoIXRoaXMubmNTdGFydE9uVmlldykge1xuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcbiAgICAgIH0sIHRoaXMubmNEZWxheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZSkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25GcmFtZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBJbnRlcnNlY3Rpb25PYnNlcnZlcigpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICBpZiAoZW50cmllc1swXS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XG4gICAgICAgIH0sIHRoaXMubmNEZWxheSk7XG5cbiAgICAgICAgaWYgKHRoaXMubmNPbmNlKSB7XG4gICAgICAgICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5uY09uY2UpIHtcbiAgICAgICAgdGhpcy5yZXNldEFuaW1hdGlvbigpO1xuICAgICAgfVxuICAgIH0sIHsgdGhyZXNob2xkOiAwLjEgfSk7XG5cbiAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFuaW1hdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmFuaW1hdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRBbmltYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLm5jU3RhcnRWYWx1ZTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbmltYXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHN0YXJ0VmFsID0gdGhpcy5jdXJyZW50VmFsdWU7XG4gICAgLy8g55uu5qCH5YC877ya5peg6K665LuA5LmI5pa55ZCR77yM6YO95Yqo55S75YiwdmFsdWVcbiAgICBjb25zdCB0YXJnZXRWYWwgPSB0aGlzLm5jVmFsdWU7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IHRhcmdldFZhbCAtIHN0YXJ0VmFsO1xuXG4gICAgY29uc3QgYW5pbWF0ZVN0ZXAgPSAoY3VycmVudFRpbWU6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgZWxhcHNlZCA9IGN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBNYXRoLm1pbihlbGFwc2VkIC8gdGhpcy5uY0R1cmF0aW9uLCAxKTtcblxuICAgICAgLy8g5L2/55So57yT5Yqo5Ye95pWw77yIZWFzZS1vdXTvvIlcbiAgICAgIGNvbnN0IGVhc2VkUHJvZ3Jlc3MgPSAxIC0gTWF0aC5wb3coMSAtIHByb2dyZXNzLCAzKTtcblxuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBzdGFydFZhbCArIChkaWZmZXJlbmNlICogZWFzZWRQcm9ncmVzcyk7XG4gICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuXG4gICAgICBpZiAocHJvZ3Jlc3MgPCAxKSB7XG4gICAgICAgIHRoaXMuYW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZVN0ZXApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmFuaW1hdGlvbkZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGFuaW1hdGVTdGVwKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheVZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheVZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWUudG9GaXhlZCh0aGlzLm5jRGVjaW1hbFBsYWNlcyk7XG4gIH1cbn1cbiIsIjxzcGFuIGNsYXNzPVwibnVtYmVyLXRpY2tlclwiPnt7ZGlzcGxheVZhbHVlfX08L3NwYW4+Il19