Bootstrap 3 и Youtube в модале

118

Я пытаюсь использовать функцию Modal из Bootstrap 3, чтобы показать мое видео Youtube. Он работает, но я не могу нажимать на какие-либо кнопки в видео Youtube.

Любая помощь по этому поводу?

Здесь мой код:

<div id="link">My video</div>

<div id="myModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
            </div>
            <div class="modal-body">
                <iframe width="400" height="300" frameborder="0" allowfullscreen=""></iframe>
            </div>
        </div>
    </div>
</div>

<script src="/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="/jquery-1.10.1.min.js"><\/script>')</script>
<script src="//bootstrap.min.js"></script>
<script>
    $('#link').click(function () {
        var src = 'http://www.youtube.com/v/FSi2fJALDyQ&amp;autoplay=1';
        $('#myModal').modal('show');
        $('#myModal iframe').attr('src', src);
    });

    $('#myModal button').click(function () {
        $('#myModal iframe').removeAttr('src');
    });
</script>
Теги:
twitter-bootstrap-3
youtube

15 ответов

95
Лучший ответ

Я нашел эту проблему (или проблему, которую я нашел и описал в https://github.com/twbs/bootstrap/issues/10489), связанную с преобразованием (переводом) CSS3 в классе .modal.fade .modal-dialog.

В bootstrap.css вы найдете строки, показанные ниже:

.modal.fade .modal-dialog {
  -webkit-transform: translate(0, -25%);
      -ms-transform: translate(0, -25%);
          transform: translate(0, -25%);
  -webkit-transition: -webkit-transform 0.3s ease-out;
     -moz-transition: -moz-transform 0.3s ease-out;
       -o-transition: -o-transform 0.3s ease-out;
          transition: transform 0.3s ease-out;
}

.modal.in .modal-dialog {
  -webkit-transform: translate(0, 0);
      -ms-transform: translate(0, 0);
          transform: translate(0, 0);
}

Замена этих строк следующим образом покажет фильм правильно (в моем случае):

.modal.fade .modal-dialog {
  -webkit-transition: -webkit-transform 0.3s ease-out;
     -moz-transition: -moz-transform 0.3s ease-out;
       -o-transition: -o-transform 0.3s ease-out;
          transition: transform 0.3s ease-out;
}

.modal.in .modal-dialog {

}
  • 0
    Хорошее исправление, работает в Firefox на Mac.
  • 0
    Отличная работа, спасибо :)
29

Я собрал этот динамический видеоролик html/jQuery для видеороликов script, который автоматически воспроизводит видеоролик YouTube при нажатии кнопки триггера (ссылки), триггер также содержит ссылку для воспроизведения. script найдет собственный загрузочный модальный вызов и откроет общий модальный шаблон с данными из триггера. Смотрите ниже и дайте мне знать, что вы думаете. Мне бы хотелось услышать мысли...

HTML MODAL TRIGGER:

 <a href="#" class="btn btn-default" data-toggle="modal" data-target="#videoModal" data-theVideo="http://www.youtube.com/embed/loFtozxZG0s" >VIDEO</a>

HTML MODAL VIDEO TEMPLATE:

<div class="modal fade" id="videoModal" tabindex="-1" role="dialog" aria-labelledby="videoModal" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-body">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
        <div>
          <iframe width="100%" height="350" src=""></iframe>
        </div>
      </div>
    </div>
  </div>
</div>

ФУНКЦИЯ ЗАВЕТА:

//FUNCTION TO GET AND AUTO PLAY YOUTUBE VIDEO FROM DATATAG
function autoPlayYouTubeModal(){
  var trigger = $("body").find('[data-toggle="modal"]');
  trigger.click(function() {
    var theModal = $(this).data( "target" ),
    videoSRC = $(this).attr( "data-theVideo" ), 
    videoSRCauto = videoSRC+"?autoplay=1" ;
    $(theModal+' iframe').attr('src', videoSRCauto);
    $(theModal+' button.close').click(function () {
        $(theModal+' iframe').attr('src', videoSRC);
    });   
  });
}

ФУНКЦИОНАЛЬНЫЙ ВЫЗОВ:

$(document).ready(function(){
  autoPlayYouTubeModal();
});

FIDDLE: http://jsfiddle.net/jeremykenedy/h8daS/1/

  • 8
    Это связывает событие с кнопкой закрытия каждый раз, когда вы открываете модальное, а также вы должны использовать событие hidden.bs.modal как средство выключения видео, потому что пользователь может делать другие действия, чтобы закрыть модальное окно (например, щелкнуть вне этого).
  • 0
    Автозапуск противоречит условиям API YouTube. Только что приложение было отклонено с помощью веб-просмотра на рынке приложений для Android ...
Показать ещё 1 комментарий
11

У меня есть один совет для вас!

Я бы использовал:

$('#myModal').on('hidden.bs.modal', function () {
    $('#myModal iframe').removeAttr('src');
})

вместо:

$('#myModal button').click(function () {
    $('#myModal iframe').removeAttr('src');
});

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

10

Вот еще одно решение: Настроить видео youtube HTML5

Просто добавьте? html5 = 1 в исходный атрибут iframe, например:

<iframe src="http://www.youtube.com/embed/dP15zlyra3c?html5=1"></iframe>
  • 0
    Параметр html5 = 1 больше ничего не делает (больше). (Обратите внимание, что его даже нет в списке developers.google.com/youtube/player_parameters. )
7

Обнаружено это в другом потоке, и он отлично работает на рабочем столе и на мобильных устройствах - что не похоже на некоторые другие решения. Добавьте script в конец вашей страницы:

<!--Script stops video from playing when modal is closed-->
<script>
    $("#myModal").on('hidden.bs.modal', function (e) {
        $("#myModal iframe").attr("src", $("#myModal iframe").attr("src"));
    });
</script>   
3

Если вы не хотите редактировать загрузочный CSS или все вышеперечисленное не поможет вам вообще (например, в моем случае), есть простое исправление для запуска видео в модальном режиме на Firefox.

Вам просто нужно удалить класс "fade" из модального и, поскольку он также открывает класс "in":

$('#myModal').on('shown.bs.modal', function () {
    $('#myModal').removeClass('in');
});
  • 0
    Работает как шарм, спасибо!
3

Я решил его на шаблоне Wordpress:

$videoLink ="http://www.youtube.com/watch?v=yRuVYkA8i1o;".   
<?php
    parse_str( parse_url( $videoLink, PHP_URL_QUERY ), $my_array_of_vars );
    $youtube_ID = $my_array_of_vars['v'];    
?> 
<a class="video" data-toggle="modal" data-target="#myModal" rel="<?php echo $youtube_ID;?>">
    <img src="<?php bloginfo('template_url');?>/assets/img/play.png" />
</a>

<div class="modal fade video-lightbox" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">    
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
            </div>
            <div class="modal-body"></div>
        </div><!-- /.modal-content -->
    </div><!-- /.modal-dialog -->
</div><!-- /.modal -->

<script> 
    jQuery(document).ready(function ($) {
        var $midlayer = $('.modal-body');     
        $('#myModal').on('show.bs.modal', function (e) {
            var $video = $('a.video');
            var vid = $video.attr('rel');
            var iframe = '<iframe />';  
            var url = "//youtube.com/embed/"+vid+"?autoplay=1&autohide=1&modestbranding=1&rel=0&hd=1";
            var width_f = '100%';
            var height_f = 400;
            var frameborder = 0;
            jQuery(iframe, {
                name: 'videoframe',
                id: 'videoframe',
                src: url,
                width:  width_f,
                height: height_f,
                frameborder: 0,
                class: 'youtube-player',
                type: 'text/html',
                allowfullscreen: true
            }).appendTo($midlayer);   
        });

        $('#myModal').on('hide.bs.modal', function (e) {
            $('div.modal-body').html('');
        }); 
    });
</script>
0

Ok. Я нашел решение.

                             

                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">
                        <span aria-hidden="true">&times;</span><span class="sr-only">Close</span>
                    </button>
                    <h3 class="modal-title" id="modal-login-label">Capital Get It</h3>
                    <p>Log in:</p>
                </div>

                <div class="modal-body">

                    <h4>Youtube stuff</h4>



             <iframe src="//www.youtube.com/embed/lAU0yCDKWb4" allowfullscreen="" frameborder="0" height="315" width="100%"></iframe>       
             </div>


                </div>

            </div>
        </div>
    </div>
0

Bootstrap действительно предоставляет модальные всплывающие функции из коробки.

<link rel="stylesheet" href="//bootstrap.min.css" />
<script src="/jquery.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6///bootstrap.min.js"></script>

