Модальний блок відео на CSS3

47

Наочний приклад того, як можна організувати перегляд відео в модальному блоці, виключно засобами CSS3, без javascript і додаткових зображень в оформленні.
За основу взяв модальний на чистому CSS, кардинально нічого міняти не став, хіба що видозмінив кнопку закриття, ефект появи і фоновою заливку.

Для гумового макета модального блоку використовував ширину %. Відео помістив у вбудований div контейнер, з параметрами забезпечують гарантовану адаптивність відеоплеєра вставляється через iframe, object, або embed.

Модальный видео блок на CSS

Дивитися Демо

HTML

Фон затемнення представлений у вигляді окремого контейнера

, їли раптом вам знадобиться зробити так щоб модальний і шар затемнення закривалися по кліку поза вікна, використовуйте тег .
Для виклику модального видеоблока, так само як і у випадку з будь-яким модальним елементом, використовуємо стандартну посилання з унікальною адресою в атрибуті href відповідним ідентифікатором модального блоку. При використанні на одній сторінці кількох модальних блоків, просто не забувайте стежити за відповідністю цих значень, приблизно так:

Дивитися Відео

Дивитися Відео

Для відео ВКонтакте, параметри ширини і висоти iframe обов’язкові, і якщо вони не задані, то вбудовуються мінімальні значення автоматично при завантаженні сторінки з фреймами. Так що додавайте параметри width=”auto” height=”auto” у фрейм, або ж використовуйте найбільші допустимі значення, відеоблок автоматом підлаштується під розміри батьківського контейнера.

Це просто заголовок і короткий опис відео
Це просто заголовок і короткий опис відео

CSS

Всі стилі винесені в окремий файл, можете підключити його до сторінки або ж скопіювати вміст вставити в загальну таблицю стилів вашого сайту. Коментарі в коді, допоможуть вам розібратися, що до чого і навіщо))).

