diff --git a/spine-ts/spine-webcomponents/src/SpineWebComponentOverlay.ts b/spine-ts/spine-webcomponents/src/SpineWebComponentOverlay.ts index 9847bd83c..07ca453ed 100644 --- a/spine-ts/spine-webcomponents/src/SpineWebComponentOverlay.ts +++ b/spine-ts/spine-webcomponents/src/SpineWebComponentOverlay.ts @@ -153,6 +153,8 @@ export class SpineWebComponentOverlay extends HTMLElement implements OverlayAttr private disposed = false; private loaded = false; + private running = false; + private visible = true; /** * appendedToBody is assegned in the connectedCallback. @@ -284,27 +286,24 @@ export class SpineWebComponentOverlay extends HTMLElement implements OverlayAttr } this.input = this.setupDragUtility(); + document.addEventListener('visibilitychange', this.visibilityChangeCallback); + this.startRenderingLoop(); } - private hasCssTweakOff () { - return this.noAutoParentTransform && getComputedStyle(this.parentElement!).transform === "none"; - } - - private running = false; disconnectedCallback (): void { const id = this.getAttribute('overlay-id'); if (id) SpineWebComponentOverlay.OVERLAY_LIST.delete(id); // window.removeEventListener("scroll", this.scrolledCallback); window.removeEventListener("load", this.loadedCallback); window.removeEventListener("resize", this.windowResizeCallback); + document.removeEventListener('visibilitychange', this.visibilityChangeCallback); window.screen.orientation.removeEventListener('change', this.orientationChangedCallback); this.intersectionObserver?.disconnect(); this.resizeObserver?.disconnect(); this.input?.dispose(); } - static attributesDescription: Record = { "overlay-id": { propertyName: "overlayId", type: "string" }, "no-auto-parent-transform": { propertyName: "noAutoParentTransform", type: "boolean" }, @@ -325,6 +324,15 @@ export class SpineWebComponentOverlay extends HTMLElement implements OverlayAttr return; } + private visibilityChangeCallback = () => { + if (document.hidden) { + this.visible = false; + } else { + this.visible = true; + this.startRenderingLoop(); + } + } + private windowResizeCallback = () => this.resizedCallback(true); private resizedCallback = (onlyDiv = false) => { @@ -352,6 +360,10 @@ export class SpineWebComponentOverlay extends HTMLElement implements OverlayAttr } } + private hasCssTweakOff () { + return this.noAutoParentTransform && getComputedStyle(this.parentElement!).transform === "none"; + } + /** * Remove the overlay from the DOM, dispose all the contained widgets, and dispose the renderer. */ @@ -683,7 +695,7 @@ export class SpineWebComponentOverlay extends HTMLElement implements OverlayAttr } const loop = () => { - if (this.disposed || !this.isConnected) { + if (this.disposed || !this.isConnected || !this.visible) { this.running = false; return; };