<a class="btn btn-primary" data-toggle="modal" href="#modal-video"><i class="fa fa-play"></i> watch video</a>
<div class="modal fade" id="modal-video" style="display: none;">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">close <i class="fa fa-times"></i></button>
      </div>
      <div class="modal-body">
        <iframe type="text/html" width="640" height="360" src="//www.youtube.com/embed/GShZUiyqEH0?rel=0?wmode=transparent&amp;fs=1&amp;rel=0&amp;enablejsapi=1&amp;version=3" frameborder="0" allowfullscreen=""></iframe>
        <p>Your video</p>
      </div>
    </div>
  </div>
</div>
0

У меня была эта же проблема - я только что добавил ссылки на шрифты - awesome cdn - комментируя загрузочный блок ниже, разрешил мою проблему.. действительно не устранил проблему, поскольку шрифт awesome все еще работал -

<link href="/bootstrap-combined.no-icons.min.css" rel="stylesheet">
0

user3084135 ответ хорошо работал как основа для меня, но мне также необходимо было включить:

  • Тег "видео" для локально размещенного видео, а также тег "iframe" для видео с внешним размещением.
  • Убедитесь, что источник удален, но модаль был отклонен.
  • Решение работало в ответном дизайне Bootstrap
  • Все видео автоматически воспроизводятся в модальном режиме
  • Возможны несколько модалов

Мое готовое решение выглядит так:

КНОПКА MODAL TRIGGER

<a href="#" class="portfolio-link" data-toggle="modal" data-frame="iframe" data-target="#portfolioModal1" data-theVideo="http://www.youtube.com/embed/xxxxxxxx">

Атрибут data-frame может быть "iframe" или "video", чтобы отобразить соответствующий тип тега: iframe для внешних видео, видео для локального размещения.

РЕПОНДОВЫЕ ВИДЕОДАТЕЛИ ВОДОПОДГОТОВКИ

плавающий фрейм:

<div align="center" class="embed-responsive embed-responsive-16by9">
  <iframe width="420" height="315" src="" frameborder="0" allowfullscreen></iframe>
</div>

видео:

<div align="center" class="embed-responsive embed-responsive-16by9">
    <video width="640" height="364" controls>
        <source src="" type="video/mp4">
        Your browser does not support the video tag.
    </video>                               
</div>

Они оба находятся в стандартных ответных модальных divs Bootstrap.

JQUERY SCRIPT

<script>
 $(document).ready(function(){
    function autoPlayModal(){
      var trigger = $("body").find('[data-toggle="modal"]');
      trigger.click(function() {
        var theFrame = $(this).data( "frame" );
        var theModal = $(this).data( "target" );
        videoSRC = $(this).attr( "data-theVideo" ); 
        if (theFrame == "iframe") {
          videoSRCauto = videoSRC+"?autoplay=1" ;
        } else {
          videoSRCauto = videoSRC;
          $("[id*=portfolioModal] video").attr('autoplay','true');
        }
        $(theModal+' '+ theFrame).attr('src', videoSRCauto); 
        $("[id*=portfolioModal]").on('hidden.bs.modal', function () {
            $("[id*=portfolioModal] "+ theFrame).removeAttr('src');
        })
      });
    }

  autoPlayModal();
});
</script>

Так как autoplay работает по-разному с iframe и видео тегами, условный используется для каждого. Чтобы разрешить несколько модалов, для их идентификации используется подстановочный знак (портфолиоModal1-6 в моем случае).

0

используя $('#introVideo').modal('show');, конфликтует с запуском бутстрапа. Когда вы нажмете на ссылку, которая открывает Modal, она закроется сразу после завершения анимации затухания. Просто удалите $('#introVideo').modal('show'); (используя bootstrap v3.3.2)

Вот мой код:

<link href="//bootstrap.min.css" rel="stylesheet">
<!-- triggering Link -->
<a id="videoLink" href="#0" class="video-hp" data-toggle="modal" data-target="#introVideo"><img src="img/someImage.jpg">toggle video</a>


<!-- Intro video -->
<div class="modal fade" id="introVideo" tabindex="-1" role="dialog" aria-labelledby="introductionVideo" aria-hidden="true">
  <div class="modal-dialog modal-lg">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      </div>
      <div class="modal-body">
        <div class="embed-responsive embed-responsive-16by9">
            <iframe class="embed-responsive-item allowfullscreen"></iframe>
        </div>
      </div>
    </div>
  </div>
