Сжать видео с YouTube на гибкой ширина
У меня есть видео YouTube, встроенное на нашем веб-сайте, и когда я сжимаю экран до размеров планшета или телефона, он перестает уменьшаться примерно на 560 пикселей в ширину. Это стандарт для видео на YouTube или что-то, что я могу добавить в код, чтобы сделать его меньше?
9 ответов:
вы можете сделать видео YouTube отзывчивым с помощью CSS. Оберните iframe в div с классом "videowrapper" и примените следующие стили:
.videowrapper { float: none; clear: both; width: 100%; position: relative; padding-bottom: 56.25%; padding-top: 25px; height: 0; } .videowrapper iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
The .videowrapper div должен быть внутри отзывчивого элемента. Обивка на поле .videowrapper необходим для того, чтобы видео не рухнуло. Возможно, вам придется настроить номера в зависимости от вашего макета.
Если вы используете Bootstrap, вы также можете использовать адаптивное встраивание. Это позволит полностью автоматизировать создание видео(ов) реагировать.
http://getbootstrap.com/components/#responsive-embed
ниже приведен пример кода.
<!-- 16:9 aspect ratio --> <div class="embed-responsive embed-responsive-16by9"> <iframe class="embed-responsive-item" src="..."></iframe> </div> <!-- 4:3 aspect ratio --> <div class="embed-responsive embed-responsive-4by3"> <iframe class="embed-responsive-item" src="..."></iframe> </div>
Я использовал CSS в принятом ответе здесь для моих отзывчивых видеороликов YouTube-отлично работал до тех пор, пока YouTube не обновил свою систему в начале августа 2015 года. Видео на YouTube имеют те же размеры, но по какой-то причине CSS в принятом ответе теперь заполняет все наши видео. Черные полосы сверху и снизу.
Я поставил галочку вокруг размеров и решил избавиться от верхней прокладки и изменить нижнюю прокладку на
56.45%
. Кажется выглядеть хорошо..videowrapper { position: relative; padding-bottom: 56.45%; height: 0; }
уточненный Javascript только решение для YouTube и Vimeo с помощью jQuery.
// -- After the document is ready $(function() { // Find all YouTube and Vimeo videos var $allVideos = $("iframe[src*='www.youtube.com'], iframe[src*='player.vimeo.com']"); // Figure out and save aspect ratio for each video $allVideos.each(function() { $(this) .data('aspectRatio', this.height / this.width) // and remove the hard coded width/height .removeAttr('height') .removeAttr('width'); }); // When the window is resized $(window).resize(function() { // Resize all videos according to their own aspect ratio $allVideos.each(function() { var $el = $(this); // Get parent width of this video var newWidth = $el.parent().width(); $el .width(newWidth) .height(newWidth * $el.data('aspectRatio')); }); // Kick off one resize to fix all videos on page load }).resize(); });
простой в использовании только с embed:
<iframe width="16" height="9" src="https://www.youtube.com/embed/wH7k5CFp4hI" frameborder="0" allowfullscreen></iframe>
или с адаптивной структурой стиля, такой как Bootstrap.
<div class="row"> <div class="col-sm-6"> Stroke Awareness <div class="col-sm-6> <iframe width="16" height="9" src="https://www.youtube.com/embed/wH7k5CFp4hI" frameborder="0" allowfullscreen></iframe> </div> </div>
- полагается на ширину и высоту iframe для сохранения соотношения сторон
- можно использовать соотношение ширины и высоты (
width="16" height="9"
)- ждет, пока документ не будет готов до размера
- использует подстроку jQuery
*=
селектор вместо начала строки^=
- получает ссылочную ширину из родительского iframe видео вместо предопределенного элемента
- Javascript решение
- нет CSS
- не нужны
спасибо @Dampas за отправную точку. https://stackoverflow.com/a/33354009/1011746
Это старый поток, но я должен найти новый ответ на https://css-tricks.com/NetMag/FluidWidthVideo/Article-FluidWidthVideo.php
проблема с предыдущим решением заключается в том, что вам нужно иметь специальный div вокруг видеокода, который не подходит для большинства применений. Итак, вот решение JavaScript без специального div.
// Find all YouTube videos - RESIZE YOUTUBE VIDEOS!!! var $allVideos = $("iframe[src^='https://www.youtube.com']"), // The element that is fluid width $fluidEl = $("body"); // Figure out and save aspect ratio for each video $allVideos.each(function() { $(this) .data('aspectRatio', this.height / this.width) // and remove the hard coded width/height .removeAttr('height') .removeAttr('width'); }); // When the window is resized $(window).resize(function() { var newWidth = $fluidEl.width(); // Resize all videos according to their own aspect ratio $allVideos.each(function() { var $el = $(this); $el .width(newWidth) .height(newWidth * $el.data('aspectRatio')); }); // Kick off one resize to fix all videos on page load }).resize(); // END RESIZE VIDEOS
решение@magi182 является твердым, но ему не хватает возможности установить максимальную ширину. Я думаю, что максимальная ширина 640px необходима, потому что в противном случае миниатюра youtube выглядит пиксельной.
мое решение с двумя обертками работает как шарм для меня:
.videoWrapperOuter { max-width:640px; margin-left:auto; margin-right:auto; } .videoWrapperInner { float: none; clear: both; width: 100%; position: relative; padding-bottom: 50%; padding-top: 25px; height: 0; } .videoWrapperInner iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } <div class="videoWrapperOuter"> <div class="videoWrapperInner"> <iframe src="//www.youtube.com/embed/C6-TWRn0k4I" frameborder="0" allowfullscreen></iframe> </div> </div>
Я также установил padding-bottom во внутренней обертке на 50 %, потому что с помощью @magi182 56% появилась черная полоса сверху и снизу.
Смотрите полную суть здесь и живой пример здесь.
#hero { width:100%;height:100%;background:url('{$img_ps_dir}cms/how-it-works/hero.jpg') no-repeat top center; } .videoWrapper { position:relative;padding-bottom:56.25%;padding-top:25px;max-width:100%; }
<div id="hero"> <div class="container"> <div class="row-fluid"> <script src="https://www.youtube.com/iframe_api"></script> <center> <div class="videoWrapper"> <div id="player"></div> </div> </center> <script> function onYouTubeIframeAPIReady() { player = new YT.Player('player', { videoId:'xxxxxxxxxxx',playerVars: { controls:0,autoplay:0,disablekb:1,enablejsapi:1,iv_load_policy:3,modestbranding:1,showinfo:0,rel:0,theme:'light' } } ); resizeHeroVideo(); } </script> </div> </div> </div>
var player = null; $( document ).ready(function() { resizeHeroVideo(); } ); $(window).resize(function() { resizeHeroVideo(); }); function resizeHeroVideo() { var content = $('#hero'); var contentH = viewportSize.getHeight(); contentH -= 158; content.css('height',contentH); if(player != null) { var iframe = $('.videoWrapper iframe'); var iframeH = contentH - 150; if (isMobile) { iframeH = 163; } iframe.css('height',iframeH); var iframeW = iframeH/9 * 16; iframe.css('width',iframeW); } }
resizeHeroVideo вызывается только после того, как плеер Youtube полностью загружен (на странице загрузка не работает), и всякий раз, когда окно браузера изменяется. При запуске он вычисляет высоту и ширину iframe и назначает соответствующие значения, сохраняя правильное соотношение сторон. Это работает независимо от того, изменяется ли размер окна по горизонтали или вертикально.