@@ -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") × ;
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">×</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">×</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
89166function 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
97177function 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/ " >
126213Youtube 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
0 commit comments