Лого SiteHere.ru

Почему нельзя вставлять видео YouTube через iframe или как ускорить загрузку страниц сайта

Как ускорить загрузку страниц сайта?

При создании сайта под заказ или просто для своего проекта возникает проблема со скоростью загрузки видео. Часто Google PageSpeed Insights на данную проблему не реагирует, но при загрузке в браузере скорость загрузки страницы заметно падает. Я сейчас говорю именно о видео. О тех видео, которые мы берем с сервиса Youtube. В этой статье я рассмотрю способ, который действительно ускорит загрузку страницы, на которой находится много вставок видео с Youtube.

Содержание

Тему скорости загрузки страницы я раньше уже затрагивал в следующих статьях и видео:

35% аудитории рунета не используют компьютер для интернета

35% аудитории рунета не используют компьютер для выхода в интернет

Более подробно про это исследование вы можете почитать на habr.com.

Понимаете сейчас, как важно для пользователей сделать быструю загрузку страниц. Мобильный интернет, какой бы он быстрый не был, сейчас еще не на таком уровне, как на компьютерах.

Сравнение скорости загрузки

Чтобы сравнить скорость загрузки страницы, перейдите по следующим кнопкам:

Обычная вставкаЗагрузка при клике

Как это использовать и результаты экспериментов

Эксперимент - как ускорить загрузки страницы отказавшись от iframe

Вначале я хотел просто рассказать о способе, который позволяет ускорить загрузку видео, которые веб-мастера берут с сервиса YouTube. Потому что, изначально сервис YouTube предлагает использовать для вставки видео именно iframe. Но, как в любой ситуации, всегда можно найти еще лучшее решение.

Затем я решил просто сравнить количество HTTP запросов на странице, где нет вставок iframe, со страницей, где я для примера вставил несколько видеороликов. Я понимал, что этот способ действительно уменьшает время загрузки страницы, но был приятно удивлен, когда увидел, что загрузка уменьшается в десятки раз.

Об этом эксперименте с видеороликами вы можете прочитать ниже. Я часто пользуюсь своими же статьями, которые написал довольно давно, поэтому для удобства я приведу скрипты, стили и разметку, которая необходима для вставки видео этим способом. Чтобы когда вы зайдете на данную статью второй раз (из закладок, например), могли сразу воспользоваться необходимыми материалами.

Блок "СКОПИРОВАЛ-ВСТАВИЛ"

Автор этого кода Alexis Ulrich (ссылка на оригинал в конце статьи). А сейчас, собственно, сам код с небольшими пояснениями.

1 этап. HTML разметка

HTML КОД

ВАЖНО: в атрибут id необходимо вставить идентификатор вашего видео на YouTube. Если не знаете, где оно находится то смотрите видео инструкцию к этой статье ниже.

2 этап. CSS стили

Скачать изображение кнопки "Play" можно здесь — скачать кнопку "Play".

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;
}

3 этап. Javascript

JAVASCRIPT КОД
'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);
        }
    }
});

Позиции сайта не растут в Яндекс и Google?

Закажите полный разбор сайта по SEO + консультацию

Сделайте аудит своего сайта самостоятельно с помощью сервиса

[ВИДЕО] Как использовать данный способ ускорения загрузки страниц на своих проектах?

Возможно, для кого-то не до конца ясно, куда необходимо вставить тот или иной участок кода. В небольшом видео я показал, как пользоваться материалами данной статьи на практике.

Почему нельзя вставлять видео Youtube на сайт через Iframe

Эксперимент со скоростью загрузки страницы на практике

Эксперимент со скоростью загрузки страниц

Ниже я описал 2 небольших эксперимента со скоростью загрузки страницы в зависимости от способа загрузки видео YouTube. Обратите внимание, насколько сильно отличаются цифры. Все тесты я проводил в браузере Chrome (версия 52.0.2743.116 m).

Для тестов я создал две страницы:

  • Страница #1 - здесь загрузка реализована тем способом, о котором рассказано в статье. То есть видео загружается только при клике.
  • Страница #2 - на этой странице я вставил видео обычным способом — через тег iFrame.

На протяжении двух тестов на страницах будут лишь добавляться видео.

ТЕСТ #1 - Количество видео на странице: 1

Сравнение скорости загрузки страницы с одним видеороликом

Подробное изображение со всеми запросами можно посмотреть по ссылкам:

Как видно из скриншота, на первой странице время загрузки меньше половины секунды. Оно и понятно, ведь на второй странице вдвое больше запросов. Даже на странице с одним видео заметна существенная разница. Если проанализировать запросы, то можно заметить, что на первой странице лишь 7 запросов, в то время как на второй их 15.

