YouTube
November 6, 2022

Быстрый Youtube на сайте

Youtube грузит страницу сайта, где опубликован ролик.

Спойлер: тут моё решение.

Сравним разные способы.

1. Обычным способом вставляем ролик на сайт


2. Оптимальный способ

3. Самый простой способ

3 способ более быстрый. НО

Нужно 2 раза нажимать на пуск ролика.

Вид ролика не адаптивный (он слева).

Поэтому оптимальный 2 вариант: он и нажимается как обычно 1 кликом и не грузит сайт, как при обычном варианте вставки кода.


Вариант "Два раза нажми" - не интересно, но может кто захочет покопаться.

Взято отсюда.

CSS

.youtube { background-position: center; background-repeat: no-repeat; position: relative; display: inline-block; overflow: hidden; transition: all 200ms ease-out; cursor: pointer; } .youtube .play { background: url('../img/youtube-play-btn.png') no-repeat; /*ВАЖНО: здесь укажите адрес до изображения*/ background-position: 0 -50px; -webkit-background-size: 100% auto; background-size: 100% auto; position: absolute; height: 50px; width: 69px; transition: none; top:0; left:0; right:0; bottom:0; margin:auto; } .youtube:hover .play { background-position: 0 0; }

SCRIPT

'use strict'; function r(f){/in/.test(document.readyState)?setTimeout('r('+f+')',9):f()} r(function(){ if (!document.getElementsByClassName) { // Поддержка IE8 var getElementsByClassName = function(node, classname) { var a = []; var re = new RegExp('(^| )'+classname+'( |$)'); var els = node.getElementsByTagName("*"); for(var i=0,j=els.length; i < j; i++) if(re.test(els[i].className))a.push(els[i]); return a; } var videos = getElementsByClassName(document.body,"youtube"); } else { var videos = document.getElementsByClassName("youtube"); } var nb_videos = videos.length; for (var i=0; i < nb_videos; i++) { // Находим постер для видео, зная ID нашего видео videos[i].style.backgroundImage = 'url(http://i.ytimg.com/vi/' + videos[i].id + '/sddefault.jpg)'; // Размещаем над постером кнопку Play, чтобы создать эффект плеера var play = document.createElement("div"); play.setAttribute("class","play"); videos[i].appendChild(play); videos[i].onclick = function() { // Создаем iFrame и сразу начинаем проигрывать видео, т.е. атрибут autoplay у видео в значении 1 var iframe = document.createElement("iframe"); var iframe_url = "https://www.youtube.com/embed/" + this.id + "?autoplay=1&autohide=1"; if (this.getAttribute("data-params")) iframe_url+='&'+this.getAttribute("data-params"); iframe.setAttribute("src",iframe_url); iframe.setAttribute("frameborder",'0'); // Высота и ширина iFrame будет как у элемента-родителя iframe.style.width = this.style.width; iframe.style.height = this.style.height; // Заменяем начальное изображение (постер) на iFrame this.parentNode.replaceChild(iframe, this); } } });

Потом вставляете код:

<div class="youtube" id="0wCC3aLXdOw" style="width: 500px; height: 281px;"></div>

туда где на странице нужно видео и всё заработает. Не забываем менять выделенный код на код своего ролика.

Ну а самый лучший способ предложил тут Amit Agarwal из Google.

<script> /* * Light YouTube Embeds by @labnol * Credit: https://www.labnol.org/ */

function labnolIframe(div) { var iframe = document.createElement('iframe'); iframe.setAttribute('src', 'https://www.youtube.com/embed/' + div.dataset.id + '?autoplay=1&rel=0'); iframe.setAttribute('frameborder', '0'); iframe.setAttribute('allowfullscreen', '1'); iframe.setAttribute('allow', 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture'); div.parentNode.replaceChild(iframe, div); }

function initYouTubeVideos() { var playerElements = document.getElementsByClassName('youtube-player'); for (var n = 0; n < playerElements.length; n++) { var videoId = playerElements[n].dataset.id; var div = document.createElement('div'); div.setAttribute('data-id', videoId); var thumbNode = document.createElement('img'); thumbNode.src = '//i.ytimg.com/vi/ID/hqdefault.jpg'.replace('ID', videoId); div.appendChild(thumbNode); var playButton = document.createElement('div'); playButton.setAttribute('class', 'play'); div.appendChild(playButton); div.onclick = function () { labnolIframe(this); }; playerElements[n].appendChild(div); } }

document.addEventListener('DOMContentLoaded', initYouTubeVideos); </script>


<style> .youtube-player { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; background: #000; margin: 5px; } .youtube-player iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 100; background: transparent; } .youtube-player img { object-fit: cover; display: block; left: 0; bottom: 0; margin: auto; max-width: 100%; width: 100%; position: absolute; right: 0; top: 0; border: none; height: auto; cursor: pointer; -webkit-transition: 0.4s all; -moz-transition: 0.4s all; transition: 0.4s all; } .youtube-player img:hover { -webkit-filter: brightness(75%); } .youtube-player .play { height: 72px; width: 72px; left: 50%; top: 50%; margin-left: -36px; margin-top: -36px; position: absolute; background: url('//i.imgur.com/TxzC70f.png') no-repeat; cursor: pointer; } </style>

Потом писать код в статье:

<div class="youtube-player" data-id="VIDEO_ID"></div>

На базе этого решения, я допилил показ title и Alt и немного поменял в обоих кодах.

<script>

function labnolIframe(div) { var iframe = document.createElement('iframe'); iframe.setAttribute('src', 'https://www.youtube.com/embed/' + div.dataset.id + '?autoplay=1&rel=0'); iframe.setAttribute('frameborder', '0'); iframe.setAttribute('allowfullscreen', '1'); iframe.setAttribute('allow', 'accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture'); div.parentNode.replaceChild(iframe, div); }

function initYouTubeVideos() { var playerElements = document.getElementsByClassName('youtube-player'); for (var n = 0; n < playerElements.length; n++) { var videoId = playerElements[n].dataset.id; var div = document.createElement('div'); div.setAttribute('data-id', videoId); var thumbNode = document.createElement('img'); thumbNode.src = '//i1.ytimg.com/vi/ID/hqdefault.jpg'.replace('ID', videoId); thumbNode.alt = 'Youtube - ID'.replace('ID', videoId); thumbNode.title = 'Ролик взят с youtube.com/ID'.replace('ID', videoId); div.appendChild(thumbNode); var playButton = document.createElement('div'); playButton.setAttribute('class', 'play'); div.appendChild(playButton); div.onclick = function () { labnolIframe(this); }; playerElements[n].appendChild(div); } }

document.addEventListener('DOMContentLoaded', initYouTubeVideos); </script>

Строчку iframe.setAttribute('frameborder', '0'); можно удалить, если у вас в CSS явно задано для фото и видео frameborder: 0; - тогда валидатор будет меньше ругаться.

Адрес картинки '//i.ytimg.com/vi/ID/hqdefault.jpg' выдаёт картинку среднего качества, чего достаточно для видео небольшого размера.

Если вы хотите размещать большие размера видео, тогда превью нужно изменить (в коде, что выше) на '//i.ytimg.com/vi/ID/maxresdefault.jpg'

<style> .youtube-player { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; background: #000; margin: 5px; }

.youtube-player iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 100; background: transparent; }

.youtube-player img { object-fit: cover; display: block; left: 0; bottom: 0; margin: auto; max-width: 100%; width: 100%; position: absolute; right: 0; top: 0; border: none; height: auto; cursor: pointer; -webkit-transition: 0.4s all; -moz-transition: 0.4s all; transition: 0.4s all; }

.youtube-player img:hover { -webkit-filter: brightness(75%); }

.youtube-player .play { height: 51px; width: 69px; left: 50%; top: 50%; margin-left: -36px; margin-top: -36px; position: absolute; background: url('/images/youtubeplay.png') no-repeat; cursor: pointer; }

</style>

Сама картинка выглядит так.

Ещё подробнее написано в продолжении на моём сайте rtr24.ru тут.