Масштабирование и перемещение iframe как фон-размер: обложка

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>

Как я получаю куки той же ошибки происхождения в результате фрагментов, вот зеркало:

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

[edit] возможно этой лучше демо, если вы сравните с этот, нет большой разницы... почему? [/edit]

Я пытаюсь воспроизвести обложку фонового размера для iframe.

дело в том, что он кажется, масштабировать видео, только для больших размеров,

вопрос

может раскаляясь действовать на каждую точку останова? или игрок vimeo может масштабироваться по своему усмотрению?

2 ответов


подобно ответу Альваро Менендеса, кредит должен пойти на этот ответ stackoverflow.com/a/29997746/3400962 qwertman. Я дошел до использования трюка "процент заполнения", но умное использование единиц просмотра этого ответа имеет решающее значение для этой работы.

ключом к реализации этого поведения является обеспечение двух вещей:

  1. что iframe всегда поддерживает то же соотношение сторон, что и его видеоконтент 16: 9. Это обеспечит никакой черной "прокладки" нет вокруг внешней стороны видео
  2. что iframe всегда заполняет height или width в зависимости от размера области просмотра

один из способов сохранить соотношение сторон элемента-использовать "процент заполнения" трюк, который использует тот факт, что top и bottom padding использует width элемента в качестве основы для их стоимости. Используя формулу B / (A / 100) = C%, мы можем рассчитать необходимый процент для заполнения. Учитывая, что видео имеет соотношение 16 : 9, это переводится в 9 / (16 / 100) = 56.25.

единственная проблема заключается в том, что в вашем случае расчет необходим как для горизонтальной, так и для вертикальной оси (поскольку мы не знаем, какие размеры будут в окне просмотра), и этот трюк не будет работать с left и right 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)

к счастью, в вашем случае вы хотите, чтобы видео соответствовало всему экрану, поэтому единицы просмотра могут использоваться для расчета соотношения сторон вместо процентов. Это позволяет использовать для расчета width в отношении height и наоборот:

  • left: 50%;, top: 50%; и transform: translate(-50%, -50%); а требуется центрировать iframe на .container
  • min-height: 100%; и min-width: 100%; обязаны обеспечить height и width не меньше, чем .container
  • height: 56.25vw; будет установить height в отношении width для просмотра. Это вычисляется путем выполнения 9 / (16 / 100) = 56.25
  • width: 177.77777778vh; будет установить width в отношении height для просмотра. Это рассчитывается путем выполнения 16 / (9 / 100) = 177.77777778

потому что height и width не может быть ниже 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 широко поддержаны, так как вы не ориентируетесь на старые браузеры, это метод должен работать.


Ok. Заслуга не моя, так как я получил jquery здесь

Я вспомнил этот вопрос, когда я использовал его в одном из моих старых проектов, и я хотел проверить, будет ли он работать так же с 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, которое я не думаю, что это возможно, но я могу ошибаться, но я опубликовал этот ответ, потому что он может помочь другим людям с той же проблемой)