จำลองขนาดพื้นหลัง: ครอบคลุมใน <video> หรือ <img>


154

ฉันจะจำลองการทำงานของbackground-size:coverองค์ประกอบ html เช่น<video>หรือได้<img>อย่างไร

ฉันต้องการให้มันทำงาน

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

1
โอเคฉันไม่เคยใช้ background-size: cover; แต่ฉันดูทางออนไลน์ดังนั้นสิ่งที่คุณต้องการคือวิธีที่จะมีภาพ / วิดีโอแบบเต็มหน้าจอซึ่งปรับขนาดเมื่อปรับขนาดหน้าต่าง
Lennart

ใช่ coverแต่มีรายละเอียดปลีกย่อยที่มี ดูพื้นหลังขนาด 101 ในการเชื่อมโยง
seron

ตกลงเพื่อลดความกว้าง 100% ของรูปภาพ / วิดีโอและหากมีการล้นก็จะถูกตัด? หากคุณต้องการสิ่งนี้ฉันสามารถดูว่าฉันสามารถเขียนโค้ดนั้นได้หรือไม่ แต่สำหรับวิดีโอคุณควรจำไว้ว่าคุณต้องมีเครื่องเล่นที่กำหนดเองเพราะในเบราว์เซอร์ส่วนใหญ่ตัวควบคุมจะอยู่ที่ด้านล่างของเครื่องเล่นและจะถูกตัดหากมี เป็นล้น ...
Lennart

ใช่ล้นอย่างเท่าเทียมกันในด้านตรงข้าม ฉันตระหนักถึงปัญหาการควบคุมวิดีโอ
seron

1
ถ้าหน้าต่างสูงกว่าภาพมันจะเว้นที่ว่างไว้ตามแนวแกนฉันคิด ในกรณีเช่นนี้ภาพควรล้นด้านข้างและความสูงของภาพจะเหมือนกับหน้าต่าง และการสนทนาควรเกิดขึ้นเมื่อหน้าต่างกว้างกว่าภาพ
seron

คำตอบ:


142

นี่คือสิ่งที่ฉันดึงผมออกไปซักพักหนึ่ง แต่ฉันได้พบกับโซลูชันที่ยอดเยี่ยมที่ไม่ได้ใช้สคริปต์ใด ๆ และสามารถบรรลุการจำลองหน้าปกที่สมบูรณ์แบบในวิดีโอด้วย CSS 5 บรรทัด (9 ถ้าคุณนับตัวเลือกและวงเล็บ ) นี้มี 0 ขอบในกรณีที่มันไม่ทำงานอย่างสมบูรณ์แบบสั้น ๆ ของ CSS3

คุณสามารถดูตัวอย่างได้ที่นี่

ปัญหาเกี่ยวกับวิธีแก้ปัญหาของทิโมธีคือไม่สามารถปรับสเกลได้อย่างถูกต้อง หากองค์ประกอบรอบข้างมีขนาดเล็กกว่าไฟล์วิดีโอก็จะไม่ลดขนาดลง แม้ว่าคุณจะให้ขนาดเริ่มต้นเล็ก ๆ ของแท็กวิดีโอเช่น 16px คูณ 9px แต่autoก็บังคับให้ใช้ขนาดไฟล์ดั้งเดิมน้อยที่สุด ด้วยวิธีแก้ปัญหาที่ได้รับคะแนนสูงสุดในหน้านี้มันเป็นไปไม่ได้ที่ฉันจะลดขนาดไฟล์วิดีโอลงทำให้มีผลการซูมที่รุนแรง

หากทราบอัตราส่วนของวิดีโอของคุณเช่น 16: 9 คุณสามารถทำสิ่งต่อไปนี้:

.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 */
}

หากองค์ประกอบหลักของวิดีโอถูกตั้งค่าให้ครอบคลุมทั้งหน้า (เช่นposition: fixed; width: 100%; height: 100vh;) วิดีโอก็จะแสดงเช่นกัน

