HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#Руководства</a></p>
1 <p><a>#Руководства</a></p>
2 <ul><li>8 сен 2020</li>
2 <ul><li>8 сен 2020</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Разбираемся, как реализовать одну из самых важных функций любого видеохостинга.</p>
4 </ul><p>Разбираемся, как реализовать одну из самых важных функций любого видеохостинга.</p>
5 <p> vlada_maestro / shutterstock</p>
5 <p> vlada_maestro / shutterstock</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
6 <p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7 <p>Трудно найти видеохостинг, где нельзя увидеть примерное содержание ролика, не смотря его. Вы наводите курсор на превью, и на его месте появляется небольшой фрагмент самого видео. Вот как это выглядит на YouTube:</p>
7 <p>Трудно найти видеохостинг, где нельзя увидеть примерное содержание ролика, не смотря его. Вы наводите курсор на превью, и на его месте появляется небольшой фрагмент самого видео. Вот как это выглядит на YouTube:</p>
8 <em>Трэш из трендов YouTube. Не для слабонервных</em><p>Давайте разберёмся, как сделать так же на своём сайте.</p>
8 <em>Трэш из трендов YouTube. Не для слабонервных</em><p>Давайте разберёмся, как сделать так же на своём сайте.</p>
9 <p>Для начала рекомендую прочесть нашу<a>статью о создании плеера на HTML5 и JS</a>.</p>
9 <p>Для начала рекомендую прочесть нашу<a>статью о создании плеера на HTML5 и JS</a>.</p>
10 <p>Далее нам понадобится подготовить все файлы:</p>
10 <p>Далее нам понадобится подготовить все файлы:</p>
11 <ul><li><strong>Само видео.</strong>Я записал стартовый ролик из игры Metro: Last Light.</li>
11 <ul><li><strong>Само видео.</strong>Я записал стартовый ролик из игры Metro: Last Light.</li>
12 <li><strong>Превью-ролик.</strong>Из видео я вырезал трёхсекундный фрагмент и уменьшил его разрешение до 640×360 пикселей. В итоге получился файл весом в 500 кб. Чем меньше превью, тем быстрее оно загрузится.</li>
12 <li><strong>Превью-ролик.</strong>Из видео я вырезал трёхсекундный фрагмент и уменьшил его разрешение до 640×360 пикселей. В итоге получился файл весом в 500 кб. Чем меньше превью, тем быстрее оно загрузится.</li>
13 <li><strong>Постер.</strong>Подойдёт любая картинка. В нашем случае - скриншот того же Metro.</li>
13 <li><strong>Постер.</strong>Подойдёт любая картинка. В нашем случае - скриншот того же Metro.</li>
14 </ul><p>Все исходники, включая эти файлы, можно найти в <a>репозитории проекта на GitHub</a>.</p>
14 </ul><p>Все исходники, включая эти файлы, можно найти в <a>репозитории проекта на GitHub</a>.</p>
15 <p>Наш проект состоит из двух страниц:</p>
15 <p>Наш проект состоит из двух страниц:</p>
16 <ol><li><em><strong>index.html.</strong></em><strong></strong>Здесь отображается список роликов на сайте.</li>
16 <ol><li><em><strong>index.html.</strong></em><strong></strong>Здесь отображается список роликов на сайте.</li>
17 <li><em><strong>full.html.</strong></em>С помощью этого файла открывается плеер с полной версией видео, как только по нему был сделан клик.</li>
17 <li><em><strong>full.html.</strong></em>С помощью этого файла открывается плеер с полной версией видео, как только по нему был сделан клик.</li>
18 </ol><p>Начнём с главной страницы. На ней просто добавим несколько раз один и тот же блок:</p>
18 </ol><p>Начнём с главной страницы. На ней просто добавим несколько раз один и тот же блок:</p>
19 &lt;a href="full.html" class="item"&gt; &lt;div class="item__content"&gt; &lt;video src="videos/metro1_thumb.mp4" poster="images/metro1_thumb.jpg" loop class="item__thumb" muted&gt;&lt;/video&gt; &lt;div class="item__text"&gt;Metro: Last Light&lt;/div&gt; &lt;/div&gt; &lt;/a&gt;<p>Весь блок - это область ссылки, при нажатии на которую откроется страница<em>full.html</em>. Внутри блока - превью и название ролика. В качестве превью мы указали элемент<em>video</em>со следующими параметрами:</p>
19 &lt;a href="full.html" class="item"&gt; &lt;div class="item__content"&gt; &lt;video src="videos/metro1_thumb.mp4" poster="images/metro1_thumb.jpg" loop class="item__thumb" muted&gt;&lt;/video&gt; &lt;div class="item__text"&gt;Metro: Last Light&lt;/div&gt; &lt;/div&gt; &lt;/a&gt;<p>Весь блок - это область ссылки, при нажатии на которую откроется страница<em>full.html</em>. Внутри блока - превью и название ролика. В качестве превью мы указали элемент<em>video</em>со следующими параметрами:</p>
20 <ul><li>src - путь к файлу.</li>
20 <ul><li>src - путь к файлу.</li>
21 <li>poster - путь к изображению.</li>
21 <li>poster - путь к изображению.</li>
22 <li>loop - указатель на то, что ролик зациклен.</li>
22 <li>loop - указатель на то, что ролик зациклен.</li>
23 <li>class - класс.</li>
23 <li>class - класс.</li>
24 <li>muted - говорим, что ролик должен воспроизводиться без звука. Для уменьшения размера файла звук можно вырезать вообще.</li>
24 <li>muted - говорим, что ролик должен воспроизводиться без звука. Для уменьшения размера файла звук можно вырезать вообще.</li>
25 </ul><p>Теперь добавим стили:</p>
25 </ul><p>Теперь добавим стили:</p>
26 .item { color: #111; display: inline-block; vertical-align: top; } .item__content { padding: 5px; } .item__thumb { width: 350px; } .item__text { font-size: 16pt; } .item:hover { text-decoration: none; }<p>Можно проверить, как выглядит страница в браузере:</p>
26 .item { color: #111; display: inline-block; vertical-align: top; } .item__content { padding: 5px; } .item__thumb { width: 350px; } .item__text { font-size: 16pt; } .item:hover { text-decoration: none; }<p>Можно проверить, как выглядит страница в браузере:</p>
27 <p>Вёрстка для страницы с полной версией ещё проще:</p>
27 <p>Вёрстка для страницы с полной версией ещё проще:</p>
28 &lt;div&gt; &lt;video src="videos/metro1.mp4" poster="images/metro1_thumb.jpg" controls class="video"&gt;&lt;/video&gt; &lt;div class="item__text"&gt;Metro: Last Light&lt;/div&gt; &lt;/div&gt;<p>Вот как выглядит плеер:</p>
28 &lt;div&gt; &lt;video src="videos/metro1.mp4" poster="images/metro1_thumb.jpg" controls class="video"&gt;&lt;/video&gt; &lt;div class="item__text"&gt;Metro: Last Light&lt;/div&gt; &lt;/div&gt;<p>Вот как выглядит плеер:</p>
29 <p>Теперь остаётся только подключить скрипт.</p>
29 <p>Теперь остаётся только подключить скрипт.</p>
30 //Создаём переменную, где будут находиться наши превью let videos; //Запускаем функцию, которая найдёт все видео на странице и добавит обработчики событий Init(); function Init() { //Получаем видео videos = document.getElementsByClassName("item__thumb"); for(var i = 0; i &lt; videos.length; i++) { //Добавляем обработчик события наведения мыши videos[i].addEventListener("mouseenter", function(e) { MouseEnter(e.target); }); //Добавляем обработчик события выхода курсора за границы элемента videos[i].addEventListener("mouseleave", function(e) { MouseLeave(e.target); }); } } //Если мышь наведена, просто запускаем ролик function MouseEnter(e) { e.play(); } //Если курсор выходит за пределы элемента, то мы сначала ставим видео на паузу //А потом перезагружаем его, чтобы отобразился постер function MouseLeave(e) { e.pause(); e.load(); }<p>Такого небольшого кода достаточно, чтобы всё работало. Остаётся только проверить. Обратите внимание, что ваш браузер может запретить сайту воспроизводить аудио или видео с помощью скриптов.</p>
30 //Создаём переменную, где будут находиться наши превью let videos; //Запускаем функцию, которая найдёт все видео на странице и добавит обработчики событий Init(); function Init() { //Получаем видео videos = document.getElementsByClassName("item__thumb"); for(var i = 0; i &lt; videos.length; i++) { //Добавляем обработчик события наведения мыши videos[i].addEventListener("mouseenter", function(e) { MouseEnter(e.target); }); //Добавляем обработчик события выхода курсора за границы элемента videos[i].addEventListener("mouseleave", function(e) { MouseLeave(e.target); }); } } //Если мышь наведена, просто запускаем ролик function MouseEnter(e) { e.play(); } //Если курсор выходит за пределы элемента, то мы сначала ставим видео на паузу //А потом перезагружаем его, чтобы отобразился постер function MouseLeave(e) { e.pause(); e.load(); }<p>Такого небольшого кода достаточно, чтобы всё работало. Остаётся только проверить. Обратите внимание, что ваш браузер может запретить сайту воспроизводить аудио или видео с помощью скриптов.</p>
31 <em>Пример из браузера Mozilla Firefox</em><p>Разрешите автовоспроизведение и проверьте код:</p>
31 <em>Пример из браузера Mozilla Firefox</em><p>Разрешите автовоспроизведение и проверьте код:</p>
32 <p>Главный минус такого способа создания превью - необходимость вырезать отдельный ролик. Впрочем, всё можно сделать автоматическим, но это уже задача для backend-разработчиков.</p>
32 <p>Главный минус такого способа создания превью - необходимость вырезать отдельный ролик. Впрочем, всё можно сделать автоматическим, но это уже задача для backend-разработчиков.</p>
33 <a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>
33 <a>Научитесь: Профессия Фронтенд-разработчик + ИИ Узнать больше</a>