Thu nhỏ video YouTube thành độ rộng đáp ứng


125

Tôi có một video YouTube được nhúng trên trang web của chúng tôi và khi tôi thu nhỏ màn hình thành kích thước máy tính bảng hoặc điện thoại, nó sẽ ngừng thu nhỏ ở chiều rộng khoảng 560px. Đây có phải là tiêu chuẩn cho các video YouTube hoặc có một cái gì đó mà tôi có thể thêm vào mã để làm cho nó nhỏ hơn không?


1
Tài nguyên tốt để tạo mã nhúng đáp ứng của bạn: embedresponsively.com
ThisClark

Câu trả lời:


268

Bạn có thể làm cho video YouTube phản ứng nhanh với CSS. Gói iframe trong div với lớp "videowrapper" và áp dụng các kiểu sau:

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

Div .videowrapper phải nằm trong phần tử đáp ứng. Phần đệm trên .videowrapper là cần thiết để giữ cho video không bị sập. Bạn có thể phải điều chỉnh các con số tùy thuộc vào bố cục của bạn.


Cảm ơn bạn! Tôi đã phải thêm chiều rộng: 100% cho #content của mình để đảm bảo rằng đó là một yếu tố đáp ứng.
MattM


1
trong trường hợp của tôi, video không xuất hiện khi áp dụng CSS này.
basZero

5
giải thích chi tiết về số 56.25%25pxcó thể được đọc tại alistapart.com/article/creating-intrinsic-ratios-for-video padding-bottom: 56.25% : Để tạo tỷ lệ 16: 9, chúng ta phải chia 9 cho 16 (0,5625 hoặc 56,25%). padding-top: 25px: Để tránh các sự cố với mô hình hộp bị hỏng (IE5 hoặc IE6 ở chế độ quirks), chúng tôi sử dụng padding-top thay vì chiều cao để tạo khoảng trống cho chrome.
Tun

Bạn có thể xem ví dụ iframe youtube Tại đây @ http://alistapart.com/d/creating-intrinsic-ratios-for-video/example4.html
Vignesh Chinnaiyan

26

Nếu bạn đang sử dụng Bootstrap, bạn cũng có thể sử dụng nhúng đáp ứng. Điều này sẽ hoàn toàn tự động làm cho (các) video phản hồi.

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

Có một số mã ví dụ dưới đây.

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

1
điều đáng nói là bạn nên chèn những thứ bên trong một số col-sm ... vv để tránh làm cho video có chiều rộng đầy đủ.
rạng sáng

Đây là tuyệt vời
jastr

Ngoài ra, để giữ cho video được căn giữa, đừng quên sử dụng offset. Ví dụ:col-sm-8 col-sm-offset-2
Nicolas

9

Tôi đã sử dụng CSS trong câu trả lời được chấp nhận ở đây cho các video YouTube phản hồi của mình - hoạt động rất tốt cho đến khi YouTube cập nhật hệ thống của họ vào khoảng đầu tháng 8 năm 2015. Các video trên YouTube có cùng kích thước nhưng vì lý do nào đó, CSS trong câu trả lời được chấp nhận ngay bây giờ hộp thư tất cả các video của chúng tôi. Dải màu đen trên đầu và dưới cùng.

Tôi đã đánh dấu xung quanh với các kích thước và quyết định loại bỏ phần đệm trên cùng và thay đổi phần đệm phía dưới thành 56.45%. Có vẻ để nhìn tốt.

.videowrapper {
    position: relative;
    padding-bottom: 56.45%;
    height: 0;
}

1
Chỉ là một bản cập nhật về điều này - đôi khi các hình ảnh giữ chỗ cũ được sử dụng trên video làm cho nó trông giống như vẫn có các dải màu đen trên và dưới nhưng bản thân video trông rất ổn với cài đặt mới này khi bạn thực sự bắt đầu phát chúng. Grrr, cảm ơn YouTube.
McNab

1
Cảm ơn. Sử dụng phần đệm dưới cùng: 50% thoát khỏi các thanh màu đen trên cùng và dưới cùng cho video tôi đang sử dụng, mặc dù có vẻ như hình thu nhỏ và bản thân video có tỷ lệ khung hình không khớp nhau ...
MSC

8

Giải pháp chỉ tinh chỉnh Javascript cho YouTube và Vimeo bằng 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();
});

Sử dụng đơn giản chỉ với nhúng:

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

Hoặc với khung kiểu đáp ứng như 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>
  • Dựa vào chiều rộng và chiều cao của iframe để duy trì tỷ lệ khung hình
  • Có thể sử dụng tỷ lệ khung hình cho chiều rộng và chiều cao ( width="16" height="9")
  • Chờ cho đến khi tài liệu đã sẵn sàng trước khi thay đổi kích thước
  • Sử dụng *=bộ chọn chuỗi con jQuery thay vì bắt đầu chuỗi^=
  • Nhận độ rộng tham chiếu từ cha mẹ iframe video thay vì phần tử được xác định trước
  • Giải pháp Javascript
  • Không có CSS
  • Không cần bọc

Cảm ơn @Dampas cho điểm bắt đầu. https://stackoverflow.com/a/33354009/1011746


Hoạt động hoàn hảo! Cảm ơn bạn rất nhiều :)
Laran Evans

Điều này có ích. Đặc biệt là trong trường hợp bạn không có quyền kiểm soát các phần tử HTML (nhưng JS) và không thể đặt một đoạn video. Cảm ơn bạn.
Kai Noack

Lưu ý rằng giải pháp này sẽ liên kết sự kiện thay đổi kích thước với chức năng JavaScript, điều này có thể gây căng thẳng cho trình duyệt khi có thêm sự kiện được thêm vào. Hãy nhớ rằng bạn có thể sử dụng JavaScript để bọc iframe trong div trình bao bọc để cho CSS xử lý kiểu phản ứng nhanh và tăng hiệu suất.
railgun

Tôi đã thử nhiều giải pháp. Đây là giải pháp tốt nhất trên Internet để làm cho Video YouTube phản hồi.
Dan Nick

1

Đây là chủ đề cũ, nhưng tôi đã tìm thấy câu trả lời mới trên https://css-tricks.com/NetMag/FluidWidthVideo/Article-FluidWidthVideo.php

Vấn đề với giải pháp trước đó là bạn cần có div đặc biệt xung quanh mã video, không phù hợp với hầu hết các mục đích sử dụng. Vì vậy, đây là giải pháp JavaScript mà không có div đặc biệt.

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

1

Giải pháp của @ magi182 là vững chắc, nhưng nó thiếu khả năng thiết lập chiều rộng tối đa. Tôi nghĩ rằng chiều rộng tối đa 640px là cần thiết vì khác với hình thu nhỏ của youtube trông như pixel.

Giải pháp của tôi với hai hàm bao hoạt động như một cơ duyên đối với tôi:

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

Tôi cũng đặt phần đệm dưới cùng trong trình bao bọc bên trong thành 50%, vì với 56% của @ magi182, một thanh màu đen ở trên và dưới xuất hiện.


Điều này làm việc tốt hơn đối với tôi khi cố gắng nhúng một video phản hồi, nhưng chỉ định chiều rộng (chiều rộng tối đa).
yougotiger

1

Với các khoản tín dụng cho câu trả lời trước https://stackoverflow.com/a/36549068/7149454

Tương thích Boostrap, giới thiệu chiều rộng vùng chứa của bạn (300px trong ví dụ này) và bạn thật tuyệt:

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

0

Xem ý chính đầy đủ ở đâyví dụ sống ở đây .

#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 chỉ được gọi sau khi trình phát Youtube đã tải đầy đủ (khi tải trang không hoạt động) và bất cứ khi nào cửa sổ trình duyệt được thay đổi kích thước. Khi chạy, nó sẽ tính toán chiều cao và chiều rộng của iframe và gán các giá trị phù hợp duy trì tỷ lệ khung hình chính xác. Điều này hoạt động cho dù cửa sổ được thay đổi kích thước theo chiều ngang hoặc chiều dọc.


-1

Được rồi, có vẻ như giải pháp lớn.

Tại sao không thêm width: 100%;trực tiếp vào iframe của bạn. ;)

Vì vậy, mã của bạn sẽ trông giống như <iframe style="width: 100%;" ...></iframe>

Hãy thử nó sẽ hoạt động như nó hoạt động trong trường hợp của tôi.

Thưởng thức! :)


5
Vì điều này không thay đổi kích thước chiều cao một cách chính xác cho video và do đó hiển thị các điều khiển & dải màu đen, câu trả lời được chấp nhận là một giải pháp tốt hơn
CNᴴᵁᴮᴮʸ

Vì đây là điểm khởi đầu để tạo các video phản hồi với các iframe được nhúng, tôi tin rằng giải pháp này trả lời chính xác câu hỏi. Kết hợp điều này với một hệ thống lưới và chiều cao là vấn đề duy nhất còn lại. => (chiều rộng container / 12) * 9 = chiều cao.
Tim Vermaelen

-2

Tôi làm điều này với css đơn giản như sau

MÃ HTML

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

MÃ CSS

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

max-width: 100%;
height: auto;

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.