หากคุณต้องการให้วิดีโออยู่ตรงกลางเช่นกันคุณสามารถใช้วิธีการจัดกึ่งกลางแบบ Surefire:

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

แน่นอนvw, vhและtransformมี CSS3 ดังนั้นหากคุณต้องเข้ากันได้กับเบราว์เซอร์เก่ามากคุณจะต้องใช้สคริปต์


3
นี่คือคำตอบที่ดีที่สุด ไม่มี javascript, pure CSS, ปรับขนาดได้อย่างถูกต้องและอยู่กึ่งกลาง
mark.monteiro

6
อ่าชาย นี่คือคำตอบสำหรับปี 2016 ไม่ต้องสนใจคนอื่นทั้งหมด
Josh Burson

คุณสนใจที่จะอธิบายว่าทำไมสิ่งนี้ถึงได้ผล ฉันไม่สามารถก้มหน้าไปรอบ ๆ มันได้ ทำอะไรvhและvwต้องทำอะไร
commonpike

1
@insidesin: โพสต์ซอหรือไม่?
M-Pixel

2
ในปีพ. ศ. 2563 ทางออกที่ดีที่สุดคือการใส่วัตถุ: ครอบคลุมตามที่อธิบายไว้ในคำตอบโดยDaniël de Wit
Brett Donald

128

jsFiddle

การใช้ฝาครอบพื้นหลังนั้นใช้ได้ดีสำหรับรูปภาพและความกว้าง 100% สิ่งเหล่านี้ไม่เหมาะ<video>และคำตอบเหล่านี้ซับซ้อนเกินไป คุณไม่ต้องการ jQuery หรือ JavaScript เพื่อให้ได้ภาพพื้นหลังแบบเต็มความกว้าง

โปรดทราบว่ารหัสของฉันจะไม่ครอบคลุมพื้นหลังอย่างสมบูรณ์ด้วยวิดีโออย่างปก แต่จะทำให้วิดีโอมีขนาดใหญ่เท่าที่จำเป็นต้องรักษาอัตราส่วนภาพและยังครอบคลุมพื้นหลังทั้งหมด วิดีโอส่วนเกินใด ๆ จะตกขอบหน้าซึ่งจะขึ้นอยู่กับตำแหน่งที่คุณยึดวิดีโอไว้

คำตอบนั้นง่ายมาก

เพียงใช้โค้ดวิดีโอ HTML5 นี้หรือบางอย่างตามบรรทัดเหล่านี้: (ทดสอบในแบบเต็มหน้า)

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>

ความสูงต่ำสุดและความกว้างต่ำสุดจะช่วยให้วิดีโอสามารถรักษาอัตราส่วนภาพของวิดีโอซึ่งโดยปกติแล้วจะเป็นอัตราส่วนภาพของเบราว์เซอร์ปกติใด ๆ ที่ความละเอียดปกติ วิดีโอส่วนเกินใด ๆ ที่มีเลือดออกด้านข้างของหน้า


2
มันง่ายกว่าคำตอบอื่น ๆ และใช้ได้ดีสำหรับฉัน เพียงแค่ตั้งค่าmin-widthหรือmin-heightเล่นกล
Ryan Burney

31
วิธีนี้ไม่ได้อยู่ตรงกลางของวิดีโออย่างที่ปก
weotch

1
เพียงความคิดเห็นเพื่อป้องกันมือใหม่ดึงผมออก: #video_background {ควรเป็น #videobackground {
carrabino

21
สิ่งนี้ไม่ลดขนาดวิดีโอเลย (ฉันไม่ได้ลองเพิ่มขนาด) ซึ่งทำให้เกิดปัญหามากมายหากหน้าต่างเบราว์เซอร์มีขนาดเล็กและวิดีโอมีขนาดใหญ่ ดังนั้นโดยทั่วไปจะดูแลเฉพาะส่วนที่มีเลือดออกของขนาดพื้นหลัง: ปกไม่ใช่ส่วนที่ปรับขนาด
Kevin Newman

