mô phỏng kích thước nền: che trên <video> hoặc <img>


154

Làm thế nào tôi có thể mô phỏng các chức năng của background-size:covertrên một phần tử html như <video>hay <img>?

Tôi muốn nó hoạt động như

background-size: cover;
background-position: center center;

1
được rồi, tôi chưa bao giờ sử dụng kích thước nền: bìa; Nhưng tôi đã xem nó trực tuyến, vì vậy điều bạn muốn là một cách để có một hình ảnh / video toàn màn hình thay đổi kích thước khi cửa sổ thay đổi kích thước?
Lennart

Có, nhưng có sự tinh tế với cover. Xem nền 101 kích thước trên liên kết .
seron

được rồi để đơn giản hóa 100% chiều rộng của hình ảnh / video và nếu có tràn thì nó có bị cắt không? Nếu bạn muốn điều này tôi có thể xem liệu tôi có thể mã hóa nó không, nhưng đối với video bạn nên nhớ rằng bạn sẽ cần một trình phát tùy chỉnh vì trong hầu hết các trình duyệt, các điều khiển nằm ở cuối trình phát và chúng sẽ bị cắt nếu có là một tràn ...
Lennart

Vâng, tràn đều ở hai bên đối diện. Tôi biết vấn đề kiểm soát video.
seron

1
Nếu cửa sổ cao hơn hình ảnh, nó sẽ chừa khoảng trống ở đâu đó dọc theo trục dọc, tôi nghĩ vậy. Trong trường hợp như vậy, hình ảnh thay vào đó sẽ tràn ra hai bên và chiều cao của nó giống như cửa sổ. Và điều ngược lại sẽ xảy ra khi cửa sổ rộng hơn hình ảnh.
seron

Câu trả lời:


142

Đây là điều tôi đã nhổ tóc trong một thời gian, nhưng tôi đã tìm ra một giải pháp tuyệt vời không sử dụng bất kỳ tập lệnh nào và có thể đạt được một mô phỏng bìa hoàn hảo trên video với 5 dòng CSS (9 nếu bạn đếm bộ chọn và dấu ngoặc ). Điều này có 0 trường hợp cạnh trong đó nó không hoạt động hoàn hảo, thiếu khả năng tương thích CSS3 .

Bạn có thể xem một ví dụ ở đây

Vấn đề với giải pháp của Timothy là nó không xử lý tỷ lệ chính xác. Nếu phần tử xung quanh nhỏ hơn tệp video, nó không được thu nhỏ lại. Ngay cả khi bạn cung cấp cho thẻ video một kích thước ban đầu nhỏ, như 16px x 9px, autocuối cùng sẽ buộc nó ở mức tối thiểu của kích thước tệp gốc của nó. Với giải pháp được bình chọn hàng đầu hiện nay trên trang này, tôi không thể giảm quy mô tệp video xuống dẫn đến hiệu ứng thu phóng mạnh.

Tuy nhiên, nếu tỷ lệ khung hình của video của bạn được biết, chẳng hạn như 16: 9, bạn có thể thực hiện các thao tác sau:

.parent-element-to-video {
    overflow: hidden;
}
video {
    height: 100%;
    width: 177.77777778vh; /* 100 * 16 / 9 */
    min-width: 100%;
    min-height: 56.25vw; /* 100 * 9 / 16 */
}

Nếu thành phần chính của video được đặt để bao phủ toàn bộ trang (chẳng hạn như position: fixed; width: 100%; height: 100vh;), thì video cũng sẽ như vậy.

Nếu bạn cũng muốn video được căn giữa, bạn có thể sử dụng phương pháp định tâm chắc chắn:

/* merge with above css */
.parent-element-to-video {
    position: relative; /* or absolute or fixed */
}
video {
    position: absolute;
    left: 50%; /* % of surrounding element */
    top: 50%;
    transform: translate(-50%, -50%); /* % of current element */
}

Tất nhiên, vw, vh, và transformlà CSS3, vì vậy nếu bạn cần khả năng tương thích với các trình duyệt cũ hơn , bạn sẽ cần phải kịch bản sử dụng.


3
Đây là câu trả lời tốt nhất. Không có javascript, CSS thuần, tỷ lệ chính xác và tập trung.
mark.monteiro

6
À đúng rồi anh bạn. Đây là câu trả lời cho năm 2016. Bỏ qua tất cả những người khác.
Josh Burson

bạn có quan tâm để giải thích tại sao điều này làm việc? Tôi không thể quấn đầu xung quanh nó. phải làm gì vhvwphải làm gì với bất cứ điều gì?
phổ biến

1
@insidesin: Đăng một câu đố?
M-Pixel

