Arm1.ru

HTML5 видео как фон страницы

HTML5 видео как фон страницы

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

1. Форматы видео

Март 2024: Уже все актуальные браузеры поддерживают и WebM, и H.264

В своё время, браузеры разделились на 2 лагеря - те, которые поддерживают H.264, и те, которые выступают за открытые форматы вроде OGG/Theora и WebM. Соответственно, нужно было хотя бы 2 версии видео.

H.264 поддерживают на апрель 2024:

HTML5 видео как фон страницы

WebM поддерживают на апрель 2024:

HTML5 видео как фон страницы

Как видим, и все десктопные браузеры (за исключением почившего IE), и актуальные мобильные браузеры, поддерживают оба формата. Выбирай любой. Но если хочется поддерживать старые версии (и мобильный Firefox для Android), которые поддерживают только один формат, то можно добавить видео и в H.264, и в WebM.

2. HTML и CSS

Код видео:

<div id="trailer" class="is_overlay">
    <video id="video" width="100%" height="auto" autoplay loop muted playsinline preload>
        <source src="book.mp4"></source>
        <source src="book.webm" type="video/webm"></source>
    </video>
</div>

И CSS:

.is_overlay{
    display: block;
    width: 100%;
    height: 100%;
}

#trailer {	
    position: fixed;
    top: 0; right: 0; bottom: 0; left: 0;
    overflow: hidden;
}

#trailer > video {
    position: absolute;
    top: 0; left: 0;
    width: 100%; height: 100%;
}

Собственно, этим кодом всё и сказано - div #trailer растягиваем на весь экран, внутри него наше видео, у него аттрибут autoplay, значит оно стартует сразу, как браузер решит, что уже можно начать играть, т.к. стоит preload="auto".

Получаем такую картинку:

HTML5 видео как фон страницы

Видим чёрные полосы по краям. Можно ещё для #trailer > video поменять CSS, чтобы их не было:

min-width: 100%;
min-height: 100%;
width: auto; height: auto;

Тогда мы получим видео на всю ширину:

HTML5 видео как фон страницы

Всё хорошо... Пока мы не изменим размер окна. Внезапно:

HTML5 видео как фон страницы

Тут нам на помощь приходят CSS Media Queries для управления пропорциями. Убираем добавленный на предыдущем шаге CSS-код и добавляем:

@media (min-aspect-ratio: 16/9) {
    #trailer > video { height: 300%; top: -100%; }
}

@media (max-aspect-ratio: 16/9) {
    #trailer > video { width: 300%; left: -100%; }
}

/* Если есть поддержка object-fit (Chrome/Chrome для Android, Safari в iOS 8 и Opera), используем его: */
@supports (object-fit: cover) {
    #trailer > video {
        top: 0; left: 0;
        width: 100%; height: 100%;
        object-fit: cover;
    }
}

Это позволяет нам при разных размерах размерах окна/экрана центровать видео.

HTML5 видео как фон страницы

HTML5 видео как фон страницы

Ну вот, красота. Теперь главную часть, текст, увидят все.

3. Мобильные браузеры

С мобильными браузерами сложности.

Internet Explorer на Windows Phone всё показывает и играет без нареканий, проигрывание стартует автоматически.

HTML5 видео как фон страницы

HTML5 видео как фон страницы

На iOS в Safari на март 2024 автопроигрывание работает при указании атрибута playsinline для тега video, но только, если не включён режим энергосбережения. Если он включён - то видео играть не будет.

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

// находим видео
const videoElement = document.getElementById("video");

// картинка, которой заменим видео
const poster = document.getElementById("poster"); 

if (videoElement === null || poster === null) {
    return;
}

const promise = videoElement.play();

if (promise !== undefined) {
    promise
        .catch(error => {
            // Автовоспроизведение не удалось
            if (error.name === "NotAllowedError") {
                // скрываем видео
                videoElement.style.display = 'none'; 
                
                // показываем картинку вместо видео
                poster.style.display = "block";
            }
        })
        .then(() => {
            // всё хорошо
            videoElement.play();
        });
} 

HTML5 видео как фон страницы

HTML5 видео как фон страницы

На марта 2024 автопроигрывание прекрасно работает на последних версиях Android. Но на всякий случай оставляю абзац ниже.

С Android тяжелее всего. Автопроигрывание не работает. Кнопка Play появляется только если добавить для тега video атрибут controls, чтобы появились стандартные контролы управления. Это, увы, не так уже красиво. Но это ещё не всё. Для того, чтобы видео начало играть, нужно ещё добавить дополнительно Javascript-обработчик, который принудительно скажет video, чтобы оно играло:

var video = document.getElementById(element);
video.addEventListener('click',function(){
    video.play();
},false);

Для определения Android, чтобы добавить атрибут controls, я просто использовал Detect.js:

var ua = detect.parse(navigator.userAgent);
if ( ua.os.family === 'Android' ) {
    video.setAttribute( 'controls','controls' );
}

HTML5 видео как фон страницы

HTML5 видео как фон страницы

Кроме того, чтобы это работало на Android, нельзя использовать атрибут type внутри source.

Такие вот дела. Итог с прелоадером тут.

keyboard_return back