Добавляем YouTube видео на сайт

HTML и CSS
137111 просмотров

YouTube (или Ютуб — как его чаще называют) — это примерно 500 часов видео, загружаемых каждую минуту. И большинство сайтов просто берут код «Поделиться → Вставить» и вставляют его как есть. Работает — ну и ладно. Но один плеер тянет за собой около 500 КБ скриптов и ощутимо замедляет загрузку страницы — даже если пользователь никогда не нажмёт Play. В этой статье разберём, как вставить видео с YouTube на сайт четырьмя способами: от самого простого до самого щадящего для скорости загрузки.

Как добавить YouTube видео на сайт — четыре способа

Способ 1 — Как вставить видео с YouTube через iframe

Самый очевидный путь: открываете видео на YouTube, нажимаете «Поделиться», затем «Вставить» — и получаете готовый код. Копируете, вставляете на страницу.

Кнопка Поделиться на YouTube — как получить код для вставки
<iframe width="560" height="315" src="https://www.youtube.com/embed/VIDEO_ID" title="Название видео" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" frameborder="0" allowfullscreen>
</iframe>

Замените VIDEO_ID на идентификатор вашего видео — это часть URL после ?v= или после последнего слеша в коротких ссылках youtu.be/ . Всё остальное YouTube подставляет сам. Работает — но у такого кода есть один очевидный недостаток: фиксированные размеры. На широком экране 560 пикселей выглядят скромно, а на узком — видео вылезает за край страницы. Об этом — в следующем разделе.

Способ 2 — Адаптивный embed

Проблема стандартного кода — фиксированные width="560" и height="315" . На узких экранах видео либо обрезается, либо выходит за пределы страницы. Решение — убрать фиксированные размеры и сделать iframe резиновым через CSS. Это базовый HTML-приём, который работает для любого встроенного видео:

<div class="video-wrapper">
    <iframe src="https://www.youtube.com/embed/VIDEO_ID" title="Название видео" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen>
    </iframe>
</div>
.video-wrapper {
    aspect-ratio: 16 / 9; /* держит пропорции видео на любой ширине */
    width: 100%;
}

.video-wrapper iframe {
    width: 100%;
    height: 100%;
    border: none;
}

aspect-ratio: 16 / 9 — современный CSS-способ удержать пропорции без каких-либо костылей. Контейнер сам растянется на всю ширину родителя и сохранит нужное соотношение сторон. Поддерживается во всех актуальных браузерах. Это базовый минимум — используйте его как основу для всех остальных способов.

Способ 3 — Приватный режим

По умолчанию YouTube ставит куки при загрузке плеера — даже если пользователь просто прокрутил мимо, не нажав Play. Для европейских пользователей это может означать нарушение GDPR, а для остальных — лишние данные, которые Google собирает о посетителях вашего сайта. Исправить это просто: замените в ссылке youtube.com на youtube-nocookie.com :

<!-- Обычный режим — куки и трекинг с момента загрузки плеера -->
src="https://www.youtube.com/embed/VIDEO_ID"

<!-- Приватный режим — куки только если пользователь нажал Play -->
src="https://www.youtube-nocookie.com/embed/VIDEO_ID"

Видео работает абсолютно так же. Одно слово в URL — и всё. Хорошая привычка использовать приватный режим по умолчанию, даже если юридических обязательств нет.

Параметры плеера

URL плеера можно расширить параметрами — они добавляются после знака ? и разделяются символом & . Вот самые полезные:

<!-- ? — первый параметр, & — каждый следующий -->
src="https://www.youtube-nocookie.com/embed/VIDEO_ID?autoplay=1&mute=1&start=30"
  • autoplay=1 — автовоспроизведение
  • mute=1 — без звука
  • start=30 — начать с 30-й секунды
  • end=90 — остановить на 90-й секунде
  • controls=0 — скрыть панель управления
  • loop=1 — зациклить видео
  • rel=0 — не показывать похожие видео в конце
Автовоспроизведение со звуком заблокировано в большинстве браузеров — это сделано специально, чтобы сайты не орали на пользователей с первой же секунды. Если нужен autoplay=1 — обязательно добавляйте mute=1, иначе видео просто не запустится.

Способ 4 — Фасад: страница грузится мгновенно

Все предыдущие способы имеют один общий недостаток: iframe загружается при открытии страницы, даже если пользователь никогда не нажмёт Play. YouTube несёт с собой около 500 КБ скриптов и несколько сетевых запросов — больше, чем многие сайты целиком. Особенно больно, если видео на странице несколько.

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

Вот живой пример — нажмите на превью:

YouTube видео — нажмите для воспроизведения
Нажмите, чтобы воспроизвести

В примере — классика интернета. Разумеется, замените dQw4w9WgXcQ на ID своего видео.

Разберём код по частям. Начнём с HTML:

<div class="yt-facade" data-id="VIDEO_ID">

    <!-- Превью: YouTube отдаёт thumbnail по шаблону URL — загружать самому не нужно -->
    <img class="yt-facade__thumb" src="https://i.ytimg.com/vi/VIDEO_ID/maxresdefault.jpg" alt="Название видео" loading="lazy" />

    <!-- Тёмный градиент снизу — для красоты -->
    <div class="yt-facade__gradient"></div>

    <!-- Кнопка Play — aria-label делает её доступной для скринридеров -->
    <button class="yt-facade__play" aria-label="Воспроизвести">
        <svg class="yt-facade__icon" viewBox="0 0 68 48" xmlns="http://www.w3.org/2000/svg">
            <path d="M66.5 7.7a8.5 8.5 0 0 0-6-6C56.1 0 34 0 34 0S11.9 0 7.5 1.7a8.5 8.5 0 0 0-6 6C0 12.1 0 24 0 24s0 11.9 1.5 16.3a8.5 8.5 0 0 0 6 6C11.9 48 34 48 34 48s22.1 0 26.5-1.7a8.5 8.5 0 0 0 6-6C68 35.9 68 24 68 24s0-11.9-1.5-16.3z" fill="#ff0000"/>
            <path d="M27 34l18-10-18-10v20z" fill="#fff"/>
        </svg>
    </button>

    <span class="yt-facade__hint">Нажмите, чтобы воспроизвести</span>