/** стилі тла затемнення **/
.overlay {
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 10000;
visibility: hidden;
/* фон затемнення */
background-color: rgba(0, 0, 0, 0.8);
opacity: 0;
position: fixed; /* фіксоване позиціонування */
/* трансформація прозорості при відкритті */
-webkit-transition: opacity .5s;
-moz-transition: opacity .5s;
-ms-transition: opacity .5s;
-o-transition: opacity .5s;
transition: opacity .5s;
}
/* активуємо при кліці */
.overlay:target {
visibility: visible;
opacity: 1;
}
/** стилі модального блоку */
.modal {
top: 0;
right: 0;
left: 0;
width: 50%;
z-index: 10001;
/** повна прозорість спочатку */
opacity: 0;
display: block;
visibility: hidden;
position: absolute;
/* трансформація прозорості при відкритті */
-webkit-transition: opacity 500ms ease-in;
-moz-transition: opacity 500ms ease-in;
transition: opacity 500ms ease-in;
margin: 0 auto;
padding: 24px;
min-width: 320px;
max-width: 1024px;
width: 100%;
border: 1px solid rgba(120,120,120,.7);
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
background: rgba(60, 63, 65, 0.9);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
-webkit-box-shadow: 0 0 13px 3px rgba(0,0,0,.5);
-moz-box-shadow: 0 0 13px 3px rgba(0,0,0,.5);
box-shadow: 0 0 13px 3px rgba(0,0,0,.5);
}
/* активуємо при кліці */
.overlay:target+.modal{
top: 15%;
visibility: visible;
opacity: 1;
}
/* планшет */
@media only screen and (min-width: 768px) and (max-width: 959px) {
.modal {
width: 95%;
}
}
/* смарт */
@media only screen and (min-width: 459px) and (max-width: 767px) {
.modal {
width:85%;
}
}
/* кнопка закриття */
.close {
position: absolute;
width: 30px;
height: 30px;
right: 18px;
top: 18px;
z-index: 999999;
cursor: pointer;
text-align: center;
text-decoration: none;
line-height: 26px;
}
@media (max-width: 530px) {
.close {
top: 6px;
}
}
.close:after {
content: 'X';
display:block;
width: 30px;
height: 30px;
-moz-border-radius: 50%;
-webkit-border-radius: 50%;
border-radius: 50%;
border: 2px solid #fff;
-moz-transition: all 0.6 s;
-webkit-transition: all 0.6 s;
transition: all 0.6 s;
-moz-transform: scale(0.85);
-ms-transform: scale(0.85);
-webkit-transform: scale(0.85);
transform: scale(0.85);
}
.close:hover:after {
transform: scale(1);
}
/* блок заголовка відео */
.video__title {
height: auto;
width: 70%;
padding: 0px 5px 15px 5px;
color: white;
font: normal 16px/22px 'Open Sans', Calibri, Arial, sans-serif;
}
@media (max-width: 530px) {
.video__title {
height: 38px;
font-size: 12px;
line-height: 18px;
}
}
/* адаптивний блок відео */
.video {
position: relative;
padding-bottom: 56.25%;
height: 0;
overflow:hidden;
}
.video iframe,
.video object,
.video embed {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
/* -- */

/** стилі тла затемнення **/
.overlay {
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 10000;
visibility: hidden;
/* фон затемнення */
background-color: rgba(0, 0, 0, 0.8);
opacity: 0;
position: fixed; /* фіксоване позиціонування */
/* трансформація прозорості при відкритті */
-webkit-transition: opacity .5s;
-moz-transition: opacity .5s;
-ms-transition: opacity .5s;
-o-transition: opacity .5s;
transition: opacity .5s;
}
/* активуємо при кліці */
.overlay:target {
visibility: visible;
opacity: 1;
}
/** стилі модального блоку */
.modal {
top: 0;
right: 0;
left: 0;
width: 50%;
z-index: 10001;
/** повна прозорість спочатку */
opacity: 0;
display: block;
visibility: hidden;
position: absolute;
/* трансформація прозорості при відкритті */
-webkit-transition: opacity 500ms ease-in;
-moz-transition: opacity 500ms ease-in;
transition: opacity 500ms ease-in;
margin: 0 auto;
padding: 24px;
min-width: 320px;
max-width: 1024px;
width: 100%;
border: 1px solid rgba(120,120,120,.7);
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
background: rgba(60, 63, 65, 0.9);
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
-webkit-box-shadow: 0 0 13px 3px rgba(0,0,0,.5);
-moz-box-shadow: 0 0 13px 3px rgba(0,0,0,.5);
box-shadow: 0 0 13px 3px rgba(0,0,0,.5);
}
/* активуємо при кліці */
.overlay:target+.modal{
top: 15%;
visibility: visible;
opacity: 1;
}
/* планшет */
@media only screen and (min-width: 768px) and (max-width: 959px) {
.modal {
width: 95%;
}
}
/* смарт */
@media only screen and (min-width: 459px) and (max-width: 767px) {
.modal {
width:85%;
}
}
/* кнопка закриття */
.close {
position: absolute;
width: 30px;
height: 30px;
right: 18px;
top: 18px;
z-index: 999999;
cursor: pointer;
text-align: center;
text-decoration: none;
line-height: 26px;
}
@media (max-width: 530px) {
.close {
top: 6px;
}
}
.close:after {
content: ‘X’;
display:block;
width: 30px;
height: 30px;
-moz-border-radius: 50%;
-webkit-border-radius: 50%;
border-radius: 50%;
border: 2px solid #fff;
-moz-transition: all 0.6 s;
-webkit-transition: all 0.6 s;
transition: all 0.6 s;
-moz-transform: scale(0.85);
-ms-transform: scale(0.85);
-webkit-transform: scale(0.85);
transform: scale(0.85);
}.close:hover:after {
transform: scale(1);
}
/* блок заголовка відео */
.video__title {
height: auto;
width: 70%;
padding: 0px 15px 5px 5px;
color: white;
font: normal 16px/22px ‘Open Sans’, Calibri, Arial, sans-serif;
}
@media (max-width: 530px) {
.video__title {
height: 38px;
font-size: 12px;
line-height: 18px;
}
}
/* адаптивний блок відео */
.video {
position: relative;
padding-bottom: 56.25%;
height: 0;
overflow:hidden;
}
.video iframe,
.video object,
.video embed {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
/* — */

При перегляді демо, спробуйте змінювати розмір вікна браузера і обов’язково включіть відео. При закритті модального блоку, програвання відеоролика зупиняється. Спосіб зупинки відео зовсім не «кошерний», просто використав посилання з порожнім атрибутом href=””(бачу, як перевертає небожителів з хабра), іншого більш дієвого і валідного рішення, без підключення js, на даний момент поки не знайшов.

Оновлення 19.02.2016:

З подачі NeedHate(велике йому спасибі), щоб закрити питання про припинення відтворення відео, після закриття модального вікна(що звичайно ж логічно), вирішив розписати запропонований ним спосіб з підключенням в роботу jQuery.
Метод відмінно спрацьовує для вбудованого відео з YouTube. У першу чергу, вам знадобиться підключити бібліотеку jQuery (якщо така у вас відсутнє), наприклад, з сервісу Google Code:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js">

Потім підключаєте YouTube JavaScript Player API:

<script type="text/javascript" src="http://www.youtube.com/player_api">

З допомогою JavaScript API, ви зможете управляти програвачем Chromeless Player і вбудованим програвачем YouTube за допомогою javaScript коду. Для нашого модального блоку з вбудованим відео, виконуваний js буде таким:

<script>
var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player('player');
}
$('#stop').click(function(){
player.stopVideo()
})

var player;
function onYouTubePlayerAPIReady() {
player = new YT.Player(‘player’);
}$(‘#stop’).click(function(){
player.stopVideo()
})

Далі, кадру(iframe) з відео, необхідно присвоїти ідентифікатор, нехай це буде id=”player”. Кнопці закриття модального вікна, так само прописуємо свій id:

<a href="#close" id="stop" title="Закрити" class="close"></a>

При кліку по кнопці з id=”stop” буде викликана функція player.stopVideo (), вікно закриється і відтворення відео зупиниться.
Демо дане рішення можете побачити на власні очі, архів з исходниками залишив як є.
Слід розуміти, що для інших відеосервісів і танці будуть іншими))).

ДемоИсходники

З Повагою, Андрій .

Буду всім вдячний, якщо підтримайте проект — додавши блог виключення AdBlock та поділіться посиланням на запис в своїх соціальних мережах: