UNPKG

ng-cw-v12

Version:

Angular UI component library

154 lines 17.5 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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SUFBSSxDQUFDLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7O2tIQWhKVSxxQkFBcUI7c0dBQXJCLHFCQUFxQiwwUENQbEMsdURBQW1EOzJGRE90QyxxQkFBcUI7a0JBTGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsV0FBVyxFQUFFLGdDQUFnQztvQkFDN0MsU0FBUyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7aUJBQzlDO2lHQUtLLE9BQU87c0JBRFYsS0FBSztnQkFXRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBSUYsYUFBYTtzQkFEaEIsS0FBSztnQkFVRixNQUFNO3NCQURULEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduYy1udW1iZXItdGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbnVtYmVyLXRpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbnVtYmVyLXRpY2tlci5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOdW1iZXJUaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLyoqIOimgeaYvuekuueahOaVsOWtlyAqL1xyXG4gIHByaXZhdGUgX3ZhbHVlOiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jVmFsdWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN0YXJ0KCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZ2V0IG5jVmFsdWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcclxuICB9XHJcbiAgLyoqIOi1t+Wni+aVsOWAvCAqL1xyXG4gIEBJbnB1dCgpIG5jU3RhcnRWYWx1ZTogbnVtYmVyID0gMDtcclxuICAvKiog5byA5aeL5YmN55qE5bu26L+fICovXHJcbiAgQElucHV0KCkgbmNEZWxheTogbnVtYmVyID0gMDtcclxuICAvKiog5bCP5pWw5L2N5pWwICovXHJcbiAgQElucHV0KCkgbmNEZWNpbWFsUGxhY2VzOiBudW1iZXIgPSAwO1xyXG4gIC8qKiDliqjnlLvmjIHnu63ml7bpl7TvvIjmr6vnp5LvvIkgKi9cclxuICBASW5wdXQoKSBuY0R1cmF0aW9uOiBudW1iZXIgPSAzMDAwO1xyXG4gIC8qKiDmmK/lkKblnKjop4blm77lj6/op4Hml7bmiY3lvIDlp4vliqjnlLsgKi9cclxuICBwcml2YXRlIF9zdGFydE9uVmlldzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IG5jU3RhcnRPblZpZXcodmFsOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9zdGFydE9uVmlldyA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jU3RhcnRPblZpZXcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRPblZpZXc7XHJcbiAgfVxyXG4gIC8qKiDmmK/lkKblj6rmiafooYzkuIDmrKHliqjnlLsgKi9cclxuICBwcml2YXRlIF9vbmNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBzZXQgbmNPbmNlKHZhbDogYm9vbGVhbiB8IHN0cmluZykge1xyXG4gICAgdGhpcy5fb25jZSA9IHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IGZhbHNlICYmIHZhbCAhPT0gJ2ZhbHNlJztcclxuICB9XHJcbiAgZ2V0IG5jT25jZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9vbmNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvYnNlcnZlcjogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHRpbWVvdXQ6IGFueSA9IG51bGw7XHJcblxyXG4gIGN1cnJlbnRWYWx1ZTogbnVtYmVyID0gMDtcclxuICBkaXNwbGF5VmFsdWU6IHN0cmluZyA9ICcwJztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7IH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gICAgLy8g5Yid5aeL5YC877ya5peg6K665LuA5LmI5pa55ZCR77yM6YO95LuOc3RhcnRWYWx1ZeW8gOWni1xyXG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLm5jU3RhcnRWYWx1ZTtcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLm5jU3RhcnRPblZpZXcpIHtcclxuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xyXG4gICAgICB9LCB0aGlzLm5jRGVsYXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXR1cEludGVyc2VjdGlvbk9ic2VydmVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZSkge1xyXG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7XHJcbiAgICAgIGlmIChlbnRyaWVzWzBdLmlzSW50ZXJzZWN0aW5nKSB7XHJcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XHJcbiAgICAgICAgfSwgdGhpcy5uY0RlbGF5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubmNPbmNlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5vYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMubmNPbmNlKSB7XHJcbiAgICAgICAgdGhpcy5yZXNldEFuaW1hdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9LCB7IHRocmVzaG9sZDogMC4xIH0pO1xyXG5cclxuICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXJ0QW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hbmltYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0QW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGltZW91dCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFuaW1hdGlvbkZyYW1lKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLm5jU3RhcnRWYWx1ZTtcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFuaW1hdGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcclxuICAgIGNvbnN0IHN0YXJ0VmFsID0gdGhpcy5jdXJyZW50VmFsdWU7XHJcbiAgICAvLyDnm67moIflgLzvvJrml6Dorrrku4DkuYjmlrnlkJHvvIzpg73liqjnlLvliLB2YWx1ZVxyXG4gICAgY29uc3QgdGFyZ2V0VmFsID0gdGhpcy5uY1ZhbHVlO1xyXG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IHRhcmdldFZhbCAtIHN0YXJ0VmFsO1xyXG5cclxuICAgIGNvbnN0IGFuaW1hdGVTdGVwID0gKGN1cnJlbnRUaW1lOiBudW1iZXIpID0+IHtcclxuICAgICAgY29uc3QgZWxhcHNlZCA9IGN1cnJlbnRUaW1lIC0gc3RhcnRUaW1lO1xyXG4gICAgICBjb25zdCBwcm9ncmVzcyA9IE1hdGgubWluKGVsYXBzZWQgLyB0aGlzLm5jRHVyYXRpb24sIDEpO1xyXG5cclxuICAgICAgLy8g5L2/55So57yT5Yqo5Ye95pWw77yIZWFzZS1vdXTvvIlcclxuICAgICAgY29uc3QgZWFzZWRQcm9ncmVzcyA9IDEgLSBNYXRoLnBvdygxIC0gcHJvZ3Jlc3MsIDMpO1xyXG5cclxuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBzdGFydFZhbCArIChkaWZmZXJlbmNlICogZWFzZWRQcm9ncmVzcyk7XHJcbiAgICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XHJcblxyXG4gICAgICBpZiAocHJvZ3Jlc3MgPCAxKSB7XHJcbiAgICAgICAgdGhpcy5hbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlU3RlcCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5hbmltYXRpb25GcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlU3RlcCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZURpc3BsYXlWYWx1ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzcGxheVZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWUudG9GaXhlZCh0aGlzLm5jRGVjaW1hbFBsYWNlcyk7XHJcbiAgfVxyXG59XHJcbiIsIjxzcGFuIGNsYXNzPVwibnVtYmVyLXRpY2tlclwiPnt7ZGlzcGxheVZhbHVlfX08L3NwYW4+Il19