Но что же произойдет, если будет не одно видео, а несколько? Смотрите результаты второго эксперимента далее...

ТЕСТ #2 - Количество видео на странице: 5

Сравнение скорости загрузки страницы с одним видеороликом

Количество запросов для каждой из страниц:

Здесь разница колоссальная. Как во времени загрузки, так и по количеству запросов.

Я думаю становится понятно, что чем большее количество видео используется на странице, тем дольше будет осуществляться загрузка страницы.

Технические ошибки не дают расти в SEO?

Закажите полный разбор сайта по SEO + консультацию

Сделайте аудит своего сайта самостоятельно с помощью сервиса

Вывод

Также обязательно изучите плагин lazyYT.js. Он отлично подходит для решения этой задачи. Демо можно посмотреть здесь.

Скорость загрузки страниц - это постоянно больной вопрос. Многие пишут о том, что этот вопрос остро стоит именно в наше время. Но изучая литературу по созданию сайтов, которая написана в начале 2000-х, я сделал для себя вывод: даже в то время, когда страница загружалась примерно 10 секунд, о скорости загрузки беспокоились точно также, а может даже сильнее. Причина — приходилось отказываться от графической информации и других медиа на странице.

Способ вставки видео с YouTube, который мы рассмотрели в этой статье, действительно позволяет ускорить загрузку страниц сайта. Это видно даже на глаз. Поэтому попробуйте один раз применить это на своем сайте, и вы поймете все прелести данного способа.

К сожалению, прочитав статью, многие веб-мастера разочаруются. Возможно, они ждали именно плагина для какой-либо CMS (WordPress, Joomla и т.д). Ведь намного проще установить один плагин и наслаждаться результатом. Но увы, действительно оптимизированные вещи делаются зачастую вручную. Поэтому данный способ отлично подойдет для лендингов. Но кто запрещает на основе этого JS кода написать свой плагин для WordPress, например? 😉

Успехов!

Источник

С Уважением, Юрий Немец