1
Năm 2020, giải pháp tốt nhất là phù hợp với đối tượng: che chở, như được mô tả trong câu trả lời của Daniël de Wit
Brett Donald

128

jsFiddle

Sử dụng bìa nền là tốt cho hình ảnh, và chiều rộng 100% cũng vậy. Đây không phải là tối ưu cho <video>, và những câu trả lời này là quá phức tạp. Bạn không cần jQuery hoặc JavaScript để hoàn thành nền video có chiều rộng đầy đủ.

Hãy nhớ rằng mã của tôi sẽ không bao phủ hoàn toàn nền sau với video như bìa, nhưng thay vào đó, nó sẽ làm cho video lớn như cần thiết để duy trì tỷ lệ khung hình và vẫn bao phủ toàn bộ nền. Bất kỳ video dư thừa nào cũng sẽ bị chảy ra khỏi cạnh trang, các mặt phụ thuộc vào nơi bạn neo video.

Câu trả lời khá đơn giản.

Chỉ cần sử dụng mã video HTML5 này hoặc một cái gì đó dọc theo các dòng này: (kiểm tra trong Toàn trang)

html, body {
  width: 100%; 
  height:100%; 
  overflow:hidden;
}

#vid{
  position: absolute;
  top: 50%; 
  left: 50%;
  -webkit-transform: translateX(-50%) translateY(-50%);
  transform: translateX(-50%) translateY(-50%);
  min-width: 100%; 
  min-height: 100%; 
  width: auto; 
  height: auto;
  z-index: -1000; 
  overflow: hidden;
}
<video id="vid" video autobuffer autoplay>
  <source id="mp4" src="http://grochtdreis.de/fuer-jsfiddle/video/sintel_trailer-480.mp4" type="video/mp4">
</video>

Chiều cao tối thiểu và chiều rộng tối thiểu sẽ cho phép video duy trì tỷ lệ khung hình của video, thường là tỷ lệ khung hình của bất kỳ trình duyệt thông thường nào ở độ phân giải bình thường. Bất kỳ video dư thừa chảy máu từ phía bên của trang.


2
Điều này đơn giản hơn nhiều so với các câu trả lời khác, và hoạt động tốt với tôi. Chỉ cần thiết lập min-widthhoặc min-heightthực hiện các mẹo.
Ryan Burney

31
Giải pháp này không tập trung vào video như bìa.
vào

1
chỉ là một nhận xét để ngăn người mới nhổ tóc: #video_background {nên là #videobackground {.
carrabino

21
Điều này hoàn toàn không thu nhỏ video (Tôi không thử mở rộng một video), điều này gây ra nhiều vấn đề nếu cửa sổ trình duyệt nhỏ và video lớn. Vì vậy, về cơ bản, nó chỉ quan tâm đến phần bị chảy của kích thước nền: che phủ chứ không phải phần tỷ lệ.
Kevin Newman

4
Với các công nghệ hiện tại, đây sẽ là câu trả lời được chấp nhận: giải pháp CSS thích hợp hơn với giải pháp Javascript. Mặc dù nó yêu cầu bạn đặt cha mẹ đúng cách. Để căn giữa video, sử dụng : position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);.
Sjeiti

100

Đối với một số trình duyệt, bạn có thể sử dụng

object-fit: cover;

http://caniuse.com/object-fit


15
Đây là một tuyên bố rất mạnh mẽ, nếu các trình duyệt chấp nhận nó, sẽ chấm dứt rất nhiều tai ương với việc thu nhỏ mọi thứ trên các trang web.
Mike Kormendy

1
Điều này thật đúng với gì mà tôi đã tìm kiếm!
Peter_Fretter

3
Có một polyfill cho những lông mày không hỗ trợ (chưa): github.com/anselmh/object-fit
creimers

7
đã phải áp dụng là tốt height: 100%; width: 100%;. cảm ơn vì câu trả lời hiện đại này
Jossef Harush

Tôi đã thực hiện một câu trả lời dựa trên câu hỏi này với các ví dụ và thông tin . Cảm ơn bạn đã chỉ ra tính năng này!
aloisdg chuyển đến codidact.com

43

Đây là cách tôi đã làm điều này. Một ví dụ hoạt động là trong jsFiddle này .

var min_w = 300; // minimum video width allowed
var vid_w_orig;  // original video dimensions
var vid_h_orig;

jQuery(function() { // runs after DOM has loaded

  vid_w_orig = parseInt(jQuery('video').attr('width'));
  vid_h_orig = parseInt(jQuery('video').attr('height'));
  $('#debug').append("<p>DOM loaded</p>");

  jQuery(window).resize(function () { resizeToCover(); });
  jQuery(window).trigger('resize');
});

function resizeToCover() {
  // set the video viewport to the window size
  jQuery('#video-viewport').width(jQuery(window).width());
  jQuery('#video-viewport').height(jQuery(window).height());

  // use largest scale factor of horizontal/vertical
  var scale_h = jQuery(window).width() / vid_w_orig;
  var scale_v = jQuery(window).height() / vid_h_orig;
  var scale = scale_h > scale_v ? scale_h : scale_v;

  // don't allow scaled width < minimum video width
  if (scale * vid_w_orig < min_w) {scale = min_w / vid_w_orig;};

  // now scale the video
  jQuery('video').width(scale * vid_w_orig);
  jQuery('video').height(scale * vid_h_orig);
  // and center it by scrolling the video viewport
  jQuery('#video-viewport').scrollLeft((jQuery('video').width() - jQuery(window).width()) / 2);
  jQuery('#video-viewport').scrollTop((jQuery('video').height() - jQuery(window).height()) / 2);

  // debug output
  jQuery('#debug').html("<p>win_w: " + jQuery(window).width() + "</p>");
  jQuery('#debug').append("<p>win_h: " + jQuery(window).height() + "</p>");
  jQuery('#debug').append("<p>viewport_w: " + jQuery('#video-viewport').width() + "</p>");
  jQuery('#debug').append("<p>viewport_h: " + jQuery('#video-viewport').height() + "</p>");
  jQuery('#debug').append("<p>video_w: " + jQuery('video').width() + "</p>");
  jQuery('#debug').append("<p>video_h: " + jQuery('video').height() + "</p>");
  jQuery('#debug').append("<p>vid_w_orig: " + vid_w_orig + "</p>");
  jQuery('#debug').append("<p>vid_h_orig: " + vid_h_orig + "</p>");
  jQuery('#debug').append("<p>scale: " + scale + "</p>");
};
#video-viewport {
  position: absolute;
  top: 0;
  overflow: hidden;
  z-index: -1; /* for accessing the video by click */
}

#debug {
  position: absolute;
  top: 0;
  z-index: 100;
  color: #fff;
  font-size: 12pt;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="video-viewport">
  <video autoplay controls preload width="640" height="360">
    <source src="http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4"type="video/mp4" />
    <source src="http://www.quirksmode.org/html5/videos/big_buck_bunny.webm"type="video/webm" />
    <source src="http://www.quirksmode.org/html5/videos/big_buck_bunny.ogv"type="video/webm" />
  </video>
</div>

<div id="debug"></div>


Tại sao giải pháp này bị hạ cấp? Đối với tất cả ý định và mục đích dường như để giải quyết vấn đề.
Jan

2
Đây là giải pháp tốt nhất tôi tìm thấy cho vấn đề này. Cảm ơn!
Chaser324

1
Điều này hoạt động rất tốt nếu video lớn và cửa sổ nhỏ, nhưng sẽ không hoạt động với tôi nếu cửa sổ lớn hơn video và video cần nâng cấp. Tôi đã thêm mẹo nhỏ từ @ Timothy-Ryan-Carpenter ( trả lời xuống đây ) vào thẻ video dưới dạng: video { min-width: 100%; min-height: 100%; }và nó hoạt động như một bùa mê.
Alexandre DuBreuil

Tôi thấy cách tiếp cận này cũng hữu ích và đã đóng gói nó như một plugin jQuery đơn giản cho bất kỳ ai quan tâm: github.com/aMoniker/jquery.videocover
Jim Greenleaf

Bất chấp những gì @AlexandreDuBreuil nói, điều này sẽ tăng tỷ lệ video lên rất tốt (tự mình xem: fiddle.jshell.net/GCtMm/show ). Đây chắc chắn là giải pháp tốt nhất ở đây. Thật xấu hổ vì nó quá nặng so với câu trả lời khác ở đây, nhưng đó là những gì bạn cần nếu bạn muốn background-size: covercho video.
Chuck Le Mông

14

Các câu trả lời khác là tốt nhưng chúng liên quan đến javascript hoặc chúng không định tâm video theo chiều ngang VÀ theo chiều dọc.

Bạn có thể sử dụng giải pháp CSS đầy đủ này để có một video mô phỏng thuộc tính kích thước nền: bìa:

  video {
    position: fixed;           // Make it full screen (fixed)
    right: 0;
    bottom: 0;
    z-index: -1;               // Put on background

    min-width: 100%;           // Expand video
    min-height: 100%;
    width: auto;               // Keep aspect ratio
    height: auto;

    top: 50%;                  // Vertical center offset
    left: 50%;                 // Horizontal center offset

    -webkit-transform: translate(-50%,-50%);
    -moz-transform: translate(-50%,-50%);
    -ms-transform: translate(-50%,-50%);
    transform: translate(-50%,-50%);         // Cover effect: compensate the offset

    background: url(bkg.jpg) no-repeat;      // Background placeholder, not always needed
    background-size: cover;
  }

Điều này đã không làm việc cho tôi. Video không mở rộng đến toàn màn hình. Tôi có thể xem html của bạn cho ví dụ này không? Có phải nó chỉ là một thẻ video trong cơ thể?
matt

Giải pháp thực sự tốt đẹp. Nó không hoạt động với tôi lúc đầu nhưng có lẽ đó là điều tôi đã bỏ lỡ khi tôi sao chép và dán css của bạn, nó đã hoạt động! Cảm ơn;)
rafaelbiten

2
làm việc tuyệt vời cho tôi tôi vừa thay đổi vị trí: cố định đến tuyệt đối
Assaf Katz

14

Dựa trên câu trả lời và bình luận của Daniel de Wit , tôi đã tìm kiếm thêm một chút. Nhờ anh giải pháp.

Giải pháp là sử dụng object-fit: cover;có sự hỗ trợ tuyệt vời (mọi trình duyệt hiện đại đều hỗ trợ nó). Nếu bạn thực sự muốn hỗ trợ IE, bạn có thể sử dụng một polyfill như object-fit-image hoặc object-fit .

Bản trình diễn:

img {
  float: left;
  width: 100px;
  height: 80px;
  border: 1px solid black;
  margin-right: 1em;
}
.fill {
  object-fit: fill;
}
.contain {
  object-fit: contain;
}
.cover {
  object-fit: cover;
}
.none {
  object-fit: none;
}
.scale-down {
  object-fit: scale-down;
}
<img class="fill" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>
<img class="contain" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>
<img class="cover" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>
<img class="none" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>
<img class="scale-down" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>

và với cha mẹ:

div {
  float: left;
  width: 100px;
  height: 80px;
  border: 1px solid black;
  margin-right: 1em;
}
img {
  width: 100%;
  height: 100%;
}
.fill {
  object-fit: fill;
}
.contain {
  object-fit: contain;
}
.cover {
  object-fit: cover;
}
.none {
  object-fit: none;
}
.scale-down {
  object-fit: scale-down;
}
<div>
<img class="fill" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>
</div><div>
<img class="contain" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>
</div><div>
<img class="cover" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>
</div><div>
<img class="none" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>
</div><div>
<img class="scale-down" src="http://www.peppercarrot.com/data/wiki/medias/img/chara_carrot.jpg"/>
</div>


1
Câu trả lời hiện đại nhất.
Routhinator

1
Đây là câu trả lời cho bất cứ ai nhắm vào các trình duyệt hiện đại. Sử dụng object-fit: coverwidthheightthiết lập để 100%, bạn sẽ có được một tỷ lệ tương ứng quy mô imghoặc videothu nhỏ trên trung tâm mà không phiền phức.
phip

13

Giải pháp của M-Pixel rất hay ở chỗ nó giải quyết vấn đề mở rộng cho câu trả lời của Timothy (video sẽ tăng lên nhưng không giảm, vì vậy nếu video của bạn thực sự lớn thì rất có thể bạn sẽ chỉ thấy một phần nhỏ được phóng to trong đó). Tuy nhiên, giải pháp đó dựa trên các giả định sai liên quan đến kích thước của bộ chứa video, cụ thể là nó nhất thiết phải bằng 100% chiều rộng và chiều cao của khung nhìn. Tôi đã tìm thấy một vài trường hợp nó không hiệu quả với tôi, vì vậy tôi quyết định tự mình giải quyết vấn đề và tôi tin rằng tôi đã đưa ra giải pháp tối ưu .

HTML

<div class="parent-container">
    <div class="video-container">
        <video width="1920" height="1080" preload="auto" autoplay loop>
            <source src="video.mp4" type="video/mp4">
        </video>
    </div>
</div>

CSS

.parent-container {
  /* any width or height */
  position: relative;
  overflow: hidden;
}
.video-container {
  width: 100%;
  min-height: 100%;
  position: absolute;
  left: 0px;
  /* center vertically */
  top: 50%;
  -moz-transform: translate(0%, -50%);
  -ms-transform: translate(0%, -50%);
  -webkit-transform: translate(0%, -50%);
  transform: translate(0%, -50%);
}
.video-container::before {
  content: "";
  display: block;
  height: 0px;
  padding-bottom: 56.25%; /* 100% * 9 / 16 */
}
.video-container video {
  width: auto;
  height: 100%;
  position: absolute;
  top: 0px;
  /* center horizontally */
  left: 50%;
  -moz-transform: translate(-50%, 0%);
  -ms-transform: translate(-50%, 0%);
  -webkit-transform: translate(-50%, 0%);
  transform: translate(-50%, 0%);
}

Nó cũng dựa trên tỷ lệ của video, vì vậy nếu video của bạn có tỷ lệ khác 16/9, bạn sẽ muốn thay đổi% đệm dưới cùng. Ngoài ra, nó hoạt động ra khỏi hộp. Đã thử nghiệm trong IE9 +, Safari 9.0.1, Chrome 46 và Firefox 41.

EDIT (ngày 17 tháng 3 năm 2016)

Vì tôi đã đăng câu trả lời này nên tôi đã viết một mô-đun CSS nhỏ để mô phỏng cả hai background-size: coverbackground-size: containtrên <video>các yếu tố: http://codepen.io/benface/pen/NNdBMj

Nó hỗ trợ sắp xếp khác nhau cho video (tương tự background-position). Cũng lưu ý rằng việc containthực hiện không hoàn hảo. Không giống như background-size: contain, nó sẽ không mở rộng video qua kích thước thực của nó nếu chiều rộng và chiều cao của thùng chứa lớn hơn, nhưng tôi nghĩ nó vẫn có thể hữu ích trong một số trường hợp. Tôi cũng đã thêm các lớp đặc biệt fill-widthfill-heightmà bạn có thể sử dụng cùng containđể có được sự pha trộn đặc biệt containcover... dùng thử, và thoải mái cải thiện nó!


Điều này không mở rộng video trên độ phân giải bình thường để làm cho nó phù hợp với 100% chiều rộng / chiều cao bất kể điều gì. Do đó, nó không sao chép chức năng 'che'.
jetlej

@jetlej Nó làm ở đây. Bạn đang thử nghiệm trình duyệt nào? Bạn đã nhìn vào codepen của tôi?
benface

1
Nó hoạt động độc đáo như một dự phòng trên Edge đối với tôi. Chúc mừng
MrThunder

@MrThunder bạn sử dụng gì làm giải pháp chính của mình nếu bạn sử dụng điều này như một dự phòng?
benface

1
@ benoitr007 Tôi đã sử dụng object-fit: covercho FF và chrome và giải pháp của bạn với Modernizr cho IE
MrThunder


4

CSS và js nhỏ có thể làm cho video bao phủ nền và tập trung theo chiều ngang.

CSS:

video#bgvid {
    position: absolute;
    bottom: 0px; 
    left: 50%; 
    min-width: 100%; 
    min-height: 100%; 
    width: auto; 
    height: auto; 
    z-index: -1; 
    overflow: hidden;
}

JS: (liên kết điều này với thay đổi kích thước cửa sổ và gọi một lần riêng biệt)

$('#bgvid').css({
    marginLeft : '-' + ($('#bgvid').width()/2) + 'px'
})

3

Ngay sau phần bình luận dài của chúng tôi, tôi nghĩ đây là thứ bạn đang tìm kiếm, nó dựa trên jQuery:

HTML:

<img width="100%" id="img" src="http://uploads8.wikipaintings.org/images/william-adolphe-bouguereau/self-portrait-presented-to-m-sage-1886.jpg">

JS:

<script type="text/javascript">
window.onload = function(){
       var img = document.getElementById('img')
       if(img.clientHeight<$(window).height()){
            img.style.height=$(window).height()+"px";
       }
       if(img.clientWidth<$(window).width()){
            img.style.width=$(window).width()+"px";
       } 
}
​</script>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

CSS:

body{
    overflow: hidden;
}

Đoạn mã trên đang sử dụng chiều rộng và chiều cao của trình duyệt nếu bạn thực hiện điều này trong div, bạn sẽ phải thay đổi nó thành một cái gì đó như thế này:

Dành cho Div:

HTML:

<div style="width:100px; max-height: 100px;" id="div">
     <img width="100%" id="img" src="http://uploads8.wikipaintings.org/images/william-adolphe-bouguereau/self-portrait-presented-to-m-sage-1886.jpg">
</div>

JS:

<script type="text/javascript">
window.onload = function(){
       var img = document.getElementById('img')
       if(img.clientHeight<$('#div').height()){
            img.style.height=$('#div').height()+"px";
       }
       if(img.clientWidth<$('#div').width()){
            img.style.width=$('#div').width()+"px";
       } 
}
​</script>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

CSS:

div{
   overflow: hidden;
}

Tôi cũng nên nói rằng tôi chỉ thử nghiệm đây là Google Chrome ... đây là một jsfiddle: http://jsfiddle.net/ADCKk/


Jsfiddle dường như không làm gì khi tôi thay đổi kích thước của khung Kết quả hoặc kích thước trình duyệt. Tôi đã thử điều này trong Chrome.
seron

Tôi đã cập nhật nó, nhưng tôi vẫn có một vấn đề nhỏ là nếu bạn giảm chiều rộng xuống nhiều thì nó đột nhiên nhảy ... jsfiddle.net/ADCKk/1
Lennart

được rồi, xin lỗi nhưng tôi không biết, tôi đã thử rất nhiều thứ tôi nghĩ rằng tôi đã tự làm mình bối rối, tôi không chắc là nó có thể không ... Kịch bản ở trên chỉ hoạt động khi bạn làm mới trang, để nó hoạt động Khi bạn thay đổi kích thước cửa sổ, bạn sẽ cần sử dụng sự kiện window.resize trong js, nhưng tôi không thể làm cho nó hoạt động được, có lẽ bạn có thể với thông tin đó :) dù sao cũng may mắn
Lennart

3

Câu trả lời hàng đầu không thu nhỏ video khi bạn ở độ rộng của trình duyệt nhỏ hơn chiều rộng của video. Hãy thử sử dụng CSS này (với #bgvid là id video của bạn):

#bgvid {
     position: fixed;
     top: 50%;
     left: 50%;
     min-width: 100%;
     min-height: 100%;
     width: auto;
     height: auto;
     transform: translateX(-50%) translateY(-50%);
     -webkit-transform: translateX(-50%) translateY(-50%);
}

Tại sao tiêu cực z-indexcần thiết?
aleclarson

Nó không - chỉ hữu ích khi thiết kế với nhiều yếu tố lớp. Tôi đã gỡ bỏ nó.
Ramzi Dreessen

1

Tôi cũng đang đăng giải pháp này, vì tôi gặp vấn đề này nhưng các giải pháp khác không hoạt động cho tình huống của tôi ...

Tôi nghĩ rằng để mô phỏng chính xác thuộc tính background-size:cover;css trên một thành phần thay vì thuộc tính hình ảnh nền của thành phần, bạn phải so sánh tỷ lệ khung hình của hình ảnh với tỷ lệ khung hình của cửa sổ hiện tại, vì vậy, bất kể kích thước nào (và trong trường hợp hình ảnh là cao hơn rộng hơn) cửa sổ là phần tử đang lấp đầy cửa sổ (và cũng tập trung vào nó, mặc dù tôi không biết đó có phải là một yêu cầu không) ....

sử dụng một hình ảnh, chỉ vì đơn giản, tôi chắc chắn một yếu tố video cũng sẽ hoạt động tốt.

đầu tiên lấy tỷ lệ khung hình của các thành phần (khi nó được tải), sau đó đính kèm trình xử lý thay đổi kích thước cửa sổ, kích hoạt nó một lần cho kích thước ban đầu:

var img = document.getElementById( "background-picture" ),
    imgAspectRatio;

img.onload = function() {
    // get images aspect ratio
    imgAspectRatio = this.height / this.width;
    // attach resize event and fire it once
    window.onresize = resizeBackground;
    window.onresize();
}

sau đó, trong trình xử lý thay đổi kích thước của bạn, trước tiên bạn nên xác định xem nên lấp đầy chiều rộng hoặc chiều cao bằng cách so sánh tỷ lệ khung hình hiện tại của cửa sổ với tỷ lệ khung hình gốc của hình ảnh.

function resizeBackground( evt ) {

// get window size and aspect ratio
var windowWidth = window.innerWidth,
    windowHeight = window.innerHeight;
    windowAspectRatio = windowHeight / windowWidth;

//compare window ratio to image ratio so you know which way the image should fill
if ( windowAspectRatio < imgAspectRatio ) {
    // we are fill width
    img.style.width = windowWidth + "px";
    // and applying the correct aspect to the height now
    img.style.height = (windowWidth * imgAspectRatio) + "px";
    // this can be margin if your element is not positioned relatively, absolutely or fixed
    // make sure image is always centered
    img.style.left = "0px";
    img.style.top = (windowHeight - (windowWidth * imgAspectRatio)) / 2 + "px";
} else { // same thing as above but filling height instead
    img.style.height = windowHeight + "px";
    img.style.width = (windowHeight / imgAspectRatio) + "px";
    img.style.left = (windowWidth - (windowHeight / imgAspectRatio)) / 2 + "px";
    img.style.top = "0px";
}

}


1

Cách tiếp cận này chỉ sử dụng css và html. Bạn thực sự có thể xếp một div bên dưới video một cách dễ dàng. Nó là bìa nhưng không phải là trung tâm trong khi bạn thay đổi kích thước.

HTML:

<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"> 
</script>
</head>
<body>
<div id = "contain">
<div id="vid">
    <video autoplay>
        <source src="http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4" type="video/mp4" />
    </video>
</div>
</div>
</body>
</html>

CCS:

/*
filename:style.css
*/
body {
    margin:0;
}

#vid video{
position: absolute; 
right: 0; 
top: 0;
min-width: 100%; 
min-height: 100%;
width: auto; 
height: auto; 
}

#contain {
width:100%;
height:100%;
zoom:1%;/*Without this the video will be stretched and skewed*/ 
}

1

@ Hobbes Hobbes

Câu hỏi này có tiền thưởng mở trị giá +100 danh tiếng từ Hidden Hobbes kết thúc sau 6 ngày. Sử dụng sáng tạo các đơn vị khung nhìn để có được giải pháp chỉ CSS linh hoạt.

Bạn đã mở một tiền thưởng cho câu hỏi này cho một giải pháp chỉ CSS, vì vậy tôi sẽ thử. Giải pháp của tôi cho một vấn đề như thế này là sử dụng tỷ lệ cố định để quyết định chiều cao và chiều rộng của video. Tôi thường sử dụng Bootstrap, nhưng tôi đã trích xuất CSS cần thiết từ đó để làm cho nó hoạt động mà không cần. Đây là một mã tôi đã sử dụng trước đó trong số những thứ khác tập trung vào một video được nhúng với tỷ lệ chính xác. Nó cũng hoạt động cho các yếu tố <video>và đó <img>cũng là một trong những yếu tố hàng đầu có liên quan ở đây, nhưng tôi cũng đã đưa cho bạn hai cái còn lại vì tôi đã đặt chúng xung quanh. May mắn nhất! :)

ví dụ toàn màn hình jsfiddle

.embeddedContent.centeredContent {
    margin: 0px auto;
}
.embeddedContent.rightAlignedContent {
    margin: auto 0px auto auto;
}
.embeddedContent > .embeddedInnerWrapper {
    position:relative;
    display: block;
    padding: 0;
    padding-top: 42.8571%; /* 21:9 ratio */
}
.embeddedContent > .embeddedInnerWrapper > iframe {
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    height: 100%;
    width: 100%;
    border: 0;
}
.embeddedContent {
    max-width: 300px;
}
.box1text {
    background-color: red;
}
/* snippet from Bootstrap */
.container {
    margin-right: auto;
    margin-left: auto;
}
.col-md-12 {
    width: 100%;
}
<div class="container">
    <div class="row">
        <div class="col-md-12">
            Testing ratio AND left/right/center align:<br />
            <div class="box1text">
                <div class="embeddedContent centeredContent">
                    <div class="embeddedInnerWrapper">
                        <iframe allowfullscreen="true" allowscriptaccess="always" frameborder="0" height="349" scrolling="no" src="//www.youtube.com/embed/u6XAPnuFjJc?wmode=transparent&amp;jqoemcache=eE9xf" width="425"></iframe>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div class="container">
    <div class="row">
        <div class="col-md-12">
            Testing ratio AND left/right/center align:<br />
            <div class="box1text">
                <div class="embeddedContent rightAlignedContent">
                    <div class="embeddedInnerWrapper">
                        <iframe allowfullscreen="true" allowscriptaccess="always" frameborder="0" height="349" scrolling="no" src="//www.youtube.com/embed/u6XAPnuFjJc?wmode=transparent&amp;jqoemcache=eE9xf" width="425"></iframe>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div class="container">
    <div class="row">
        <div class="col-md-12">
            Testing ratio AND left/right/center align:<br />
            <div class="box1text">
                <div class="embeddedContent">
                    <div class="embeddedInnerWrapper">
                        <iframe allowfullscreen="true" allowscriptaccess="always" frameborder="0" height="349" scrolling="no" src="//www.youtube.com/embed/u6XAPnuFjJc?wmode=transparent&amp;jqoemcache=eE9xf" width="425"></iframe>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>


1
Cảm ơn câu trả lời @turbopipp mặc dù tôi sợ bạn đã hiểu sai lý do cho tiền thưởng của tôi. Tôi đã nêu ra để tôi có thể trao giải cho câu trả lời hiện có, nó chỉ không cho phép tôi làm như vậy cho đến khi tiền thưởng đã hoạt động trong 24 giờ. Tuy nhiên, +1 cho những nỗ lực của bạn, thủ thuật đệm phần trăm là một cách hữu ích để đảm bảo một yếu tố giữ tỷ lệ khung hình chính xác.
Hobbes ẩn

Aha, thật ra chẳng có gì khó khăn cả, và thật tuyệt khi bạn đưa tiền thưởng cho những câu trả lời đã có sẵn. Tôi đoán tôi nên đọc lên trên hệ thống tiền thưởng. :) Cảm ơn
Tua

0

Để trả lời nhận xét từ chúng tôi rằng câu trả lời của Timothy Ryan Carpenter không giải thích cho coverviệc căn giữa nền, tôi cung cấp bản sửa lỗi CSS nhanh này:

CSS:

margin-left: 50%;
transform: translateX(-50%);

Thêm hai dòng này sẽ trung tâm bất kỳ yếu tố. Thậm chí tốt hơn, tất cả các trình duyệt có thể xử lý video HTML5 cũng hỗ trợ chuyển đổi CSS3, vì vậy điều này sẽ luôn hoạt động.

CSS hoàn chỉnh trông như thế này.

#video-background { 
    position: absolute;
    bottom: 0px; 
    right: 0px; 
    min-width: 100%; 
    min-height: 100%; 
    width: auto; 
    height: auto; 
    z-index: -1000; 
    overflow: hidden;
    margin-left: 50%;
    transform: translateX(-50%);
}

Tôi đã nhận xét trực tiếp về câu trả lời của Timothy, nhưng tôi không đủ danh tiếng để làm điều đó.


0

Tôi có một giải pháp tốt hơn ngắn và hoạt động hoàn hảo với tôi. Tôi đã sử dụng nó để quay video. Và nó mô phỏng hoàn hảo các tùy chọn bìa trong css.

Javascript

    $(window).resize(function(){
            //use the aspect ration of your video or image instead 16/9
            if($(window).width()/$(window).height()>16/9){
                $("video").css("width","100%");
                $("video").css("height","auto");
            }
            else{
                $("video").css("width","auto");
                $("video").css("height","100%");
            }
    });

Nếu bạn lật if, nếu không bạn sẽ nhận được.

Và đây là css. (Bạn không cần sử dụng nó nếu bạn không muốn định vị trung tâm, div cha phải là " vị trí: tương đối ")

CSS

video {
position: absolute;
-webkit-transform: translateX(-50%) translateY(-50%);
transform: translateX(-50%) translateY(-50%);
top: 50%;
left: 50%;}

0

Tôi chỉ giải quyết điều này và muốn chia sẻ. Điều này hoạt động với Bootstrap 4. Nó hoạt động với imgnhưng tôi đã không kiểm tra nó với video. Đây là HAML và SCSS

HAML
.container
  .detail-img.d-flex.align-items-center
    %img{src: 'http://placehold.it/1000x700'}
SCSS
.detail-img { // simulate background: center/cover
  max-height: 400px;
  overflow: hidden;

  img {
    width: 100%;
  }
}

/* simulate background: center/cover */
.center-cover { 
  max-height: 400px;
  overflow: hidden;
  
}

.center-cover img {
    width: 100%;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container">
  <div class="center-cover d-flex align-items-center">
    <img src="http://placehold.it/1000x700">
  </div>
</div>


0

Câu hỏi cũ, nhưng trong trường hợp bất cứ ai nhìn thấy điều này, câu trả lời tốt nhất theo ý kiến ​​của tôi là chuyển đổi video thành GIF hoạt hình. Điều này cho phép bạn kiểm soát nhiều hơn và bạn chỉ có thể coi nó như một hình ảnh. Đó cũng là cách duy nhất để nó hoạt động trên thiết bị di động, vì bạn không thể tự động phát video. Tôi biết câu hỏi đang yêu cầu thực hiện trong <img>thẻ, nhưng tôi không thực sự thấy nhược điểm của việc sử dụng <div>và làmbackground-size: cover


Đây là một ý tưởng hay và trong một số trường hợp đáng để thử. Chỉ có nhược điểm là * .gif (trong trường hợp của tôi) lớn hơn trong kích thước tệp. Tôi đã chuyển đổi 2,5 MB * .mpeg thành 16MB * .gif.
Henning Fischer

Tôi đồng ý, và thường .giflà kích thước lớn hơn nhiều, trong khi cũng mờ hơn. Quan điểm của tôi đã thay đổi kể từ khi tôi viết câu trả lời này. Thật xấu hổ khi bạn không thể kết hợp tốt nhất của cả hai.
D-Marc

Tôi đã kết thúc với một (rút ngắn) * .gif cho thiết bị di động và * .mp4 cho máy tính để bàn.
Henning Fischer
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.