ng-cw-v12
Version:
Angular UI component library
154 lines • 17.1 kB
JavaScript
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