Saltar al contenido principal




La carga diferida nativa a nivel del navegador para iframes está aquí

La carga diferida nativa para imágenes aterrizadas en Chrome 76 a través de loading atributo y luego llegó a Firefox. Estamos felices de compartir eso
carga diferida nativa para iframes es ahora
estandarizado 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 nativa 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 manifestación de <iframe loading=lazy>
muestra incrustaciones de video de carga diferida:


¿Por qué deberíamos cargar iframes de forma diferida?

Las incrustaciones de terceros cubren una amplia gama de casos de uso, desde reproductores de video hasta publicaciones en redes sociales y anuncios. A menudo, este contenido no es inmediatamente visible en la ventana gráfica del usuario. Más bien, 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 costoso por cada marco, incluso si no se desplazan hasta él.

iframe-lazyloading-6365905

Basado en la investigación de Chrome sobre iframes fuera de pantalla de carga diferida automáticamente para usuarios de Data Saver, los iframes de carga diferida podrían generar un ahorro medio de datos del 2-3%, reducciones de la primera pintura con contenido del 1-2% en la mediana y mejoras del 2% en el retardo de la primera entrada (FID) en el percentil 95.

¿Cómo funciona la carga diferida nativa para iframes?

los loading El atributo 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 tres valores:

  • lazy: es un buen candidato para la carga diferida.
  • eager: no es un buen candidato para la carga diferida. Cargue de inmediato.
  • auto: el navegador determinará si se carga de forma diferida.

auto es actualmente un valor no estándar, pero es el predeterminado en Chrome en la actualidad. Chrome tiene la intención de llevar una propuesta de este valor a la mesa de estándares.

Utilizando la loading atributo en iframes funciona de la siguiente manera:


<iframe src="https://example.com"
loading="lazy"
width="600"
height="400">
</iframe>


<iframe src="https://example.com"
width="600"
height="400">
</iframe>


<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 por El modo ligero
usuarios, donde Chrome utilizará el auto value para decidir si debe cargarse de forma diferida.

Si lo necesitas dinamicamente crear iframes a través de JavaScript, configurando
iframe.loading = 'lazy' en el elemento también es
soportado:

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 la altura del iframe son 4px o menor.
  • display: none o visibility: hidden Está aplicado.
  • El iframe se coloca fuera de la pantalla mediante un posicionamiento X o Y negativo.
  • Este criterio se aplica tanto a loading=lazy y loading=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é 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 videos 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 que nuestras páginas podrían ser interactivas en dispositivos móviles. Abrí un error interno con YouTube para discutir cómo agregar
loading=lazy a su código de inserción.

iframe-chromecom-3805627

Si está buscando formas más eficientes de cargar incrustaciones de YouTube, es posible que le interese la Componente de YouTube lite.

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 nativa 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 estos beneficios también en los anuncios.

Estudio de caso: carga diferida nativa de los complementos sociales de Facebook

De Facebook complementos sociales Permitir 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 Como complemento – 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 el FB JSSDK) extrae ~ 215 KB de recursos, 197 KB de los cuales 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 no ser óptimo.

fblike-3107047

Gracias al ingeniero Stoyan Stefanov, todos los complementos sociales de Facebook ahora admiten la carga diferida de iframe nativa. Desarrolladores que optan por la carga diferida a través de los complementos data-lazy
La configuración ahora podrá 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 nativa en producción.

Espera, ¿no pueden los navegadores simplemente cargar automáticamente iframes fuera de la pantalla de forma diferida?

Ciertamente pueden. En Chrome 77, Chrome agregó soporte para imágenes fuera de pantalla e iframes de carga diferida de forma nativa cuando un usuario ha optado por
El modo ligero
(Modo de ahorro de datos) en Chrome para Android.

El modo básico se usa comúnmente en regiones del mundo donde la calidad de la conexión de red y los planes de datos no son los mejores. Cada byte es importante y, por lo tanto, los iframes de carga diferida tienen el potencial de marcar una diferencia significativa para estos usuarios.

Origins puede detectar qué porcentaje de su tráfico proviene de los usuarios del modo básico marcando el navigator.connection.saveData propiedad, que es parte de la NetworkInformation API.

¿Puedo cargar iframes de forma diferida en varios navegadores? si

La carga diferida de iframe nativa se puede aplicar como una mejora progresiva. Navegadores que admiten loading=lazy en iframes cargará de forma diferida el iframe, mientras que el loading El atributo se ignorará con seguridad en los navegadores que aún no lo admitan.

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 nativa
  • Deseamos 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>

Use 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 {

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 dispersos a lo largo de años de contenido de publicación en un sitio de WordPress. Opcionalmente, puede agregar el siguiente código a su tema de WordPress functions.php archivo para insertar automáticamente loading="lazy" a sus iframes existentes sin tener que actualizarlos manualmente de forma individual.

Tenga en cuenta que También se está trabajando en el soporte nativo para iframes de carga diferida en el núcleo de WordPress. El siguiente fragmento buscará las banderas relevantes para que, una vez que WordPress tenga la funcionalidad incorporada, ya no agregará manualmente la loading="lazy" atributo, asegurándose de que sea interoperable con esos cambios y no dará como resultado un atributo duplicado.


function wp_lazy_load_iframes_polyfill( $content ) {
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 nativo 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 sobre la carga diferida de iframe nativo, no dude en enviar un problema al Rastreador de errores de cromo.

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.

Nuestro agradecimiento a Dom Farolino, Scott Little, Houssein Djirdeh, Simon Pieters, Kayce Basques, Joe Medley y Stoyan Stefanov por sus reseñas.