像 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" 技巧,但这个答案对视口单位的巧妙使用对这项工作至关重要。
实现此行为的关键是确保两件事:
iframe
始终保持与其视频内容相同的宽高比 16:9。这将确保视频外部没有黑色 "padding"
iframe
始终填充 height
或 width
,具体取决于视口的大小
保持元素纵横比的一种方法是使用 "padding percentage" trick,它利用了 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;
将相对于视口的 width
设置 height
。这是通过 9 / (16 / 100) = 56.25 计算得出的
width: 177.77777778vh;
将相对于视口的 height
设置 width
。这是通过 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 units are widely supported,所以只要您不针对旧浏览器,此方法就应该有效。
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" 技巧,但这个答案对视口单位的巧妙使用对这项工作至关重要。
实现此行为的关键是确保两件事:
iframe
始终保持与其视频内容相同的宽高比 16:9。这将确保视频外部没有黑色 "padding"iframe
始终填充height
或width
,具体取决于视口的大小
保持元素纵横比的一种方法是使用 "padding percentage" trick,它利用了 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;
将相对于视口的width
设置height
。这是通过 9 / (16 / 100) = 56.25 计算得出的
width: 177.77777778vh;
将相对于视口的height
设置width
。这是通过 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 units are widely supported,所以只要您不针对旧浏览器,此方法就应该有效。