4
ด้วยเทคโนโลยีปัจจุบันคำตอบนี้ควรได้รับการยอมรับ: โซลูชัน CSS เหมาะสำหรับ Javascript แม้ว่าจะต้องให้คุณตั้งค่า parentNode ของคุณอย่างถูกต้อง position: absolute; left: 50%; top: 50%; transform: translateX(-50%) translateY(-50%);สำหรับศูนย์กลางวิดีโอใช้นี้
Sjeiti

101

สำหรับเบราว์เซอร์บางตัวคุณสามารถใช้ได้

object-fit: cover;

http://caniuse.com/object-fit


15
นี่เป็นการประกาศที่มีประสิทธิภาพมากซึ่งหากเบราว์เซอร์นำมาใช้จะทำให้สิ้นเปลืองมากกับการปรับขนาดสิ่งต่าง ๆ บนเว็บไซต์
Mike Kormendy

1
นี่คือสิ่งที่ฉันกำลังมองหา!
Peter_Fretter

3
มี polyfill สำหรับคิ้วที่ไม่สนับสนุน (ยัง): github.com/anselmh/object-fit
creimers

7
height: 100%; width: 100%;จะต้องนำไปใช้เช่นกัน ขอบคุณสำหรับคำตอบที่ทันสมัย
Jossef Harush

ฉันทำคำตอบขึ้นอยู่กับหนึ่งนี้กับตัวอย่างและข้อมูล ขอบคุณสำหรับการชี้ให้เห็นคุณลักษณะนี้!
aloisdg กำลังย้ายไปยัง codidact.com

43

นี่คือสิ่งที่ฉันทำ ตัวอย่างการทำงานอยู่ในjsFiddleนี้

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>


เหตุใดโซลูชันนี้จึงลดลง สำหรับทุกเจตนาและวัตถุประสงค์ดูเหมือนว่าจะแก้ปัญหา
Jan

2
นี่เป็นทางออกที่ดีที่สุดที่ฉันพบสำหรับปัญหานี้ ขอบคุณ!
Chaser324

1
วิธีนี้ใช้งานได้ดีหากวิดีโอมีขนาดใหญ่และหน้าต่างมีขนาดเล็ก แต่จะไม่ทำงานสำหรับฉันหากหน้าต่างใหญ่กว่าวิดีโอและวิดีโอจำเป็นต้องมีการลดอัตราการสุ่มสัญญาณ ฉันเพิ่มเคล็ดลับขั้นต่ำจาก @ Timothy-Ryan-Carpenter ( ตอบลงที่นี่ ) ลงในแท็กวิดีโอเป็น: video { min-width: 100%; min-height: 100%; }และใช้งานได้เหมือนมีเสน่ห์
Alexandre DuBreuil

ฉันพบว่าวิธีนี้มีประโยชน์เช่นกันและบรรจุเป็นปลั๊กอิน jQuery แบบง่ายสำหรับผู้ที่สนใจ: github.com/aMoniker/jquery.videocover
Jim Greenleaf

แม้จะมีสิ่งที่ @AlexandreDuBreuil พูดถึง แต่วิดีโอนี้ก็ปรับขนาดได้ดี (ดูด้วยตัวคุณเอง: fiddle.jshell.net/GCtMm/show ) นี่เป็นทางออกที่ดีที่สุดอย่างแน่นอน น่าเสียดายที่ JS หนักมากเมื่อเทียบกับคำตอบอื่น ๆ ที่นี่ แต่นั่นคือสิ่งที่คุณต้องการหากคุณต้องการbackground-size: coverวิดีโอ
Chuck Le Butt

14

คำตอบอื่น ๆ นั้นดี แต่พวกเขาเกี่ยวข้องกับจาวาสคริปต์หรือไม่ได้จัดกึ่งกลางวิดีโอในแนวนอนและแนวตั้ง

คุณสามารถใช้โซลูชัน CSS เต็มรูปแบบนี้เพื่อให้วิดีโอที่จำลองคุณสมบัติพื้นหลัง: หน้าปก:

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

