Keeping iframes Running When Hidden: A Journey Through Browser Optimizations

The Challenge
Have you ever needed to keep an iframe running even when it's "hidden" from view? This seemingly simple requirement can become surprisingly complex due to browser optimizations. In our case, we needed to maintain active game states in minimized game widgets without affecting performance or user experience.
Failed Approaches
1. CSS Visibility and Display Properties
Our first attempt used basic CSS properties to hide the iframes:
.minimized-iframe {
visibility: hidden;
display: none;
}
This immediately failed as browsers aggressively optimize hidden content, often suspending JavaScript execution and resource loading in hidden iframes.
2. Opacity and Pointer Events
Next, we tried making the iframe invisible while keeping it in the DOM:
.minimized-iframe {
opacity: 0;
pointer-events: none;
}
While this seemed promising, browsers still optimized away the "invisible" content, causing our iframe content to freeze.
3. CSS Clip and Transform
We then attempted to keep a tiny portion visible using clipping and scaling:
.minimized-iframe {
clip-path: polygon(0 0, 1px 0, 1px 1px, 0 1px);
transform: scale(0.01);
position: fixed;
top: 0;
left: 0;
}
This worked inconsistently across browsers, and the transform sometimes triggered the same optimization behaviors we were trying to avoid.
The Working Solution: Layer Management
The solution that finally worked was counterintuitive: instead of trying to hide the iframe, we kept it fully rendered but visually concealed behind a background-matching overlay.
Here's a simplified example:
<div class="background-overlay"></div>
<div class="iframe-container minimized">
<iframe src="game.html"></iframe>
</div>
.iframe-container.minimized {
position: fixed;
z-index: -999; /* Behind overlay, but above page background */
/* Center in viewport */
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.background-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -998; /* Above iframe, below regular content */
background-color: var(--page-background-color);
pointer-events: none;
}
Why This Works
No Browser Optimization Triggers
The iframe remains fully rendered and active
No visibility, opacity, or display properties that might trigger browser optimizations
Transform is only used for positioning, not scaling
Visual Concealment
The overlay matches the page background color
Positioned between the iframe and regular content
Pointer events disabled to prevent interaction
Performance Considerations
Minimal DOM manipulation
No constant state monitoring needed
Hardware acceleration can still be utilized
Key Learnings
Browser optimizations, while generally beneficial, can work against specific use cases
Visual hiding ≠ functional hiding
Sometimes the best solution isn't about hiding content but managing how it's layered
Working with browser behaviors rather than against them leads to more robust solutions
Caveats and Considerations
Ensure your z-index management is consistent across the application
Consider memory usage since content remains fully rendered
Test across different browsers and devices
Consider fallback strategies for older browsers
Conclusion
This solution might seem counterintuitive - after all, we're not really "hiding" the content, just putting it behind something else. However, it proves to be more reliable than fighting browser optimizations. Sometimes, the best solution isn't about using more sophisticated techniques, but rather understanding and working with browser behaviors.
Remember: browsers are optimized for common use cases. When you need to handle edge cases, you might need to think outside the box - or in this case, think in layers rather than visibility states.
This solution was discovered while working on a complex web application that required maintaining active states in minimized iframes. Special thanks to browser optimization algorithms for making this problem interesting enough to write about!
Subscribe to my newsletter
Read articles from Richard Fu directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Richard Fu
Richard Fu
Experienced game and web developer, skilled in cross-platform games, backend, and blockchain tech. Competent in various programming skills: Programming Languages: TypeScript, Svelte, C#, PHP, HTML5, CSS, MySQL, Solidity Web Frameworks: Pixi.js, Storybook, JQuery, Laravel, Bootstrap, Web3.js Softwares/IDEs: Unity, VS Code, Spine, WebStorm Services: Git, AWS EC2/S3, Gamespark, Playfab, iOS Game Center, Google Play Games Ability to create a game/app from scratch with full implementation from frontend UI to server backend. Ability to optimize a game/app on mobile platforms where the hardware resource is limited. Ability to develop and maintain API servers that serve mobile frontend. Leadership skill to manage a small development team on projects with strict deadlines. Training junior developers to pursue the good practice of coding.