Skip to content

Commit 49a4a68

Browse files
authored
Merge pull request #7 from deeppines/dev
minor update
2 parents cee7037 + 5fcf569 commit 49a4a68

File tree

7 files changed

+190
-84
lines changed

7 files changed

+190
-84
lines changed

.markdownlint.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
{
22
"MD002": false,
3-
"MD033": false
3+
"MD033": false,
4+
"line-length": {
5+
"line_length": 120,
6+
"code_blocks": false
7+
}
48
}

_includes/filter.html

Lines changed: 0 additions & 5 deletions
This file was deleted.

_includes/header.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<header class="header header_background header_glass txt-xs-center">
2-
{% include filter.html %}
2+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
3+
<filter id="glass-filter">
4+
<feGaussianBlur stdDeviation="5"></feGaussianBlur>
5+
</filter>
6+
</svg>
37
<div class="avatar avatar_center">
48
<img class="avatar__img" src="/images/avatar.jpg" alt="deeppines">
59
</div>

_posts/2016-10-03-youtube-video-in-modal-window.md

Lines changed: 156 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -9,67 +9,141 @@ categories: js
99

1010
## Разметка модального окна
1111

12-
В качестве модального окна для примера возьмем стандартное модальное окно
13-
Bootstrap 3, но слегка изменим его убрав некоторые лишние части.
12+
Для разметки будем использовать шаблонизатор [Pug][pug]
13+
и напишем небольшой миксин для кнопки, а в качестве модального окна для примера
14+
будем использовать стандартный компонент [Bootstrap 4][bootstrap4].
15+
16+
На случай если нет времени разбираться с использованием шаблонизатора
17+
я продублирую код на HTML.
18+
19+
### Pug mixin
20+
21+
Итак, наш миксин будет состоять из кнопки и превью картинки внутри.
22+
Превью мы будем брать непосредственно из видео с помощью ссылки -
23+
`src="https://img.youtube.com/vi/#id/maxresdefault.jpg`.
24+
25+
Вместо `#id` необходимо подставить код видео Youtube формата - `c7nRTF2SowQ`.
26+
Так же данная ссылка имеет несколько вариантов изображений:
27+
28+
* `default.jpg` - 120x90px
29+
* `mqdefault.jpg` - 320x180px
30+
* `hqdefault.jpg` - 480x360px
31+
* `sddefault.jpg` - 640x480px
32+
* `maxresdefault.jpg` - максимальное качество.
33+
34+
Для удобства демонстрации я немного отформатирую код:
35+
36+
{% highlight pug %}
37+
mixin videoButton(modal, src, title)
38+
button(
39+
type="button"
40+
data-toggle="modal"
41+
data-target=`#${modal}`
42+
data-src=`${src}`
43+
data-title=`${title}`
44+
class="js-play"
45+
).btn.p-0
46+
img(
47+
src=`https://img.youtube.com/vi/${src}/maxresdefault.jpg`
48+
alt=`${title}`
49+
).card-img-top
50+
{% endhighlight %}
51+
52+
В миксин будет передаваться три параметра:
53+
54+
* `modal` - `id` модального окна в котором будет выводиться видео.
55+
* `src` - `id` Youtube видео.
56+
* `title` - Название видео.
57+
58+
Так же необходим специальный класс `js-play` который будет использовать наш скрипт.
59+
При желании его можно сделать параметром, если вам это необходимо.
60+
Остальные классы в примере используются только для визуального отображения и
61+
могут быть заменены или неиспользоваться вовсе.
62+
63+
Вызов миксина будет выглядеть так:
64+
65+
{% highlight pug %}
66+
+videoButton(
67+
'modalVideo',
68+
'c7nRTF2SowQ',
69+
'Официальный анонс-трейлер Battlefield 1'
70+
)
71+
{% endhighlight %}
72+
73+
Для удобства чтения я немного отформатирую получившийся HTML код кнопки
74+
и в итоге он будет выглядеть так:
1475