114 комментариев к записи
  • Сергей

    Всё хорошо, но javascript уже фактически труп. Его поддержка же прекращена.

     
    • Юрий Немец

      Сергей, вы действительно уверены в этом?)

       
    • Сергей

      Вот выдержка с сайта www.java.com:

      "В браузере Chrome прекращается поддержка NPAPI для апплетов Java

      Работа подключаемых модулей Java для веб-браузеров основана на межплатформенной архитектуре подключаемых модулей NPAPI, которая уже более десяти лет поддерживается всеми основными веб-браузерами. Начиная с версии 45, выпуск которой запланирован на сентябрь 2015 г., браузер Google Chrome перестает поддерживать технологию NPAPI. Это повлияет на работу подключаемых модулей для Silverlight, Java, Facebook Video и прочих модулей, основанных на NPAPI."

       
      • Юрий Немец

        Причем тут Javascript?

         
        • Виталий

          Юрий как его сделать адаптивным?

           
          • Юрий Немец

            Добрый день, Виталий!

            Вместо HTML кода, который представлен в статье, вставьте данный код:

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

            Все остальное (CSS и JS) оставьте без изменений.

             
            • Виталий

              Да ширина получается 100 %, высоту делаем auto и ролик пропадает

               
              • Юрий Немец

                Адаптивную высоту нельзя сделать просто применив свойство height: auto. Для этого необходимо изменить структуру, а затем использовать свойство padding-top: 56.65% . Где проценты — это "высота/ширина*100". Тогда получатся проценты, которые можно вставить в свойство padding-top. Но данная структура не подходит для этого, поэтому я написал вариант использования выше.

                 
      • Роман

        Ну Серега ну даешь. Книги почитай

         
    • Fuze

      Пруф приведи по такому экспертному заключению.

       
  • Сергей

    Как хорошо быть модератором в Сабскрайбе! Все новенькое всегда перед глазами!kiss

    Спасибо, Юрий, за такую полезность.

    Остался только один вопрос — влияет или нет такой способ взаимодействия сайта с Ютубе на учет видеохостингом количества просмотров видеороликов?

     
    • Юрий Немец

      Здравствуйте, Сергей!

      Данный способ влияет лишь на первоначальную загрузку. После клика дальнейшие действия с видео происходят как с обычной вставкой iframe.

       
  • Наталья Яшина

    Большое спасибо, Юрий! Как всегда полезно и информативно.

     
  • Дмитрий

    Сбасибо вам за уроки, очень полезные.

     
    • Юрий Немец

      Спасибо, Дмитрий! Приятно видеть, что мои материалы приносят пользу.

       
  • Александр

    Уже написан jQuery плагин и виджет для Muse. https://github.com/CenterAffiliatePrograms/youtubeVideo

     
  • Руслан

    Интересный материал. Всегда думал, что видео с ютуба не замедляет загрузку сайтов. 

    Оказывается ошибался

     
  • Княгиня

    Вот тебе и на тебе… То ифрейм предлагался как прогрессивный способ вставки, а оказывается — всё иначе.

    Не знаю, будет ли время, но стоит попробовать сделать шорткод для Вордпресса (нет, плагин писать не возьмусь, а шорткод — в самый раз).

     
  • Aleksey

    А если мне видео не с ютуба нужно было, например у меня на странице 9 роликов, и нужно сделать что бы не один формат видео подгружался, а 3 — mp4, webm и ogv?

     
  • Алмаз

    Большое спасибо! Оптимизировал на своем сайте все страницы!

     
  • Алмаз

    А как исправить ошибку в IE? Не хочет воспроизводить в этом браузере…

     
  • Алмаз

    Исправил немного код и оптимизировал для Internet Explorer и Google Chrome, теперь показывает и там и там, именно с мобильного телефона, а с компьютера итак все работало. Разбирался долго, но сделал все круто)

     
    • Александр

      А что исправили для мобильных?

       
  • Seosko

    Интересная статья, ведь iframe загружается асинхронно, то есть ваш способ просто помогает сократить время на загрузку видео + уменьшает нагрузку на сервер за счет сокращения количества запросов.

    Как по мне, так в WordPress могли бы уже давно в залить в движок кнопки и оформления ютуба. Зачем же столько лишних запросов наплодили..

     
  • Алексей

    Прекрасно!

    А можно как-то допустить переход в полноэкранный режим и избежать появления всплывающего сообщения о неудачной попытке переключиться в него?

    Спасибо за статью, всех благ.

     

     
  • Павел

    А если видео с ВКонтакте?

     
  • zmoe

    Поставил себе, очень кстати, только код скрипта лучше выносить в отдельный js файл.

     
  • Александр

    Так как специалист из меня аховый устал я уже с бубном плясать, на всех сайтах в описанном вами способе видео спечкоробковое, нет возможности переключения в полноэкранный режим, есть возможность только выгнать своих посетителей для приятного просмотра на YouTube. Блин как сделать полноэкранный режим всякие fs=1 не прокатывают. Не знаете, так и  напишите, "фиг его знает, за что купили за то продаем". Просто быстрая загрузка страницы это конечно отлично, но без полноэкранного режима … пусть на пару тройку секунд дольше прогрузится зато посетители дома останутся.

     
  • Дмитрий

    Добрый день. У меня необходимость вставить несколько видео, но не просто ролик, а несколько плейлистов, какие параметры в данном случае использовать в качестве id или нужно что-то менять кардинально?

     
    • Юрий Немец

      Добрый день, Дмитрий!

      Пример, который рассмотрен в статье может служить только основой, и может дорабатываться вами самостоятельно.

      Чтобы вставить плейлист, здесь аналогичная ситуация: необходимо лишь заменить ссылку на видео, так как у вас там будет плейлист. Кроме этого, необходимо изменить постер, который показывается до клика.

      Вы можете использовать следующий код, если желаете самостоятельно задавать изображения (превью) для своих видео. Их можно будет задавать в атрибуте data-mimg в html.

      А сейчас по этапам, чтобы у вас заработал плейлист с данным способом:

      1) Вставляете следующую HTML разметку:

      <div class="youtube" 
          id="PLAZyWa5bxyz_c2wQfcQ-RHr1zT6TL82W4"
          style="width: 640px; height: 348px;"
          data-mimg="img/poster.jpg"></div>

      где: id — идентификатор плейлиста, когда вы его создали и у вас есть iframe для вставки, то вы там сможете найти этот идентификатор, data-mimg — адрес до изображения с превью изображением, которое будет показывать изначально, до того, как кликнули на кнопку Play.

      2) В JS файл вставить следующий код:

      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++) {
            
          videos[i].style.backgroundImage = 'url('+videos[i].getAttribute("data-mimg")+')';
      
          var play = document.createElement("div");
          play.setAttribute("class","play");
          videos[i].appendChild(play);
      
          videos[i].onclick = function() {
            var iframe = document.createElement("iframe");
            var iframe_url = "https://www.youtube.com/embed/videoseries?list=" + this.id + "&autoplay=1";
            iframe.setAttribute("src",iframe_url);
            iframe.setAttribute("frameborder",'0');
      
            iframe.style.width  = this.style.width;
            iframe.style.height = this.style.height;
      
            this.parentNode.replaceChild(iframe, this);
          }
        }
      
      });

      На этом все.

       
  • артем

    как изменить картинку в hd формат а также сделать фоновым видео?

     
  • НеЯлена

    Здравствуйте, Юрий. Спасибо за интересный вариант загрузки видео. Есть ли решения для адаптации этого скрипта под мобильные устройства? Очень буду признательна, если выложите код на сайт или мне на почту

     
  • Кирилл

    А как сделать, чтобы не проигрывались потом похожие видео. С iframe понятно, а вот с такой реализацией не совсем.

     
    • Юрий Немец

      Здравствуйте, Кирилл!

      Для того, чтобы в конце видео не появились похожие видео, необходимо в адрес дописать атрибут:

      https://www.youtube.com/embed/tcVov_zfeTY?rel=0

      После вставки адреса видео, необходимо дописать параметр ?rel=0.

      Если это не первый параметр, то перед данным параметром необходимо поставить &rel=0. Следующим образом:

      https://www.youtube.com/embed/tcVov_zfeTY?autoplay=1&rel=0

       

       
      • Кирилл

        куда именно его вписать. У нас в коде нет такой строки. Это стандартная рекомендация, которая настраивается в youtube. А как ее привязать к скрипту?

         
  • Кирилл

    Спасибо. И еще вопрос. Как включить полноэкранный режим

     
  • Кирилл

    со всеми вопросами разобрались. Остался только полноэкранный режим. Как его включить?

     
  • Юрий Немец

    Кирилл, для этого необходимо дописать параметр в URL: &fs=1.

    Все параметры настройки видео Youtube вы можете изучить здесь — перейти.

     
    • Владимир

      а в конструкции нет же URL. идет id="0wCC3aLXdOw". подскажите плиз куда ставить этот параметр &fs=1 для полноэкранного режима

       
      • Юрий Немец

        Добрый день, Владимир!

        Обратите внимание на второй пример в данном демо — перейти.

        Там есть такой параметр, как "data-params", в который и необходимо вставить.

         
        • Владимир

          конструкция все равно не работает. я делал как во втором примере. а вы сами пробовали? по идеи параметр fs=1 идет по умолчанию. но в данном случае он не срабатывает

           
          • Юрий Немец

            Владимир, значит, вы делаете что-то не так.

             
            • Виктор

              не удалось перейти в полноэкранный режим, при нажатии на кнопку квадрата…. даже в вашем первом примере не работает.

               
  • Владимир

    кнопка то есть полноэкранного режима, но она не срабатывает

     
  • Владимир

    Как добиться полноэкранного режима? Юрий, это возможно реализовать или, все таки, нет?

     
    • Юрий Немец

      Владимир, на полноэкранный режим данный способ вставки видео не влияет, возможно вы сделали слишком маленькое окно для просмотра, поэтому у вас нет кнопки полноэкранного режима. А если кнопка есть, но она не нажимается, то внимательно посмотрите на сообщение, которое всплывает при наведении на иконку полноэкранного режима.

       
      • Виктор

        Юрий добавьте в скрипте добавьте строку:

        iframe.setAttribute("allowfullscreen",'');

        и будет работать полноэкранный режим. не выводя сообщение "не удалось перейти в полноэкранный режим"

         
        • Юрий Немец

          Спасибо за решение проблемы, Виктор!

           
        • Сергей

          Спасибо Вам огромное!!!

           
  • Алёша

    Может кому будет интересно посетить иностранные сайты, схожие темы вставки видео с подгрузкой. Там другой вариант кода. Работает просмотр на весь экран + можно убрать превью похожих роликов при нажатии на паузу и в конце основного видео.
    1. https://www.labnol.org/internet/light-youtube-embeds/27941/

    2. https://schoberg.net/2015/08/fast-agile-youtube-embed-responsive-iframe-load-delay-with-jquery/

    Вторая ссылка с полезными комментариями как здесь.

     
    • Аркадий

      Спасибо!  Все работает без проблем.

       
    • Александр

      Спасибо, за данное решение. Все супер работает + адаптивность от fitvids = все четко ) благодарю

       
  • Devvver

    Плагин для Wp никто не сделал из кода? Поделитесь

     
    • Юрий Немец

      Здравствуйте, Евгений!

      Плагин для WP похожий есть: Lazy Load for Videos. Но если вам нужно применить этот способ для простого лендинга, то отлично подойдет пример из статьи.

       
      • Devvver

        Поставил в результате плагин Video Embed Optimizer, просто бомба по скорости. Из минусов нет микроразметки.

         
  • Полис

    Подскажи пожалуйста, сделали сайт под концерт дискотеки в краснодаре.

    Все хорошо но все-же хотелось бы ускорить загрузку видео на заставке на главной.

    Работаем на OpenCart.

     
    • Юрий Немец

      Уменьшите длительность видео, так как это фоновое видео, то 2 минуты никто смотреть его не будет.

      В зависимости от посещаемости сайта и качества вашего хостинга вы можете разместить видео у себя на хостинге и сделать загрузку таким образом: когда сайт только загрузился, вы загружаете только изображение, параллельно подгружая фоновое видео, как в этой статье — как сделать видео на фоне. А затем скрываете изображение и запускаете видео.

       
  • Денис

    Как-то результат противоположный https://prnt.sc/fj8lye

     
    • Юрий Немец

      Добрый день, Денис!

      По вашему скриншоту отчетливо видно, что в основном время отличается из-за времени отклика сервера, а сама страница, как я писал в статье, действительно меньше по размеру.

      Скорее всего вы провели этот тест один раз, если вы несколько раз отправите два этих URL-адреса на проверку, то и время отклика сервера будете получать каждый раз несколько другое.

       
  • Gamer

    Не знал о способе. Но у меня на сайте 130 игр с роликами. Их теперь по одному менять? Через реплейс в базе данных можно как-то реализовать? 

     
  • gregory

    Спасибо за статью, полезно!laugh

    Возник вопрос следующий:

    Как сделать, чтоб при проигрывании первого видео, включая второе на этой же странице, первое ставилось автоматом  на паузу и при этом сново появлялась кнопка Play.

    Спасибо)

     
  • Игорь

    Я проверил, без ифрейм http://prntscr.com/gs03pl а как обычный скачиваемый код с ютуба http://prntscr.com/gs044z

    Результат с обычным кодом Ютуба быстрее на 5%.

    Так что не понятно все вышеизложенные выводы.

     
  • Сергей

    Отличная статья. Спасибо!

    Сделал вставку видео. Постер средствами css удалось отцентрировать. А вот после клика ролик слева экрана.

    Код в javascript

                iframe.style.dislplay = "block";
                iframe.style.margin = "0 auto";
    

    не помог.

    Подскажите, пожалуйста, как отцентрировать ролик.

     

     
  • Алексей

    Добра всем!!!  Ситуация значит такая. Поставил видео в ajax окошко … Но вот как сделать так, чтобы при закрытии данного окна видео выключалось, а так происходит что оно продолжает проигрывать.

    <div class="popup_jutub" id="jutub1">
    <div class="youtube" id="WsIORuCCqc0" style="width: 500px; height: 300px;"></div>
    <a rel="nofollow" class="close_jutub sf" href="#close"></a>
    </div>

     

     
  • Владимир

    Минус этого способа и всему ему подобных где есть Autoplay в том, что чтобы запустить ролик на телефонах ( а сейчас это львиная доля трафика) нужно кликнуть дважды.
    Юзер может не понять, что кликнуть нужно еще раз и уйдет с сайта..

     

     
  • Иван

    Добрый вечер Юрий Немец!

    Скажите а есть возможность таким же способом сократить загрузку только не видео на youtube а "iframe" 3d виртуальных туров? . Вот пример чего я вставляю на сайте . а то боюсь у меня сайт не потянет большую галерею сделать

    <iframe id="airpano_frame" width="700" height="450" src="/Lazurn_StTrope_StMaxime/2-3-2" frameborder="0" marginheight="0" marginwidth="0" scrolling="no" framespacing="0"> </iframe> 

     
  • Валентина

    Перепробовала все, что рекомендовали.  В результате ютуб отказывается воспроизводить видео, пишет, что недоступно. Намучилась.

    Вернула фрейм. Видно ютубу не выгодно. Или я где-то ошиблась.

    А в основном сайт удивительно хорош. Есть чему учиться.

    Благодарю Немца!!!

     
  • Егор

    Здравствуй, Юра. Как всегда очень полезная информация. Коснулось дело до страницы — видеогалереи. Данное решение значительно оптимизирует скорость загрузки. Смотрел еще о картах Yandex статью, тоже пригодится.

     
    • Юрий Немец

      Здравствуй, Егор! Спасибо! 🙂

       
  • Лев

    Здравствуйте, Юрий!

    Сделал, все как описано выше. Видео не открывается. На месте, где оно должно быть ничего нет. Вылазит ошибка: TypeError: r is not a function. CMS: wordpress, попробовал в редакторе онлайн, там все работает. Не подскажите в чем может быть причина?

     
  • Филюс

    Здравствуйте. Мне понравился Ваш скрипт с выбором своего превъю. Но Ваш скрипт работает данным образом только для плейлистов. Хотелось бы данную функцию иметь для одиночного видео. В Javascript не силен. Путем тыканий получилось запустить нужный мне код с одним НО. (название превьюшки должно совпадать с ID видео.) Что-то мне не нравиться данный метод. PageSpeed Insights ругается на превью по дефолту — от сюда и пляски. Подскажите пожалуйста как решить данный вопрос. Обращаюсь к вам, так как на Вашей странице с данной статьей сервис гугл на превьюшку не ругается.

    Вот код:

        <script type="text/javascript">

        '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(./myimg/video_preview/' + videos[i].id + '.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/&quot; + 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); }  }});

        </script>.

    Как прописать правильно, чтобы можно было указать в html название, а скрипт его подхватывал, как в примере со скриптом для плейлиста? 

    Спасибо.

     
  • Андрей

    В блок
    .youtube {
    ***
    }

    Добавьте:
    background-size: cover

    Тогда размер картинки будет подгоняться под размер блока с видео.

     
  • Андрей

    У видео не всегда есть SD качество привьюшки.

    sddefault можно заменить на
    videos[i].style.backgroundImage = ‘url(http://i.ytimg.com/vi/‘ + videos[i].id + ‘/hqdefault.jpg)’;

     
  • Андрей

    а за статью большое спасибо. очень выручило!

     
  • Алексей

    Ребята, всем привет!
    К вам за советом. Есть вот такой сайт. Делается на Muse. 
    <p><img src="C:\Users\Marinochka\Documents\MalenaHome\Psd\001.jpeg"></p>

    Второй блок сайта должен быть заполнен видео (YouTube/Vimeo/Файл на хосте).

    Задача в том, чтобы видео было: 

    — на всю ширину и высоту (до границы хедера) окна браузера,  

    — было адаптивным при изменении ширины браузера, 

    — а также чтобы контейнер видео начинался строго после хедера с меню, который зафиксирован на верхней части сайта (в шаблоне).

    <p><img src="C:\Users\Marinochka\Documents\MalenaHome\Psd\002.jpeg"></p>

    В идеале конечно идея, чтобы еще прокрутка на второй блок с видео была по принципу слайда, т.е. первое движение колесом мыши и сразу второй блок, четко заполненный по окну браузера.. 

    Заранее благодарю!

     
  • Антон

    Здравствуйте, вопрос, на сео оно влияет?

    Как обычно щас вывод стоит без оптимизации и поисковые системы видят что по мимо текста на сайте есть и видео, а если я оптимизирую вашим способом, будут ли видеть поисковики что есть видео на странице?

     
  • Антон

    Добрый день. Отличная статья,но возникли проблемы. При вставке  Javascript выдает следующую ошибку:

    syntax error, unexpected ')', expecting variable (T_VARIABLE)

    в этой строке function r(f){/in/.test(document.readyState)?setTimeout('r('+f+')',9):f()}

    Помогите,пожалуйста,разобраться

     
  • Евгений

    Кто-нибудь смог решить проблему с автопроигрыванием на мобильных браузерах?

    Пользователю приходится два раза тыкать.

     
  • Evgeny

    Есть ли способ заставить работать эту фичу еще и на Google AMP страницах?

     
  • Антон

    Я через <video> ролики вставляю
    и работают отлично и на скорости загрузки сайта практически не сказывается

     
  • Sci

    Спасибо за материал, очень пригодился. Но есть одно дополнение.

    У меня видео не открывалось на весь экран, а вставку необходимо было сделать в сайдбар (т.е видео было малого размера). 

    там после

    iframe.setAttribute("src",iframe_url);
    iframe.setAttribute("frameborder",'0');

    Можно добавить
    iframe.setAttribute("allowfullscreen",''); 

    Чтобы кнопка "смотреть на весь экран" была активной. 

    Так и не получилось активировать autoplay, пробовал по разному, но мб это у меня так браузер криво настроен.

     
  • Алексей

    Чего-то не отображается кнопка, может из-за того, что 3 видео сразу воткнул?

     
  • Игорь

    Здавствуйте! Юрий, может есть решение на сегодня? На Апрель 2019? Что бы не нажимать по 2 раза на проигрыватель на мобильных??  Готов оплатить помощь в $.

     
  • Николай

    Юрий, огромное спасибо за Ваш труд! Очень качественное описание и изложение скрипта. И решение проблем с ускорением скорости загрузки сайта, содержащего ifreme от Ютуб.

     
  • Юрий

    Здравствуйте, Юрий. Спасибо. Все получилось. Сделал на двух сайтах, на одном все отлично, на втором почему то над постером не появляется "палец" чтобы показать, что картинка активная. Может это как-то связано с тем, что домен кириллический?

     
    • Юрий Немец

      Добрый день, Юрий!
      Код, к сожалению, не вижу, но домен точно на это не влияет. Вам нужно сравнить как вы на первом сайте сделали, возможно что-то упустили.

       
  • Андрей WPM

    Идея имеет право на существование. На 2019 год это уже спокойно реализуется ленивой загрузкой ребят. Автору респект за ещё один способ. Добавлю себе в копилочку.

     
  • Тимофей

    Здравствуйте, все сделал как у вас описано в статье, все работает, но почему то видео автоматически не запускается, приходиться повторно нажимать на кнопку Play в плеере Ю тюб. Может скрипт конфликтует. А может какая то ошибка у вас в коде?

     
  • Тимофей

    И видео не открывается в полно экранном режиме. Пишет не удалось открыть.

     
  • Юрий Немец

    Здравствуйте! Попробуйте JS библиотеку lazyYT.js. Я думаю будет проще решение, чем в статье.

     
  • Тимофей

    Здравствуйте, вот сейчас подсмотрел хороший вариант, у меня все работает, человек все очень четко и понятно объясняет, вот ссылка на его видео: https://youtu.be/4JS70KB9GS0 , думаю будет очень полезно всем.

     
  • Надежда

    Добрый вечер. Выполнила все по вашей инструкции — работает на ура. Только не могу настроить адаптивность. А как подключить lazyYT.js не понимаю. Может быть напишете подробную инструкцию? Было бы классно.

     
    • Юрий Немец

      Добрый вечер, Надежда!

      Отлично, что у вас все получилось. Чтобы адаптивность настроить, нужно задать ширину через CSS и указать либо в процентах, либо с помощью свойства max-width.

      Процесс подключения lazyYT довольно простой:

      1) Необходимо подключить jQuery и сам скрипт lazyYT.js

      2) Вставить тег div с вашим id видео:

      Загрузка...

      3) В своем файле Javascript инициализировать данный плагин:

      $('.js-lazyYT').lazyYT({
        youtube_parameters: 'rel=0', // параметры Youtube: https://developers.google.com/youtube/player_parameters#Parameters
        loading_text: 'Загрузка...', // показывается, пока идет загрузка видео
        display_title: true, // показывать ли заголовок видео
        default_ratio: '16:9', // соотношение сторон
        display_duration: false, // показывать ли длительность видео в правом нижнем углу
        
        // Advanced settings
        video_loaded_class: 'lazyYT-video-loaded', // добавляет класс после того, как видео загружается в контейнере
        container_class: 'lazyYT-container' // класс для контейнера видео
      });
      

      Если будут вопросы — пишите в ответ на этот комментарий.

       
      • Надежда

        Огромное спасибо. Буду разбираться. Надеюсь, что получится. Но честно говоря, я не специалист. Поэтому уйдет много времени. Потом напишу результат.

         
      • Серега

        Подскажите плз .. !!!
        Использую данный код вместо iframe ( не для просмотра видео)
        Нужно сделать так, чтобы была еще одна кнопка которая закрывала бы iframe и возвращала данный код в изначальное состояние (то есть на превью как было до нажатия)

         
  • Надежда

    Добрый вечер, Юрий. Перепробовала много разных вариантов. Но увы моих мозгов не хватило. Адаптивность не получается. Другие скрипты тем более. Что конкретно написать в CSS Вашего варианта, чтобы получилась толковая адаптивность? Заранее Вам благодарна.

     
    • Юрий Немец

      Надежда, добрый вечер! Посмотрите пример в статье (добавил нужный CSS). Сейчас на мобильных устройствах будет адаптивно.

       
      • Надежда

        Огромное спасибо. А можно ли как-то сделать, чтобы на больших экранах не было так много черного с боков? Чтобы было красивее? Это было бы вообще здорово. Я проверяла скорость загрузки страниц с видео, вставленным сразу через iframe и по Вашему варианту. Получается на 1 сек. быстрее. А это очень важно. Ваша статья — просто спасение для меня и таких как же чайников.

         
        • Юрий Немец

          Надежда, вы имеете ввиду когда проигрывается видео сбоку есть черные полосы? Если да, то нужно лишь высоту увеличить.

           
          • Надежда

            Если просто увеличить высоту — получается много черного сверху и снизу на узких экранах. Методом тыка добавила контейнер для видео с css

            .video-wrapper {
            	width: 600px;
            	max-width: 100%;
            }
            

            Стало полностью круто. Теперь страницы с видео загружаются не 3 сек, а 2 сек. Я думаю, что это очень хорошо.
            Только благодаря таким подробным статьям, как Ваша, я смогла сделать и продвигать свой сайт perlu24.com Огромнейшее Вам спасибо. Постараюсь освоить еще несколько Ваших инструкций.

             
  • Надежда

    Как-то статья стала странно выглядеть. Наверное что-то сбилось

     
    • Юрий Немец

      Спасибо, поправил 🙂 .

       
  • CmsWp

    Доброго времени!

    «на основе этого JS» — зачем !? Этот функционал есть в плагинах кэширования, к примеру в WP Rocket, там и миниатюра нарезается на автомате и подгрузка ролика при клике.

     
    • Юрий Немец

      А что если сайт не на WordPress?

       
  • Max

    Спасибо. Крутой совет
    А сам к этому дошел или где-то подсмотрел

     
  • Adamenko

    Здравствуйте! Подскажите, как можно отключить видео или остановить при клике по кнопке в слайдере

     
  • Татьяна

    Первым способом — вставкой кода не получилось, плеер не отображается. Хотя, раньше тоже им пользовалась, потом перешла на вставку от ютуба с iframe.
    В редакторе страницы на вордпресс можно ведь использовать функцию «вставка медиафайла», что позволяет вставить адрес страницы на видео хостинге. Так не проще?

     
    • Юрий Немец

      Здравствуйте, Татьяна!
      Когда вы вставляете через iframe, то подгружаются CSS и JS файлы от YouTube. Но бывает такое, что пользователь иногда не смотрит видео, но если он был на странице, то сторонние ресурсы все же загрузились.

      Чтобы это предотвратить был создан такой способ загрузки, когда ресурсы с Youtube начинают загружаться только в случае, если пользователь планирует посмотреть видео.

      Еще один способ: это сделать загрузку во всплывающем окне, как я сделал на этой странице при просмотре видео.

       
  • Григорий

    ЗДравствуйте? спасибо за статью — видео добавил сайт стал шустрее
    но вот почему-то не появляется кнопка PLAY на видео, и картинка которая сейчас на видео маленькая и кривая — потому что у меня 6 видео вместе

    вот код 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('/public_html/smart-protect.com.ua/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;
    }

    ——————————
    вот полнейшый путь к изображению:

    ftp://wprbgqtc@s37.s-host.com.ua/public_html/smart-protect.com.ua/img/youtube-play-btn.png

    ———————-
    и так пробовал и не работает, сами видео работаю воспроизводятся, но вот кнопка по середине не появляеться

    Как исправить? Кто понимает в чем причина?

    ———————-

    И второй вопрос — как добавить на те видео — картинки которые я захочу? Например простой скриншот как выглядит видео — чтобы не смотрелись криво?

    Вот мой сайт на котором я все это делал: https://smart-protect.com.ua/

    видео отзывы почти в низу

    буду очень благодарен за помощь

     
  • Александр

    Спасибо, всё работает хорошо!
    Есть пара но:
    1) В js код надо добавить к ссылке на подгрузку превьюшки s, чтобы получилось https… А то ssl сертификат начинает ругаться.
    2) Так и не понял почему не подгружается вторая превьюшка, если на одной странице 2 видео.

     
  • Роман

    Почему то при клике сразу не включается видео (
    как это возможно исправить ?

     
    • Андрей

      Тоже интересует этот вопрос. Пролистал комменты.., несколько человек спрашивали про это, но им никто не ответил.

      На смартфонах и хроме сейчас нужно кликнуть 2 раза для воспроизведения, что автоматически делает данный метод абсолютно не актуальным по понятным причинам. Неужели за годы никто так и не смог решить данную критическую ошибку?

       

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *