¡Es hora de cargar de forma diferida iframes fuera de la pantalla!
¡Llegó la carga diferida incorporada al navegador para iframes!
La carga diferida estandarizada para imágenes llegó a Chrome 76 a través del atributo loading
y más tarde a Firefox. Nos complace compartir que la carga diferida en el navegador para iframes ahora es estándar y también es compatible con los navegadores Chrome y Chromium.
<iframe src="https://example.com"
loading="lazy"
width="600"
height="400"></iframe>
La carga diferida estandarizada de iframes difiere la carga de iframes fuera de la pantalla hasta que el usuario se desplaza cerca de ellos. Esto ahorra datos, acelera la carga de otras partes de la página y reduce el uso de memoria.
Esta demo de <iframe loading=lazy>
muestra código incrustado de video de carga diferida:
¿Por qué deberíamos cargar iframes de forma diferida? #
El código incrustado de terceros cubre una amplia gama de casos de uso, desde reproductores de video hasta publicaciones en redes sociales y anuncios. A menudo, este contenido no es visible inmediatamente en la ventana gráfica del usuario. Por el contrario, solo se ve una vez que se desplazan hacia abajo en la página. A pesar de esto, los usuarios pagan el costo de descargar datos y JavaScript por cada cuadro, incluso si no se desplazan hasta él.

Según la investigación de Chrome sobre iframes fuera de pantalla de carga diferida automática para usuarios de Data Saver, los iframes de carga diferida podrían generar un ahorro medio de datos del 2-3%, 1-2% de reducción de la primera pintura con contenido en la mediana y mejoras del 2% en el retraso de la primera entrada (FID) en el percentil 95.
¿Cómo funciona la carga diferida incorporada para iframes? #
El atributo loading
permite que un navegador difiera la carga de iframes e imágenes fuera de la pantalla hasta que los usuarios se desplacen cerca de ellos. loading
admite dos valores:
lazy
: es un buen candidato para la carga diferida.eager
: no es un buen candidato para la carga diferida. Cargue de inmediato.
El uso del loading
en iframes funciona de la siguiente manera:
<!-- Lazy-load the iframe -->
<iframe src="https://example.com"
loading="lazy"
width="600"
height="400"></iframe>
<!-- Eagerly load the iframe -->
<iframe src="https://example.com"
width="600"
height="400"></iframe>
<!-- or use loading="eager" to opt out of automatic
lazy-loading in Lite Mode -->
<iframe src="https://example.com"
loading="eager"
width="600"
height="400"></iframe>
No especificar el atributo en absoluto tendrá el mismo impacto que cargar explícitamente el recurso con entusiasmo, excepto para los usuarios del Modo Básico, donde Chrome usará el auto
para decidir si debe cargarse de forma diferida.
Si necesitas crear dinámicamente iframes a través de JavaScript, establecer iframe.loading = 'lazy'
en el elemento también está apoyado :
var iframe = document.createElement('iframe');
iframe.src = 'https://example.com';
iframe.loading = 'lazy';
document.body.appendChild(iframe);
Comportamiento de carga diferida específico de iframe #
El atributo de carga afecta a los iframes de manera diferente a las imágenes, dependiendo de si el iframe está oculto. (Los iframes ocultos se utilizan a menudo con fines analíticos o de comunicación). Chrome utiliza los siguientes criterios para determinar si un iframe está oculto:
- El ancho y el alto del iframe son de
4px
o menos. - Se aplica
display: none
ovisibility: hidden
. - El iframe se coloca fuera de la pantalla mediante un posicionamiento X o Y negativo.
- Este criterio se aplica tanto a
loading=lazy
como aloading=auto
.
Si un iframe cumple alguna de estas condiciones, Chrome lo considera oculto y no lo cargará de forma diferida en la mayoría de los casos. Los iframes que no están ocultos solo se cargarán cuando estén dentro del umbral de distancia de carga. Chrome muestra un marcador de posición para los iframes cargados de forma diferida que aún se están recuperando.
¿Qué impacto podríamos ver en el código de incrustación de iframe populares de carga diferida? #
¿Qué pasaría si pudiéramos cambiar la web en general para que los iframes fuera de pantalla de carga diferida fueran los predeterminados? Se vería un poco así:
Incrustaciones de video de YouTube de carga diferida (ahorra ~ 500 KB en la carga de la página inicial):
<iframe src="https://www.youtube.com/embed/YJGCZCaIZkQ"
loading="lazy"
width="560"
height="315"
frameborder="0"
allow="accelerometer; autoplay;
encrypted-media; gyroscope;
picture-in-picture"
allowfullscreen></iframe>
Anécdota: cuando cambiamos a incrustaciones de YouTube de carga diferida para Chrome.com, ahorramos 10 segundos de la rapidez con la que nuestras páginas podrían ser interactivas en dispositivos móviles. Abrí un error interno con YouTube para discutir la adición de loading=lazy
a su código de inserción.

Inserciones de Instagram de carga diferida (ahorra> 100 KB en gzip en la carga inicial):
Las incrustaciones de Instagram proporcionan un bloque de marcado y un script, que inyecta un iframe en su página. La carga diferida de este iframe evita tener que cargar todo el script necesario para la inserción. Dado que tales incrustaciones a menudo se muestran debajo de la ventana gráfica en la mayoría de los artículos, esto parece un candidato razonable para la carga diferida de su iframe.
Incrustaciones de Spotify de carga diferida (ahorra 514 KB en la carga inicial):
<iframe src="https://open.spotify.com/embed/album/1DFixLWuPkv3KT3TnV35m3"
loading="lazy"
width="300"
height="380"
frameborder="0"
allowtransparency="true"
allow="encrypted-media"></iframe>
Aunque las incrustaciones anteriores ilustran los beneficios potenciales de los iframes de carga diferida para el contenido de medios, existe la posibilidad de ver también estos beneficios en los anuncios.
Estudio de caso: carga diferida de los complementos sociales de Facebook #
Los complementos sociales de Facebook permiten a los desarrolladores incrustar contenido de Facebook en sus páginas web. Se ofrecen varios de estos complementos, como publicaciones incrustadas, fotos, videos, comentarios… El más popular es el complemento Me gusta , un botón que muestra un recuento de a quién le ha "gustado" la página. De forma predeterminada, incrustar el complemento Me gusta en una página web (utilizando FB JSSDK) extrae ~ 215 KB de recursos, de los cuales 197 KB son JavaScript. En muchos casos, el complemento puede aparecer al final de un artículo o cerca del final de una página, por lo que cargarlo con entusiasmo cuando está fuera de la pantalla puede ser subóptimo.

Gracias al ingeniero Stoyan Stefanov, todos los complementos sociales de Facebook ahora admiten la carga diferida de iframe estandarizada . Los desarrolladores que opten por la carga diferida a través de la data-lazy
diferidos de los complementos ahora podrán evitar que se cargue hasta que el usuario se desplace cerca. Esto permite que la inserción siga funcionando completamente para los usuarios que la necesitan, al tiempo que ofrece ahorros de datos para aquellos que no se desplazan hacia abajo en una página. Tenemos la esperanza de que esta sea la primera de muchas incorporaciones para explorar la carga diferida de iframe estandarizada en producción.
¿Puedo cargar iframes de forma diferida en varios navegadores? sí #
La carga diferida de iframe se puede aplicar como una mejora progresiva. Los navegadores que admiten loading=lazy
en iframes cargarán el iframe de forma perezosa, mientras que el loading
se ignorará de forma segura en los navegadores que aún no lo admiten.
También es posible cargar de forma diferida iframes fuera de la pantalla utilizando la biblioteca de JavaScript lazysizes. Esto puede ser deseable si:
- requieren más umbrales de carga diferida personalizados que los que ofrece actualmente la carga diferida estandarizada
- desea ofrecer a los usuarios una experiencia coherente de carga diferida de iframe en todos los navegadores
<script src="lazysizes.min.js" async></script>
<iframe frameborder="0"
class="lazyload"
allowfullscreen=""
width="600"
height="400"
data-src="//www.youtube.com/embed/ZfV-aYdU4uE">
</iframe>
Utilice el siguiente patrón para detectar la función de carga diferida y obtener tamaños diferidos cuando no esté disponible:
<iframe frameborder="0"
class="lazyload"
loading="lazy"
allowfullscreen=""
width="600"
height="400"
data-src="//www.youtube.com/embed/ZfV-aYdU4uE">
</iframe>
<script>
if ('loading' in HTMLIFrameElement.prototype) {
const iframes = document.querySelectorAll('iframe[loading="lazy"]');
iframes.forEach(iframe => {
iframe.src = iframe.dataset.src;
});
} else {
// Dynamically import the LazySizes library
const script = document.createElement('script');
script.src =
'https://cdnjs.cloudflare.com/ajax/libs/lazysizes/5.2.2/lazysizes.min.js';
document.body.appendChild(script);
}
</script>
Una opción para los usuarios de WordPress #
Es posible que tenga muchos iframes distribuidos a lo largo de años de contenido de publicación en un sitio de WordPress. Opcionalmente, puede agregar el siguiente código al functions.php
su tema de WordPress para insertar automáticamente loading="lazy"
en sus iframes existentes sin tener que actualizarlos manualmente de forma individual.
Tenga en cuenta que en el núcleo de WordPress también se está trabajando en la compatibilidad a nivel del navegador para iframes de carga diferida . El siguiente fragmento verificará las banderas relevantes para que, una vez que WordPress tenga la funcionalidad incorporada, ya no agregará manualmente el loading="lazy"
, lo que garantiza que sea interoperable con esos cambios y no resulte en un atributo duplicado. .
// TODO: Remove once https://core.trac.wordpress.org/ticket/50756 lands.
function wp_lazy_load_iframes_polyfill( $content ) {
// If WP core lazy-loads iframes, skip this manual implementation.
if ( function_exists( 'wp_lazy_loading_enabled' ) && wp_lazy_loading_enabled( 'iframe', 'the_content' ) ) {
return $content;
}
return str_replace( '<iframe ', '<iframe loading="lazy" ', $content );
}
add_filter( 'the_content', 'wp_lazy_load_iframes_polyfill' );
Si su sitio de WordPress utiliza almacenamiento en caché (pista: debería), no olvide reconstruir el caché de su sitio después.
Conclusión #
Hornear en soporte estandarizado para iframes de carga diferida hace que sea mucho más fácil para usted mejorar el rendimiento de sus páginas web. Si tiene algún comentario, no dude en enviar un problema a Chromium Bug Tracker .
Y, en caso de que se lo haya perdido, consulte la colección de carga diferida de imágenes y videos de web.dev para obtener más ideas de carga diferida.
Agradecemos a Dom Farolino, Scott Little, Houssein Djirdeh, Simon Pieters, Kayce Basques, Joe Medley y Stoyan Stefanov por sus reseñas.