Incrustar videos de YouTube responsivos

Incrustar videos de YouTube responsivos

Colocar un video de YouTube en nuestro sitio web o landing page es una tarea sencilla al utilizar el código embed que nos brinda la plataforma para insertar estos vídeos en donde nosotros querramos, pero este código trae un ancho y alto definido lo cual muchas veces es un dolor de cabeza al tratar de adaptar estos vídeos a resoluciones mobiles. Pero no te preocupes aquí te enseñamos como Incrustar videos de YouTube responsivos fácil y rápido utilizando JavaScript y un poco de CSS.

Obteniendo el código de incorporación de YouTube

Los pasos para obtener el código de incorporación de YouTube son sencillos:

  1. Ubicamos la pestaña compartir.
Incrustar video de youtube paso 1

2. Seleccionamos la opción incorporar.

Incrustar video de youtube paso 2

3. Copiamos el código que nos muestra del lado derecho.

Incrustar video de youtube paso 3
Incrustar video de youtube paso 3
<iframe width="560" height="315" src="<https://www.youtube.com/embed/6WmbTTeIQNg>" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

Insertando el código copiado en nuestro sitio

Para este ejemplo vamos a crear una pequeña estructura html con algo de estilo para poder insertar nuestro vídeo.

<!doctype html>
<html lang="es">
<head>
	<meta charset="UTF-8">
	<meta name="viewport"
		  content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>Youtube Embed responsive</title>
	<style>
			.container{
			    max-width: 900px;
			    margin: 0 auto;
			    display: flex;
			    background: beige;
			    padding: 1rem;
			    flex-direction: column;
			}
			.youtube-container{
			    width: 100%;
			}
</style>
	</head>
<body>
	<div class="container">
		<div class="title">
			<h1>Youtube video responsive embed</h1>
		</div>
		<div class="text">
			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad adipisci alias beatae consequuntur, ea eos expedita explicabo fuga iure laboriosam laudantium molestiae neque obcaecati perferendis quam qui reiciendis sit unde!</p>
		</div>
		<div class="youtube-container">

<!-- Youtube embed code -->
			<iframe width="560" height="315" src="<https://www.youtube.com/embed/6WmbTTeIQNg>" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
			<!-- ./Youtube embed code -->
		</div>
	</div>
	
</body>
</html>

Hasta aquí no hay nada nuevo, tenemos una página html con un vídeo de YouTube incorporado que se vería de la siguiente manera:

Incrustar videos de YouTube responsivos ejemplo

El problema se presenta cuando intentamos visualizar este vídeo en resoluciones menores de 560px

via GIPHY

Debido a que el código proporcionado por YouTube contiene un ancho y alto definido width="560" height="315" nuestro elemento iframe no es responsivo.

Haciendo nuestro vídeo responsivo

Gracias a la magia de JavaScript podemos convertir nuestros iframes de YouTube en elementos que se adapten al ancho de la pantalla.

Insertamos el siguiente código antes de la etiqueta </body> de nuestra página.

const $GMN_ObjYoutube = {
	iframes : [], //Define un array llamado iframes
	init: () => {
		$GMN_ObjYoutube.frames = $GMN_ObjYoutube.getAllYoutubeIframes(); //Obtenemos los iframes
		$GMN_ObjYoutube.processIframes(); //Procesamos cada uno de los iframes
		window.addEventListener('resize', $GMN_ObjYoutube.processIframes); //Agregamos un listener que se ejecutará cada vez que nuestra pantalla cambie de resolución
	},
	processIframes: () => { //Función que procesa los iframes
		for( let i = 0; i < $GMN_ObjYoutube.frames.length; i++  ) {
			let iframe = $GMN_ObjYoutube.frames[ i ];
			$GMN_ObjYoutube.resizeIframe( iframe );
		}
	},
	getAllYoutubeIframes: () => {
		return document.getElementsByClassName('responsive-youtube');//Obtiene todos los elementos con la clase responsive-youtube
	},
	resizeIframe: ( iframe ) => { //procesamos los iframes y ajustamos a ancho y alto
		let parent = iframe.parentElement; 
		iframe.height = ( iframe.height / iframe.width ) * parent.clientWidth;
		iframe.width = parent.clientWidth;
	}
}

$GMN_ObjYoutube.init();

Este código nos ayudará a obtener todos los iframes de youtube que contengan la clase responsive-youtube y los ajustará cada que la resolución de la pantalla cambie. Ahora solo agregamos la clase responsive-youtube a los iframes de youtube que deseemos convertir en responsivos. Nuestro archivo index.html quedaría de la siguiente manera:


<!doctype html>
<html lang="es">
<head>
	<meta charset="UTF-8">
	<meta name="viewport"
		  content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>Youtube Embed responsive</title>
	<style>
			.container{
			    max-width: 900px;
			    margin: 0 auto;
			    display: flex;
			    background: beige;
			    padding: 1rem;
			    flex-direction: column;
			}
			.youtube-container{
			    width: 100%;
			}
</style>
	</head>
<body>
	<div class="container">
		<div class="title">
			<h1>Youtube video responsive embed</h1>
		</div>
		<div class="text">
			<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad adipisci alias beatae consequuntur, ea eos expedita explicabo fuga iure laboriosam laudantium molestiae neque obcaecati perferendis quam qui reiciendis sit unde!</p>
		</div>
		<div class="youtube-container">

<!-- Youtube embed code -->
			<iframe width="560" height="315" src="<https://www.youtube.com/embed/6WmbTTeIQNg>" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
			<!-- ./Youtube embed code -->
		</div>
	</div>
	
<javascript>
const $GMN_ObjYoutube = {
	iframes : [], //Define un array llamado iframes
	init: () => {
		$GMN_ObjYoutube.frames = $GMN_ObjYoutube.getAllYoutubeIframes(); //Obtenemos los iframes
		$GMN_ObjYoutube.processIframes(); //Procesamos cada uno de los iframes
		window.addEventListener('resize', $GMN_ObjYoutube.processIframes); //Agregamos un listener que se ejecutará cada vez que nuestra pantalla cambie de resolución
	},
	processIframes: () => { //Función que procesa los iframes
		for( let i = 0; i < $GMN_ObjYoutube.frames.length; i++  ) {
			let iframe = $GMN_ObjYoutube.frames[ i ];
			$GMN_ObjYoutube.resizeIframe( iframe );
		}
	},
	getAllYoutubeIframes: () => {
		return document.getElementsByClassName('responsive-youtube');//Obtiene todos los elementos con la clase responsive-youtube
	},
	resizeIframe: ( iframe ) => { //procesamos los iframes y ajustamos a ancho y alto
		let parent = iframe.parentElement; 
		iframe.height = ( iframe.height / iframe.width ) * parent.clientWidth;
		iframe.width = parent.clientWidth;
	}
}

$GMN_ObjYoutube.init();
</javascript>
</body>
</html>

Resultado final

via GIPHY

Y de esta manera podemos convertir fácilmente cualquier video de youtube insertado mediante iframe en un elemento responsivo. Aquí te dejamos un repositorio con los recursos separados para que puedas agregarlo a tu proyecto fácilmente:

GitHub: https://github.com/gumonet/youtube-responsive-embed
CodePen: https://codepen.io/gumonet/pen/xxqBEzR

Existen muchas maneras de realizar este proceso, si tú conoces alguna mejor, quieres dar tu punto de vista o tienes alguna duda en especial, te espero en la caja de comentarios. Y no te olvides de visitar el resto de nuestras publicaciones.