像 background-size: cover 一样缩放和重新定位 iframe

Scale and reposition iframe like background-size: cover

html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}
.sized {
  height: 100%;
  position: relative;
  background: #eee;
  overflow:hidden;
  padding:0;
}
.sized iframe {
  position:absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
}
@media (min-width: 320px) {
  height: 200%;
  top: -50%;
}
@media (min-width: 640px) {
  height: 180%;
  top: -40%;
}
<div class="sized">
  <iframe src="https://player.vimeo.com/video/135335257?autoplay=false" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
</div>

<h3>Original video</h3>
<iframe src="https://player.vimeo.com/video/135335257?autoplay=false" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>

当我在片段结果中收到 cookies 同源错误时,这里是一个镜像:

https://jsfiddle.net/07Lffw5x/2/embedded/result/

[edit] 也许 this is a better demo, if you compare to this one,差别不大……为什么? [/编辑]

我正在尝试为 iframe 复制背景大小的封面。

问题是它似乎重新缩放了视频,仅适用于更大的尺寸,

问题,

rescales可以在每个断点生效吗?或者 vimeo 播放器可能会自行调整大小?

好的。优点不是我的,因为我得到了 jquery here

我记得这个问题,因为我在我的一个旧项目中使用过它,我想检查它是否可以与 iframe 一起工作。确实如此。

基本上就是这样 css:

.container {
    position: absolute;
    top: 0;
    overflow: hidden;
}

和这个 jquery:

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('iframe').attr('width'));
    vid_h_orig = parseInt(jQuery('iframe').attr('height'));

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

function resizeToCover() {

    // set the video viewport to the window size
    jQuery('.container').width(jQuery(window).width());
    jQuery('.container').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('iframe').width(scale * vid_w_orig);
    jQuery('iframe').height(scale * vid_h_orig);
    // and center it by scrolling the video viewport
    jQuery('.container').scrollLeft((jQuery('iframe').width() - jQuery(window).width()) / 2);
    jQuery('.container').scrollTop((jQuery('iframe').height() - jQuery(window).height()) / 2);
};

你得到这个:JSFIDDLE

(我知道您正在寻找一个纯粹的 css 解决方案,我认为这不可能,但我可能是错的,但我发布了这个答案,因为它可以帮助其他遇到同样问题的人)

与 Alvaro Menendez 的回答类似,信用需要转到 Qwertman 的这个回答 Whosebug。com/a/29997746/3400962。我使用了 "padding percentage" 技巧,但这个答案对视口单位的巧妙使用对这项工作至关重要。

实现此行为的关键是确保两件事:

  1. iframe 始终保持与其视频内容相同的宽高比 16:9。这将确保视频外部没有黑色 "padding"
  2. iframe 始终填充 heightwidth,具体取决于视口的大小

保持元素纵横比的一种方法是使用 "padding percentage" trick,它利用了 topbottom padding 使用 width 的元素作为其取值的基础。使用公式 B / (A / 100) = C% 我们可以计算出所需的填充百分比。鉴于视频的比例为 16 : 9,这将转换为 9 / (16 / 100) = 56.25。

唯一的问题是,在你的情况下,水平轴和垂直轴都需要计算(因为我们不知道视口的尺寸),这个技巧不适用于 leftright padding 以获得相对于 height.

的纵横比

html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}
.container {
    background: #eee;
    height: 100%;
    overflow: hidden;
    padding: 0;
    position: relative;
}
.inner {
    left: 50%;
    min-height: 43.75%;
    padding-top: 56.25%;
    position:absolute;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 100%;
}
.container iframe {
    bottom: 0;
    height: 100%;
    left: 0;
    position:absolute;
    right: 0;
    top: 0;
    width: 100%;
}
<div class="container">
    <div class="inner">
        <iframe src="https://player.vimeo.com/video/135335257?autoplay=false" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
    </div>
</div>

https://jsfiddle.net/w45nwprn/(片段不显示视频,请参阅fiddle)

幸运的是,在您的情况下,您希望视频适合整个屏幕,因此视口单位可用于计算纵横比而不是百分比。这允许使用计算 widthheight 的关系,反之亦然:

  • left: 50%;top: 50%;transform: translate(-50%, -50%); 需要使 iframe.container
  • 中居中 要求
  • min-height: 100%;min-width: 100%;保证heightwidth永远不小于.container
  • height: 56.25vw; 将相对于视口的 width 设置 height。这是通过 9 / (16 / 100) = 56.25
  • 计算得出的
  • width: 177.77777778vh; 将相对于视口的 height 设置 width。这是通过 16 / (9 / 100) = 177.77777778
  • 计算得出的

因为 heightwidth 永远不能低于 100% 但必须保持正确的宽高比,视频将始终覆盖整个视口。

html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}
.container {
    background: #eee;
    height: 100%;
    overflow: hidden;
    padding: 0;
    position: relative;
}
iframe {
    box-sizing: border-box;
    height: 56.25vw;
    left: 50%;
    min-height: 100%;
    min-width: 100%;
    transform: translate(-50%, -50%);
    position: absolute;
    top: 50%;
    width: 177.77777778vh;
}
<div class="container">
    <iframe src="https://player.vimeo.com/video/135335257?autoplay=false" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe>
</div>

https://jsfiddle.net/qk00ehdr/(片段不显示视频,请参阅fiddle)

Viewport units are widely supported,所以只要您不针对旧浏览器,此方法就应该有效。