Zmniejsz wideo YouTube do elastycznej szerokości

125

Mam wideo YouTube osadzone na naszej stronie internetowej i kiedy zmniejszam ekran do rozmiarów tabletu lub telefonu, przestaje on zmniejszać się przy szerokości około 560 pikseli. Czy to standard w przypadku filmów na YouTube, czy jest coś, co mogę dodać do kodu, aby go zmniejszyć?

MattM
źródło
1
Dobry zasób do generowania responsywnego kodu do umieszczenia na stronie: embedresponsively.com
ThisClark

Odpowiedzi:

268

Możesz sprawić, by filmy z YouTube były responsywne dzięki CSS. Umieść element iframe w elemencie div z klasą „videowrapper” i zastosuj następujące style:

.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%;
}

Element div .videowrapper powinien znajdować się wewnątrz elementu responsywnego. Wypełnienie na .videowrapper jest konieczne, aby zapobiec zwijaniu się wideo. Może być konieczne dostosowanie liczb w zależności od układu.

magi182
źródło
Dziękuję Ci! Musiałem dodać szerokość: 100% do mojego #content, aby upewnić się, że jest to element responsywny.
MattM,
6
Zobacz też: css-tricks.com/NetMag/FluidWidthVideo/…
Blazemonger
1
w moim przypadku wideo nie pojawia się podczas stosowania tego CSS.
basZero
5
szczegółowe wyjaśnienie liczby 56.25%i 25pxmożna je przeczytać na alistapart.com/article/creating-intrinsic-ratios-for-video padding-bottom: 56.25% : Aby uzyskać stosunek 16: 9, musimy podzielić 9 przez 16 (0,5625 lub 56,25%). padding-top: 25px: Aby uniknąć problemów z modelem zepsutego pudełka (IE5 lub IE6 w trybie dziwactw), używamy wyściółki do góry zamiast wysokości, aby stworzyć miejsce na chrom.
Tun
Możesz obejrzeć przykład iframe youtube tutaj @ http://alistapart.com/d/creating-intrinsic-ratios-for-video/example4.html
Vignesh Chinnaiyan
27

Jeśli używasz Bootstrap, możesz również użyć responsywnego osadzania. To w pełni zautomatyzuje tworzenie responsywnych filmów.

http://getbootstrap.com/components/#responsive-embed

Poniżej znajduje się przykładowy kod.

<!-- 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>
illage4
źródło
1
warto dodać, że należy je wstawić do jakiegoś col-sm ... itd., aby film nie był pełny.
świt
1
To niesamowite
dzień
Aby film był wyśrodkowany, nie zapomnij użyć przesunięcia. Na przykład:col-sm-8 col-sm-offset-2
Nicolas
9

Użyłem CSS w zaakceptowanej odpowiedzi tutaj dla moich responsywnych filmów z YouTube - działało świetnie do czasu aktualizacji systemu YouTube na początku sierpnia 2015. Filmy na YouTube mają te same wymiary, ale z jakiegoś powodu CSS w zaakceptowanej odpowiedzi teraz skrzynki na listy wszystkie nasze filmy. Czarne paski na górze i na dole.

Sprawdziłem rozmiary i zdecydowałem się na pozbycie się górnej wyściółki i zmianę dolnej wyściółki na 56.45%. Wygląda na to, że dobrze wygląda.

.videowrapper {
    position: relative;
    padding-bottom: 56.45%;
    height: 0;
}
McNab
źródło
1
Tylko aktualizacja - czasami stare obrazy zastępcze używane w filmach sprawiają, że wyglądają na to, że na górze i na dole nadal są czarne pasy, ale same filmy wyglądają dobrze z tym nowym ustawieniem, gdy faktycznie zaczynasz je odtwarzać. Grrr, dzięki YouTube.
McNab
1
Dzięki. Korzystanie z dopełnienia dolnego: 50% pozbywa się górnych i dolnych czarnych pasków w filmie, którego używam, chociaż wydaje się, że miniatura i sam film mają niedopasowane proporcje ...
MSC
8

Udoskonalone rozwiązanie obsługujące wyłącznie JavaScript dla YouTube i Vimeo przy użyciu 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();
});

Prosty w użyciu tylko z osadzaniem:

<iframe width="16" height="9" src="https://www.youtube.com/embed/wH7k5CFp4hI" frameborder="0" allowfullscreen></iframe>

Lub z responsywną strukturą stylu, taką jak 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>
  • Opiera się na szerokości i wysokości elementu iframe, aby zachować proporcje
  • Może używać współczynnika proporcji dla szerokości i wysokości ( width="16" height="9")
  • Czeka, aż dokument będzie gotowy przed zmianą rozmiaru
  • Używa *=selektora podciągów jQuery zamiast początku ciągu^=
  • Pobiera szerokość odniesienia z elementu nadrzędnego iframe wideo zamiast wstępnie zdefiniowanego elementu
  • Rozwiązanie JavaScript
  • Brak CSS
  • Nie potrzeba opakowania

Dzięki @Dampas za punkt wyjścia. https://stackoverflow.com/a/33354009/1011746

mindriot
źródło
Działa świetnie! Dziękuję bardzo :)
Laran Evans
To pomaga. Zwłaszcza w przypadkach, gdy nie masz kontroli nad elementami HTML (poza JS) i nie możesz ustawić filmu wideo. Dziękuję Ci.
Kai Noack
Zwróć uwagę, że to rozwiązanie powiąże zdarzenie resize z funkcją JavaScript, co może spowodować obciążenie przeglądarki w miarę dodawania większej liczby zdarzeń. Pamiętaj, że możesz użyć JavaScript do umieszczenia elementu iframe w opakowującym elemencie div, aby umożliwić CSS obsługę responsywnego stylu i zwiększyć wydajność.
Railgun
Wypróbowałem wiele rozwiązań. To najlepsze rozwiązanie w Internecie, dzięki któremu filmy YouTube będą reagować.
Dan Nick
1

To stary wątek, ale znalazłem nową odpowiedź na https://css-tricks.com/NetMag/FluidWidthVideo/Article-FluidWidthVideo.php

Problem z poprzednim rozwiązaniem polega na tym, że musisz mieć specjalne divy wokół kodu wideo, które nie są odpowiednie dla większości zastosowań. Oto rozwiązanie JavaScript bez specjalnego 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
Dampas
źródło
1

Rozwiązanie @ magi182 jest solidne, ale brakuje mu możliwości ustawienia maksymalnej szerokości. Myślę, że maksymalna szerokość 640 pikseli jest konieczna, ponieważ w przeciwnym razie miniatura youtube wygląda na piksele.

Moje rozwiązanie z dwoma owijkami działa dla mnie jak urok:

.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>

Ustawiłem również wyściółkę na dole w owijce wewnętrznej na 50%, ponieważ przy 56% @ magi182 pojawił się czarny pasek na górze i na dole.

Pascal Klein
źródło
To działało lepiej dla mnie, próbując osadzić responsywne wideo, ale określ szerokość (maksymalna szerokość).
yougotiger
1

Z kredytami do poprzedniej odpowiedzi https://stackoverflow.com/a/36549068/7149454

Kompatybilny z Boostrap, dostosuj szerokość kontenera (w tym przykładzie 300px) i gotowe:

<div class="embed-responsive embed-responsive-16by9" style="height: 100 %; width: 300px; ">
<iframe class="embed-responsive-item" src="https://www.youtube.com/embed/LbLB0K-mXMU?start=1841" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0"></iframe>
</div>
Nick Kovalsky
źródło
0

Zobacz pełny opis tutaj i przykład na żywo tutaj .

#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 jest wywoływane dopiero po pełnym załadowaniu odtwarzacza YouTube (przy ładowaniu strony nie działa) i za każdym razem, gdy zmienia się rozmiar okna przeglądarki. Po uruchomieniu oblicza wysokość i szerokość elementu iframe i przypisuje odpowiednie wartości, zachowując właściwy współczynnik proporcji. Działa to niezależnie od tego, czy rozmiar okna jest zmieniany w poziomie czy w pionie.

davidcondrey
źródło
-1

Okay, wygląda na duże rozwiązania.

Dlaczego nie dodać width: 100%; bezpośrednio do elementu iframe. ;)

Twój kod wyglądałby więc mniej więcej tak <iframe style="width: 100%;" ...></iframe>

Spróbuj tego, to zadziała tak, jak w moim przypadku.

Cieszyć się! :)

Umesh Patil
źródło
5
Ponieważ nie powoduje to poprawnej zmiany wysokości wideo, a zatem pokazuje elementy sterujące i czarne paski, zaakceptowana odpowiedź jest lepszym rozwiązaniem
CᴴᵁᴮᴮʸNᴵᴺᴶᴬ
Ponieważ jest to punkt wyjścia do tworzenia responsywnych filmów z osadzonymi elementami iframe, uważam, że to rozwiązanie poprawnie odpowiada na to pytanie. Połącz to z systemem kratownic, a jedynym problemem pozostaje wysokość. => (szerokość kontenera / 12) * 9 = wysokość.
Tim Vermaelen
-2

Robię to za pomocą prostego CSS w następujący sposób

KOD HTML

<iframe id="vid" src="https://www.youtube.com/embed/RuD7Se9jMag" frameborder="0" allowfullscreen></iframe>

KOD CSS

<style type="text/css">
#vid {

max-width: 100%;
height: auto;

}


źródło