Масштабирование и перемещение 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. Я дошел до использования трюка "процент заполнения", но умное использование единиц просмотра этого ответа имеет решающее значение для этой работы.
ключом к реализации этого поведения является обеспечение двух вещей:
- что
iframe
всегда поддерживает то же соотношение сторон, что и его видеоконтент 16: 9. Это обеспечит никакой черной "прокладки" нет вокруг внешней стороны видео - что
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, которое я не думаю, что это возможно, но я могу ошибаться, но я опубликовал этот ответ, потому что он может помочь другим людям с той же проблемой)