</div>

CSS:

.yt-facade {
    position: relative;
    cursor: pointer;
    border-radius: 14px;
    overflow: hidden;
    background: #0a0a0a;
    aspect-ratio: 16 / 9;
    width: 100%;
    box-shadow: 0 8px 40px rgba(0,0,0,.45);
    transition: box-shadow .3s, transform .3s;
}
.yt-facade:hover {
    box-shadow: 0 16px 56px rgba(0,0,0,.6);
    transform: translateY(-2px);
}

/* Превью — заполняет весь контейнер, на ховере приближается и темнеет */
.yt-facade__thumb {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform .5s ease, filter .35s ease;
    display: block;
}
.yt-facade:hover .yt-facade__thumb {
    transform: scale(1.05);
    filter: brightness(.55);
}

/* Тёмный градиент снизу — помогает кнопке читаться на светлых превью */
.yt-facade__gradient {
    position: absolute;
    inset: 0;
    background: linear-gradient(to top, rgba(0,0,0,.6) 0%, transparent 50%);
    pointer-events: none;
}

/* Кнопка Play — центрирована через flex */
.yt-facade__play {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
}
.yt-facade__icon {
    width: 76px;
    height: 54px;
    filter: drop-shadow(0 3px 12px rgba(0,0,0,.6));
    transition: transform .25s ease;
}
.yt-facade:hover .yt-facade__icon {
    transform: scale(1.15);
}

/* Подсказка, появляется снизу при наведении */
.yt-facade__hint {
    position: absolute;
    bottom: 18px;
    left: 20px;
    color: rgba(255,255,255,.9);
    font-size: 13px;
    font-family: sans-serif;
    opacity: 0;
    transform: translateY(8px);
    transition: opacity .3s, transform .3s;
    pointer-events: none;
}
.yt-facade:hover .yt-facade__hint {
    opacity: 1;
    transform: translateY(0);
}

/* iframe заменяет всё содержимое после клика */
.yt-facade iframe {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    border: none;
}

JavaScript:

document.querySelectorAll('.yt-facade').forEach(function(el) {
    el.addEventListener('click', function() {
        var id     = el.dataset.id;           // ID видео из data-атрибута
        var iframe = document.createElement('iframe');

        // autoplay=1 — видео стартует сразу после клика, не нужно нажимать Play повторно
        // rel=0 — в конце не показываем «похожие видео» с чужих каналов
        iframe.src = 'https://www.youtube-nocookie.com/embed/' + id
                   + '?autoplay=1&rel=0';
        iframe.title          = 'YouTube видео';
        iframe.allow          = 'accelerometer; autoplay; clipboard-write; '
                              + 'encrypted-media; gyroscope; picture-in-picture';
        iframe.allowFullscreen = true;

        el.innerHTML = '';                    // убираем превью и кнопку
        el.appendChild(iframe);              // ставим на их место iframe
    });
});

Всего ~18 строк без единой зависимости. Превью YouTube отдаёт сам по известному шаблону i.ytimg.com/vi/VIDEO_ID/maxresdefault.jpg — никаких отдельных загрузок. Плеер появляется только по клику, а autoplay=1 запускает видео сразу, чтобы пользователь не нажимал Play дважды.

Если не хочется писать CSS самому — есть готовый веб-компонент lite-youtube-embed от разработчика Google Chrome. Подключите один файл, используйте тег <lite-youtube videoid="VIDEO_ID"> — и получите оптимизированный фасад с хорошим дефолтным стилем.

Итого: как встроить YouTube видео на сайт

Четыре способа на любой случай:

  • Базовый iframe — когда нужно быстро и требований нет.
  • Адаптивный embed — обязательный минимум для любого адаптивного сайта.
  • Приватный режим — хорошая привычка: одно слово в URL, работает так же.
  • Параметры плеера — тонкая настройка поведения и внешнего вида плеера.
  • Фасад — если важна скорость загрузки или видео на странице несколько.

Оптимальный вариант для большинства случаев — адаптивный embed в приватном режиме, плюс нужные параметры. Если же страница грузится медленно или видео несколько — фасад даст заметный прирост без какого-либо ущерба для пользователя.

Ведёте канал сразу на двух площадках? Посмотрите также статью про вставку видео с Rutube — подходы те же, но есть свои нюансы.

Вам может быть интересно:
CSS псевдокласс :is() — группировка селекторов в одно правило
CSS псевдокласс :is() — как и где его использовать
Меш градиент CSS — сетчатый фон из нескольких radial-gradient
Как сделать меш градиент в CSS — Mesh gradient генератор
Вставка видео с Rutube на сайт — iframe и адаптивный embed
Как правильно вставить видео с RuTube на сайт
Полоса прокрутки страницы на CSS — пример готового индикатора
Как убрать или стилизовать полосу прокрутки — CSS скроллбар
Комментарии 0 Разные мнения приветствуются. Здесь можно спорить и обсуждать, но уважительно и без токсичности.
Отмена