</div>


<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4///bootstrap.min.js"> </script>

<script>
  //JS

$('#videoLink').click(function () {
    var src = 'https://www.youtube.com/embed/VI04yNch1hU;autoplay=1';
    // $('#introVideo').modal('show'); <-- remove this line
    $('#introVideo iframe').attr('src', src);
});


$('#introVideo button.close').on('hidden.bs.modal', function () {
    $('#introVideo iframe').removeAttr('src');
})
</script>
0
<a href="#" class="btn btn-default" id="btnforvideo" data-toggle="modal" data-target="#videoModal">VIDEO</a>

<div class="modal fade" id="videoModal" tabindex="-1" role="dialog" aria-labelledby="videoModal" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-body">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <div>
                    <iframe width="100%" height="315" src="https://www.youtube.com/embed/myvideocode" frameborder="0" allowfullscreen></iframe>
                </div>
            </div>
        </div>
    </div>
</div>
0

MMhh... Не могли бы вы разместить весь свой HTML-документ и какой браузер/версию использовать?

Я воссоздал вашу страницу и протестировал ее в трех браузерах (Chrome, FF, IE8). Я смог остановить и запустить потрясающий трейлер WDS4 без каких-либо проблем. Вот мой код:

<!DOCTYPE html>
<html>
  <head>
    <title>Bootstrap 101 Template</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- Bootstrap -->
    <link href="/bootstrap.min.css" rel="stylesheet" media="screen">

    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="../../assets/js/html5shiv.js"></script>
      <script src="/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
    <div id="link">My video</div>

    <div id="myModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content">

                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                </div>

                <div class="modal-body">
                    <iframe width="400" height="300" frameborder="0" allowfullscreen=""></iframe>
                </div>
            </div>
        </div>
    </div>

    <!-- jQuery (necessary for Bootstrap JavaScript plugins) -->
    <script src="/jq.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="/bootstrap.min.js"></script>
    <script>
    $('#link').click(function () {
        var src = 'http://www.youtube.com/v/FSi2fJALDyQ&amp;autoplay=1';
        $('#myModal').modal('show');
        $('#myModal iframe').attr('src', src);
    });

    $('#myModal button').click(function () {
        $('#myModal iframe').removeAttr('src');
    });
</script>
  </body>
</html>

Вы могли бы попытаться добавить Z-Index вашего модального игрока в стек?

$('#myModal iframe').css("z-index","999");

  • 0
    Я попробовал твой код, но он не сработал. Я не могу нажать на любую кнопку в видео (пауза, громкость звука, качество и т. Д.). Вы поняли, что я не могу использовать кнопки YOUTUBE? Я смотрю на это в Firefox. - Какую версию JQuery вы используете? Я использую 1.10.1 - Вы использовали Bootstrap 3?
  • 0
    Продолжите мои тесты: НЕ РАБОТАЙ в Firefox РАБОТАЙ в Chrome РАБОТАЙ в Safari
Показать ещё 3 комментария
-3

$('#videoLink').click(function () {
    var src = 'https://www.youtube.com/embed/VI04yNch1hU;autoplay=1';
    // $('#introVideo').modal('show'); <-- remove this line
    $('#introVideo iframe').attr('src', src);
});

$('#introVideo button.close').on('hidden.bs.modal', function () {
    $('#introVideo iframe').removeAttr('src');
});
<script src="/jquery.min.js"></script>
<link href="https://bootstrap.min.css" rel="stylesheet">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4///bootstrap.min.js"></script>

<!-- triggering Link -->
<a id="videoLink" href="#0" class="video-hp" data-toggle="modal" data-target="#introVideo"><img src="img/someImage.jpg">toggle video</a>

<!-- Intro video -->
<div class="modal fade" id="introVideo" tabindex="-1" role="dialog" aria-labelledby="introductionVideo" aria-hidden="true">
  <div class="modal-dialog modal-lg">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      </div>
      <div class="modal-body">
        <div class="embed-responsive embed-responsive-16by9">
            <iframe class="embed-responsive-item allowfullscreen"></iframe>
        </div>
      </div>
    </div>
  </div>
</div>
  • 0
    Пример не запускается

Ещё вопросы

Сообщество Overcoder
Наверх
Меню