1576
{% highlight html %}
16-
<!-- Button trigger modal -->
17-
<button type="button" class="btn btn-primary playYoutube" data-toggle="modal"
18-
data-target="#video" data-src="c7nRTF2SowQ">
19-
Launch video 1
20-
</button>
21-
<button type="button" class="btn btn-primary playYoutube" data-toggle="modal"
22-
data-target="#video" data-src="Sr-DKyAVU34">
23-
Launch video 2
77+
<button
78+
class="btn p-0 js-play"
79+
type="button"
80+
data-toggle="modal"
81+
data-target="#modalVideo"
82+
data-src="c7nRTF2SowQ"
83+
data-title="Официальный анонс-трейлер Battlefield 1">
84+
<img
85+
class="card-img-top"
86+
src="https://img.youtube.com/vi/c7nRTF2SowQ/maxresdefault.jpg"
87+
alt="Официальный анонс-трейлер Battlefield 1"/>
2488
</button>
89+
{% endhighlight %}
90+
91+
### Модальное окно
92+
93+
Разметка на Pug будет выглядеть так:
94+
95+
{% highlight pug %}
96+
div(tabindex="-1" role="dialog" aria-hidden="true")#modalVideo.modal.fade
97+
div(role="document").modal-dialog.modal-lg.modal-dialog-centered
98+
.modal-content
99+
.modal-header
100+
h5.modal-title.js-title-insert
101+
button(type="button" data-dismiss="modal" aria-label="Close").close.js-pause
102+
span(aria-hidden="true") &times;
103+
.modal-body.px-0.py-0
104+
.embed-responsive.embed-responsive-16by9
105+
#youTubeIframe.embed-responsive-item
106+
{% endhighlight %}
107+
108+
Тут нас интересует всего четыре вещи:
109+
110+
* `#modalVideo` - `id` модального окна, оно должно совпадать с тем что вы
111+
передаете в миксин или указываете в параметре `data-target`.
112+
* `js-title-insert` - класс для вставки названия видео в шапку модального окна.
113+
* `js-pause` - класс для кнопки закрытия модального окна.
114+
* `#youTubeIframe` - `id` контейнера который будет преобразован в `iframe`.
115+
116+
Для того, что бы видео было адаптивным так же будет полезно
117+
добавить обертку `.embed-responsive.embed-responsive-16by9`
118+
и класс `.embed-responsive-item`, если вы используете Bootstrap,
119+
или написать свои классы.
120+
121+
Сгенерированный HTML будет выглядеть так:
25122

26-
<!-- Video Modal -->
27-
<!-- Modal -->
28-
<div class="modal fade modal-video" id="video" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
29-
<div class="modal-dialog" role="document">
123+
{% highlight html %}
124+
<div class="modal fade" tabindex="-1" role="dialog" aria-hidden="true" id="modalVideo">
125+
<div class="modal-dialog modal-lg modal-dialog-centered" role="document">
30126
<div class="modal-content">
31-
<div class="modal-body">
32-
<!-- 16:9 aspect ratio -->
127+
<div class="modal-header">
128+
<h5 class="modal-title js-title-insert"></h5>
129+
<button class="close js-pause" type="button" data-dismiss="modal" aria-label="Close">
130+
<span aria-hidden="true">&times;</span>
131+
</button>
132+
</div>
133+
<div class="modal-body px-0 py-0">
33134
<div class="embed-responsive embed-responsive-16by9">
34-
<div id="Youtube" class="embed-responsive-item"></div>
135+
<div class="embed-responsive-item" id="youTubeIframe"></div>
35136
</div>
36137
</div>
37-
<div class="modal-footer">
38-
<button type="button" class="close pauseYoutube" data-dismiss="modal"
39-
aria-label="Close"><span aria-hidden="true">&times;</span></button>
40-
</div>
41138
</div>
42139
</div>
43140
</div>
44-
<!-- /Video Modal -->
45141
{% endhighlight %}
46142

47-
В данном коде нас интересует шесть пунктов:
48-
49-
* класс для кнопки открытия модального окна - <code>class="playYoutube"</code>
50-
* дата атрибут - <code>data-src</code>
51-
* дата атрибут - <code>data-target</code>
52-
* id модального окна - <code>id="video"</code>
53-
* id контейнера для видео - <code>id="Youtube"</code>
54-
* класс кнопки закрытия модальки - <code>class="pauseYoutube"</code>
55-
56-
<code>class="playYoutube"</code> - необходим для того что бы по клику на кнопку
57-
видео загружалось в модаль.
58-
59-
<code>data-src</code> - содержит код видео с youtube, которое будет загружаться
60-
по нажатию кнопки.
61-
62-
<code>data-target</code> - должен совпадать с id модального окна.
63-
64-
<code>id="Youtube"</code> - указывает на элемент который превратиться
65-
в iframe с видео. Для его адаптивности добавлена обертка и класс embed-responsive-item.
66-
67-
<code>class="pauseYoutube"</code> - указывает на кнопку при нажатии на которую
68-
модальное окно закроется, а видео встанет на паузу.
69-
70143
## Подключение скрипта
71144

72-
Для того что бы скрипт заработал для начала нужно подключить скрипт YoutubeAPI.
145+
Для того что бы скрипт заработал для начала
146+
нужно подключить [YouTube Player API][youtubeapi].
73147
Для этого достаточно вставить внизу страницы строчку:
74148

75149
{% highlight html %}
@@ -78,36 +152,48 @@ Launch video 2
78152
{% endhighlight %}
79153

80154
После этого можно размещать основной скрипт:
155+
81156
{% highlight js %}
82-
var player,
83-
youtube = 'Youtube', //iframe id
84-
btnPlay = '.playYoutube', // btn id or class
85-
btnPause = '.pauseYoutube', // pause btn id or class
86-
modalId = '#video', // Modal id
87-
lastButton = '';
157+
var player;
158+
var lastButton = '';
159+
const youtube = 'youTubeIframe';
160+
const titleInsert = '.js-title-insert';
161+
const btnPlay = '.js-play';
162+
const btnPause = '.js-pause';
163+
const modalId = '#modalVideo';
164+
const videoQuality = 'hd720';
88165

89166
function onYouTubePlayerAPIReady() {
90167
player = new YT.Player(youtube, {
168+
controls: 2,
169+
iv_load_policy: 3,
170+
rel: 0,
91171
events: {
92-
'onReady': onPlayerReady
172+
onReady: onPlayerReady
93173
}
94174
});
95175
}
96176

97177
function onPlayerReady(event) {
98-
$(btnPlay).on("click", function() {
99-
var videoId = $(this).attr("data-src");
178+
'use strict';
179+
$(btnPlay).on('click', function() {
180+
var videoId = $(this).attr('data-src');
181+
100182
if (lastButton == videoId) {
101-
player.playVideo(videoId);
183+
$(titleInsert).text($(this).attr('data-title'));
184+
player.playVideo(videoId, 0, videoQuality);
102185
} else {
103-
player.loadVideoById(videoId);
186+
$(titleInsert).text($(this).attr('data-title'));
187+
player.loadVideoById(videoId, 0, videoQuality);
104188
lastButton = videoId;
105189
}
106190
});
107-
$(btnPause).on("click", function() {
191+
192+
$(btnPause).on('click', function() {
108193
player.pauseVideo();
109194
});
110-
$(modalId).on("click", function() {
195+
196+
$(modalId).on('click', function() {
111197
player.pauseVideo();
112198
});
113199
}
@@ -118,12 +204,17 @@ function onPlayerReady(event) {
118204
Небольшой пример с двумя кнопками. При нажатии на первую кнопку видео
119205
загружается, жмем на крестик - видео встает на паузу и при повторном нажатии
120206
на первую кнопку воспроизведение продолжается с того места на котором было
121-
закрыто окно, а при нажатии на кнопку два грузится новое видео.
207+
закрыто окно, а при нажатии на вторую кнопку грузится новое видео.
122208

123209
<p data-height="485" data-theme-id="0" data-slug-hash="KgvGpN"
124-
data-default-tab="html,result" data-user="lucaskane" data-embed-version="2"
125-
class="codepen">See the Pen <a href="http://codepen.io/lucaskane/pen/KgvGpN/">
210+
data-default-tab="result" data-user="deeppines" data-embed-version="2"
211+
data-pen-title="Youtube video on modal popup." class="codepen">
212+
See the Pen <a href="https://codepen.io/deeppines/pen/KgvGpN/">
126213
Youtube video on modal popup.</a> by Lucas Kane
127-
(<a href="http://codepen.io/lucaskane">@lucaskane</a>) on
128-
<a href="http://codepen.io">CodePen</a>.</p>
129-
<script async src="//assets.codepen.io/assets/embed/ei.js"></script>
214+
(<a href="https://codepen.io/deeppines">@deeppines</a>) on
215+
<a href="https://codepen.io">CodePen</a>.</p>
216+
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
217+
218+
[pug]: https://pugjs.org/api/getting-started.html
219+
[bootstrap4]: https://getbootstrap.com/docs/4.0/components/modal/
220+
[youtubeapi]: https://developers.google.com/youtube/iframe_api_reference

_sass/_common.scss

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,13 @@ body {
2222
max-width: 960px;
2323
min-height: calc(100% - 50px);
2424
margin: 25px auto;
25-
background: transparent;
25+
background-color: $background-body;
2626
box-shadow: 0 5px 15px 1px transparentize($black, .7);
2727

28-
// Large devices (desktops, less than 1200px)
29-
@media (max-width: 1199px) {
30-
transition: max-width .4s;
31-
max-width: 960px;
32-
}
33-
3428
// Medium devices (tablets, less than 992px)
3529
@media (max-width: 991px) {
3630
transition: max-width .4s;
3731
max-width: 720px;
38-
margin: 30px auto;
3932
}
4033

4134
// Small devices (landscape phones, less than 768px)

_sass/core/_colors.scss

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,23 @@ $wight: #fff;
2020
$black: #000;
2121

2222
//== Brand colors
23-
//
2423
//## Brand colors for use on website
2524

2625
$gunmetal: #293241;
2726
$light-red-ochre: #EE6C4D;
2827
$purple-navy: #3D5A80;
2928
$pale-cerulian: #98C1D9;
3029
$light-cyan: #E0FBFC;
30+
31+
// Other colors
32+
33+
$background-body: #ebebeb;
34+
35+
// Pines color
36+
37+
$pines-red: #962d3e;
38+
$pines-blue: #118ab2;
39+
$pines-green: #589b71;
40+
$pines-yellow: #f0c808;
41+
42+

_sass/core/type/_setting.scss

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ html {
1414

1515
// Small devices (landscape phones, less than 768px)
1616
@media (max-width: 767px) {
17-
font-size: 88%;
17+
font-size: 87.5%;
1818
}
1919

2020
}
@@ -87,9 +87,16 @@ p {
8787

8888
// Code setting
8989

90-
code, kbd, samp {
90+
code,
91+
kbd,
92+
samp,
93+
var {
9194
font-family: $font-code;
92-
font-size: .9rem;
95+
font-size: 87.5%;
96+
}
97+
98+
code {
99+
color: $pines-green;
93100
}
94101

95102
// Link setting

0 commit comments

Comments
 (0)