สิ่งนี้ไม่ได้ผลสำหรับฉัน วิดีโอไม่ได้ขยายใหญ่เต็มหน้าจอ ฉันเห็น html ของคุณสำหรับตัวอย่างนี้ได้ไหม มันเป็นเพียงแท็กวิดีโอในร่างกายหรือไม่
ด้าน

ทางออกที่ดีจริงๆ มันไม่ได้ผลสำหรับฉันในตอนแรก แต่มันอาจเป็นสิ่งที่ฉันพลาดเพราะเมื่อฉันคัดลอกและวาง CSS ของคุณมันใช้งานได้! ขอบคุณ;)
rafaelbiten

2
ทำงานได้ดีสำหรับฉัน ฉันเพิ่งเปลี่ยนตำแหน่ง: คงที่แน่นอน
Assaf Katz

14

จากคำตอบและความคิดเห็นของ Daniel de Witฉันค้นหาอีกเล็กน้อย ขอบคุณเขาสำหรับการแก้ปัญหา

ทางออกคือการใช้object-fit: cover;ที่มีการสนับสนุนที่ดี(ทุกเบราว์เซอร์ที่ทันสมัยรองรับ) ถ้าคุณอยากที่จะสนับสนุน IE คุณสามารถใช้ polyfill เหมือนวัตถุพอดีภาพหรือวัตถุพอดี

ตัวอย่าง:

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

และกับผู้ปกครอง:

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
คำตอบที่ทันสมัยที่สุด
Routhinator

1
นี่คือคำตอบสำหรับทุกคนที่กำหนดเป้าหมายเบราว์เซอร์ที่ทันสมัย การใช้object-fit: coverและwidthและheightชุดถึง 100% คุณจะได้รับสัดส่วนปรับขนาดimgหรือvideoซูมศูนย์โดยไม่ต้องยุ่งยากใด ๆ
phip

13

วิธีแก้ปัญหาของ M-Pixelนั้นยอดเยี่ยมมากในการแก้ปัญหาการปรับขนาดของคำตอบของ Timothy (วิดีโอจะขยายขนาด แต่ไม่ลดลงดังนั้นหากวิดีโอของคุณมีขนาดใหญ่มากมีโอกาสที่ดีที่คุณจะเห็นเพียงส่วนเล็ก ๆ อย่างไรก็ตามโซลูชันนั้นตั้งอยู่บนสมมติฐานที่ผิดที่เกี่ยวข้องกับขนาดของคอนเทนเนอร์วิดีโอนั่นคือจำเป็นต้องมีความกว้างและความสูงของวิวพอร์ต 100% ฉันได้พบบางกรณีที่มันไม่ได้ทำงานสำหรับฉันดังนั้นฉันตัดสินใจที่จะจัดการปัญหาตัวเองและฉันเชื่อว่าฉันมากับทางออกที่ดีที่สุด

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

นอกจากนี้ยังขึ้นอยู่กับอัตราส่วนของวิดีโอดังนั้นหากวิดีโอของคุณมีอัตราส่วนนอกเหนือจาก 16/9 คุณจะต้องการเปลี่ยน% padding-bottom% นอกเหนือจากนั้นมันทำงานนอกกรอบ ทดสอบใน IE9 +, Safari 9.0.1, Chrome 46 และ Firefox 41

แก้ไข (17 มีนาคม 2559)

เนื่องจากฉันโพสต์คำตอบนี้ฉันได้เขียนโมดูล CSS ขนาดเล็กเพื่อจำลองทั้งองค์ประกอบbackground-size: coverและbackground-size: containใน<video>: http://codepen.io/benface/pen/NNdBMj

รองรับการจัดตำแหน่งที่แตกต่างกันสำหรับวิดีโอ (คล้ายกับbackground-position) โปรดทราบว่าการcontainดำเนินการไม่สมบูรณ์ ซึ่งแตกต่างจากbackground-size: containมันจะไม่ปรับขนาดวิดีโอให้เกินขนาดจริงหากความกว้างและความสูงของคอนเทนเนอร์ใหญ่กว่า แต่ฉันคิดว่ามันยังมีประโยชน์ในบางกรณี ฉันยังได้เพิ่มคลาสพิเศษfill-widthและfill-heightคลาสที่คุณสามารถใช้ร่วมกับcontainเพื่อรับการผสมผสานพิเศษcontainและcover... ลองและรู้สึกอิสระที่จะปรับปรุง!


นี่ไม่ใช่การปรับขนาดวิดีโอเหนือความละเอียดปกติเพื่อให้พอดีกับความกว้าง / ความสูง 100% ไม่ว่าจะเกิดอะไรขึ้น ดังนั้นจึงไม่ได้จำลองฟังก์ชั่น 'ปก'
jetlej

@jetlej มันทำที่นี่ คุณกำลังทดสอบเบราว์เซอร์ใด คุณดู codepen ของฉัน
benface

1
มันทำงานได้ดีเหมือนทางเลือกสำหรับ Edge สำหรับฉัน ไชโย
MrThunder

@MrThunder คุณใช้อะไรเป็นโซลูชันหลักหากคุณใช้เป็นทางเลือก
benface

1
@ benoitr007 ฉันใช้object-fit: coverสำหรับ FF และโครเมี่ยมและวิธีแก้ปัญหาของคุณกับ Modernizr สำหรับ IE
MrThunder


4

CSS และ js เล็กน้อยสามารถทำให้วิดีโอครอบคลุมพื้นหลังและจัดกึ่งกลางแนวนอน

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: (ผูกสิ่งนี้กับปรับขนาดหน้าต่างและโทรแยกครั้งเดียว)

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

3

หลังจากส่วนความคิดเห็นที่ยาวนานของเราฉันคิดว่านี่คือสิ่งที่คุณกำลังมองหามันเป็น 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;
}

โค้ดด้านบนใช้ความกว้างและความสูงของเบราว์เซอร์หากคุณทำสิ่งนี้ภายใน 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;
}

ฉันควรจะระบุว่าฉันได้ทดสอบเพียงนี้คือ Google Chrome ... นี่คือ jsfiddle: http://jsfiddle.net/ADCKk/


ดูเหมือนว่า jsfiddle จะไม่ทำอะไรเลยเมื่อฉันเปลี่ยนขนาดของเฟรมผลลัพธ์หรือขนาดเบราว์เซอร์ ฉันลองสิ่งนี้ใน Chrome
seron

ฉันได้อัปเดตแล้ว แต่ฉันยังมีปัญหาเล็กน้อยที่ถ้าคุณลดความกว้างลงมากมันก็กระโดด ... jsfiddle.net/ADCKk/1
Lennart

โอเคขอโทษ แต่ฉันไร้เดียงสาฉันพยายามหลายสิ่งหลายอย่างที่ฉันคิดว่าฉันสับสนตัวเองฉันไม่แน่ใจว่าเป็นไปได้หรือไม่ ... สคริปต์ด้านบนใช้งานได้เฉพาะเมื่อคุณรีเฟรชหน้าเว็บเพื่อให้ทำงานได้ เมื่อคุณปรับขนาดหน้าต่างคุณจะต้องใช้เหตุการณ์ window.resize ใน js แต่ฉันไม่สามารถทำงานได้บางทีคุณอาจใช้ข้อมูลนั้นได้ :) ขอให้โชคดี
Lennart

3

คำตอบยอดนิยมจะไม่ย่อขนาดวิดีโอเมื่อคุณมีความกว้างเบราว์เซอร์น้อยกว่าความกว้างของวิดีโอ ลองใช้ CSS นี้ (โดยที่ #bgvid เป็นรหัสวิดีโอของคุณ):

#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%);
}

เป็นลบทำไมz-indexจำเป็น?
aleclarson

ไม่เป็นประโยชน์เพียงแค่เมื่อออกแบบด้วยองค์ประกอบหลายชั้น ฉันลบมันแล้ว
Ramzi Dreessen

1

ฉัน gunna โพสต์วิธีการแก้ปัญหานี้เช่นกันเนื่องจากฉันมีปัญหานี้ แต่โซลูชั่นอื่น ๆ ไม่ทำงานสำหรับสถานการณ์ของฉัน ...

ฉันคิดว่าการจำลองbackground-size:cover;คุณสมบัติ css อย่างถูกต้องในองค์ประกอบแทนที่จะเป็นคุณสมบัติภาพพื้นหลังองค์ประกอบคุณจะต้องเปรียบเทียบอัตราส่วนภาพกับอัตราส่วนหน้าต่างปัจจุบันดังนั้นไม่ว่าขนาดใด (และในกรณีที่ภาพนั้นเป็น สูงกว่ากว้างกว่า) หน้าต่างคือองค์ประกอบกำลังเติมหน้าต่าง (และอยู่ตรงกลางแม้ว่าฉันไม่รู้ว่านั่นเป็นข้อกำหนด)

ใช้ภาพเพียงเพื่อความเรียบง่ายฉันมั่นใจว่าองค์ประกอบวิดีโอจะทำงานได้ดีเช่นกัน

ก่อนรับอัตราส่วนองค์ประกอบ (เมื่อโหลด) แล้วแนบตัวจัดการปรับขนาดหน้าต่างเรียกมันครั้งเดียวสำหรับการปรับขนาดเริ่มต้น:

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();
}

จากนั้นในตัวจัดการปรับขนาดของคุณคุณควรกำหนดว่าจะเติมความกว้างหรือเติมความสูงก่อนโดยการเปรียบเทียบอัตราส่วนภาพปัจจุบันของหน้าต่างกับอัตราส่วนภาพดั้งเดิม

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

วิธีการนี้ใช้ css และ html คุณสามารถกอง div ด้านล่างวิดีโอได้อย่างง่ายดาย มันครอบคลุม แต่ไม่อยู่กึ่งกลางในขณะที่คุณปรับขนาด

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

@ Hidden Hobbes

คำถามนี้มีค่าหัวเปิด +100 ชื่อเสียงจาก Hidden Hobbes ซึ่งสิ้นสุดใน 6 วัน การใช้หน่วย viewport ในการประดิษฐ์เพื่อรับโซลูชัน CSS ที่ยืดหยุ่นเท่านั้น

คุณเปิดรับรางวัลสำหรับคำถามนี้สำหรับโซลูชัน CSS เท่านั้นดังนั้นฉันจะลองดู ทางออกของปัญหาเช่นนี้คือการใช้อัตราส่วนคงที่เพื่อตัดสินใจความสูงและความกว้างของวิดีโอ ฉันมักจะใช้ Bootstrap แต่ฉันแยก CSS ที่จำเป็นออกจากที่นั่นเพื่อให้ทำงานได้โดยไม่ต้องใช้ นี่คือรหัสที่ฉันใช้ก่อนหน้านี้กับวิดีโออื่น ๆ รวมวิดีโอที่มีอัตราการฝังที่ถูกต้อง มันควรจะทำงานให้<video>และ<img>องค์ประกอบเกินไปมันเป็นหนึ่งด้านบนที่มีความเกี่ยวข้องที่นี่ แต่ฉันให้คุณอีกสองคนเป็นอย่างดีตั้งแต่ผมแล้วพวกเขาได้วางรอบ ขอให้โชคดี! :)

ตัวอย่าง 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
ขอบคุณสำหรับคำตอบ @turbopipp แม้ว่าฉันจะกลัวว่าคุณเข้าใจผิดว่าเป็นเพราะเงินรางวัลของฉัน ฉันยกมันขึ้นมาเพื่อที่ฉันจะได้ให้รางวัลกับคำตอบที่มีอยู่มันไม่ยอมให้ฉันทำจนกว่าเงินรางวัลจะเปิดใช้งานเป็นเวลา 24 ชั่วโมง ถึงกระนั้น +1 สำหรับความพยายามของคุณเคล็ดลับการแพ็ดเปอร์เซ็นต์เป็นวิธีที่มีประโยชน์เพื่อให้แน่ใจว่าองค์ประกอบยังคงรักษาอัตราส่วนที่ถูกต้องไว้
ฮอบส์ที่ซ่อนอยู่

อ๊ะมันไม่ยุ่งยากจริงๆและเป็นเรื่องดีสำหรับคุณที่จะให้คำตอบที่มีอยู่แล้ว ฉันเดาว่าฉันควรอ่านข้อมูลในระบบค่าหัว :) ขอบคุณ
turbopipp

0

เพื่อตอบความคิดเห็นจากweotchว่าคำตอบของTimothy Ryan Carpenterไม่ได้คำนึงถึงการcoverอยู่กึ่งกลางของพื้นหลังฉันเสนอการแก้ไข CSS ด่วนนี้:

CSS:

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

การเพิ่มสองบรรทัดนี้จะทำให้องค์ประกอบใด ๆ อยู่ตรงกลาง ยิ่งไปกว่านั้นเบราว์เซอร์ทั้งหมดที่สามารถจัดการวิดีโอ HTML5 ยังรองรับการแปลง CSS3 ดังนั้นสิ่งนี้จะทำงานได้เสมอ

CSS ที่สมบูรณ์มีลักษณะเช่นนี้

#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%);
}

ฉันได้แสดงความคิดเห็นโดยตรงกับคำตอบของทิโมธี แต่ฉันไม่มีชื่อเสียงพอที่จะทำเช่นนั้น


0

พวกฉันมีทางออกที่ดีกว่ามันสั้นและทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน ฉันใช้มันกับวิดีโอ และเลียนแบบตัวเลือกที่สมบูรณ์แบบใน css

จาวาสคริ

    $(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%");
            }
    });

หากคุณพลิกถ้าอื่นคุณจะได้รับการบรรจุ

และนี่คือ CSS (คุณไม่จำเป็นต้องใช้มันหากคุณไม่ต้องการตำแหน่งศูนย์ผู้ปกครองต้องเป็น " ตำแหน่ง: ญาติ ")

CSS

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

0

ฉันเพิ่งแก้ไขปัญหานี้และต้องการแบ่งปัน นี้ทำงานร่วมกับเงินทุน 4. จะทำงานร่วมกับแต่ผมไม่ได้ทดสอบกับimg videoนี่คือ HAML และ 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

คำถามเก่า แต่ในกรณีที่มีใครเห็นสิ่งนี้คำตอบที่ดีที่สุดในความคิดของฉันคือการแปลงวิดีโอเป็นภาพเคลื่อนไหว GIF สิ่งนี้ช่วยให้คุณควบคุมได้มากขึ้นและคุณก็สามารถทำได้เหมือนภาพ เป็นวิธีเดียวที่จะใช้งานได้บนมือถือเนื่องจากคุณไม่สามารถเล่นวิดีโออัตโนมัติ ฉันรู้ว่าคำถามกำลังขอให้ทำใน<img>แท็ก แต่ฉันไม่เห็นข้อเสียของการใช้<div>และการทำbackground-size: cover


นี่เป็นความคิดที่ดีและในบางกรณีก็ควรลองดู ข้อเสียเพียงอย่างเดียวคือ * .gif มีขนาดใหญ่ขึ้น (ในกรณีของฉัน) ในขนาดไฟล์ ฉันแปลง 2.5MB * .mpeg เป็น 16MB * .gif
Henning Fischer

ฉันเห็นด้วยและบ่อยครั้งที่.gifขนาดใหญ่กว่ามากในขณะที่ยังพร่ามัว มุมมองของฉันเปลี่ยนไปตั้งแต่ฉันเขียนคำตอบนี้ เป็นเรื่องน่าละอายที่คุณไม่สามารถรวมสิ่งที่ดีที่สุดทั้งสอง
D-Marc

ฉันลงเอยด้วย (สั้นลง) * .gif สำหรับมือถือและ * .mp4 สำหรับเดสก์ท็อป
Henning Fischer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.