本文最初于 2010 年 9 月 2 日撰写,现已更新,变得更加完善。它现在可以处理不同纵横比的 YouTube 视频、新的 iframe 嵌入方法,并使用更高效的脚本。
我将此想法扩展到 涵盖所有视频。
现在有一个名为 FitVids.js 的 jQuery 插件,它可以处理绝大多数视频。

YouTube 提供的嵌入视频代码现在是一个非常简单的 iframe。以下是一个示例
<iframe width="1280" height="750" src="//www.youtube.com/embed/fXm9EwzSjO4?rel=0&hd=1" frameborder="0" allowfullscreen></iframe>
iFrames,包括上面 YouTube 代码示例,包含外部内容,无法从父页面真正测量。宽度和高度设置对于定义 iframe 的大小是必要的,因为内部内容不会帮助塑造它(就像图像一样)。但是,在元素上设置静态宽度和高度会给任何类型的流体/灵活设计带来问题。如果父区域的宽度缩小到比视频窄,视频将溢出,不会缩小以适应。
Web Designer Wall 最近发布了一篇文章,介绍如何处理响应式宽度视频。这个想法最初来自 Thierry Koblentz 他在他的网站上写过关于它,以及 A List Apart。
我喜欢那里提出的想法。它们是纯 CSS(耶!),巧妙且能很好地完成工作。但是,它们针对 YouTube 视频的解决方案有两个固有的缺点
- 视频的纵横比是预定义的。巧妙的
padding-bottom: 56.25%
方法可以实现 16:9 的纵横比,这对于某些视频来说很好,但肯定不是全部。 - 您必须使用额外的标记。每个视频都需要包装在另一个 HTML 元素中。我不会称其为非语义化,因为它可能是有意义的,比如使用
<figure>
或其他元素,但这确实需要更多工作。
如果您不关心这些问题中的任何一个,您可以随意使用它,这是一个更简洁的解决方案。如果这些问题确实很重要,我们需要使用一些 JavaScript。
使用 jQuery 实现
这个 JavaScript 解决方案的妙处在于,您只需将 YouTube 嵌入代码复制粘贴到您的页面上即可,无需考虑其他问题。您想要设置的任何纵横比都可以。并且无需额外的标记。
基本原理是
- 找出并保存页面上所有视频的纵横比。
- 当窗口大小调整时,确定内容区域的新宽度,并将所有视频调整为与其原始纵横比匹配的宽度。
以下是带有注释的完整脚本
// By Chris Coyier & tweaked by Mathias Bynens
$(function() {
// Find all YouTube videos
var $allVideos = $("iframe[src^='http://www.youtube.com']"),
// The element that is fluid width
$fluidEl = $("body");
// Figure out and save aspect ratio for each video
$allVideos.each(function() {
$(this)
.data('aspectRatio', this.height / this.width)
// and remove the hard coded width/height
.removeAttr('height')
.removeAttr('width');
});
// When the window is resized
// (You'll probably want to debounce this)
$(window).resize(function() {
var newWidth = $fluidEl.width();
// Resize all videos according to their own aspect ratio
$allVideos.each(function() {
var $el = $(this);
$el
.width(newWidth)
.height(newWidth * $el.data('aspectRatio'));
});
// Kick off one resize to fix all videos on page load
}).resize();
});
**在您自己的网站上使用此脚本**,您唯一需要更改的是 $fluidEl = $("body");
这行代码。您可以将选择器(“body”)更改为您页面上内容的响应式宽度父元素。也许是“#main-content”或其他内容,如果该元素是 <section id="main-content"></section>
。
**关于 window.resize 的说明:**每当您看到在窗口大小调整事件上运行的函数时,您都应该在脑海中敲响警钟。浏览器触发此特定事件的频率不同。WebKit 在快速调整大小期间可能会触发它无数次,因此,如果您执行大量繁重的计算工作,您可能会看到一些负面的页面性能。 这是一个来自 Paul Irish 的关于“去抖动”调整大小以解决此问题的插件,我强烈推荐。
我将“旧版本”(在本文更新之前)也包含在下载文件中(它处理“旧”类型的 YouTube 嵌入(对象/嵌入元素)。
我们国家禁止访问 YouTube
你应该搬家。
如果她的国家有防火墙,显然是共产主义国家,所以她可以居住的国家中大约有一半会让她很难搬家
哪个国家
土耳其?
为什么?
嗯,但在 Opera 10.61(win)上可以工作。您有最新版本吗?
不错的教程!
我在 Opera(Mac 最新版本)中检查了它,工作正常。它有点跳动,不是平滑的调整大小,但它有效!
真是个巧妙的技巧!看起来我需要重新设计我的个人网站使其成为流体布局。我喜欢您网站在调整窗口大小时的工作方式,非常用户友好。
感谢分享!
不幸的是,当您开启 Flashblock 时它不起作用(至少在 Firefox 中是这样)。
尽管如此,这是一个非常棒的想法!
当然它不起作用 :P
当您激活 Flashblock 时,它会阻止 YouTube 视频。
…我并不是真的那个意思
我的意思是,当您取消阻止 Flash 元素时,该脚本将无法工作,并且由于此原因,YouTube 视频不会以响应式宽度显示
window.resize 的一个问题是它可能比您想象的要频繁地触发。有些浏览器在您完成调整大小后触发它,而其他浏览器则在您调整大小的过程中持续触发它。我忘记了具体细节,但在 Stoyan Stefanov 的《面向对象的 JavaScript》一书中提到了这一点(顺便说一句,这本书很棒,http://www.amazon.com/Object-Oriented-JavaScript-Stoyan-Stefanov/dp/1847194141/?tag=w3clubs-20)。
可能不是什么大问题,但可能会对性能产生一些影响。
您可以始终限制函数调用。 这篇文章解释了一种非常优雅的方法来实现这一点。
天哪,太酷了。当 YouTube 播放器很小的时候,它的外观很可爱。:D
它在我的 Mac 上基本上可以在 Opera 10.61 上工作。尽管在拖动浏览器窗口变大或变小时会调整大小。
但基本上它工作正常。
顺便说一句,不错的技巧和教程……;)
如果我不使用 Safari 的 Youtube5 扩展程序,这对我来说会更棒。哈哈,太棒了,Chris。
哇……好主意 :)
…不得不承认——我现在太累了,没法尝试;)
感谢分享
谢谢!我前几天还在想这个问题
谢谢,这是个好东西 :)
非常感谢!这正是我朋友的网站所需要的。
哦,太棒了!!!这真是太特别了!!!
我不记得做过这个。我一定比我(和其他人)想象的更聪明!
非常有用的技巧,谢谢!
您好,以下 CSS 行
.img object, img embed
不应该写成
.img object, .img embed?
总而言之,好文章。
这是一个 CSS 解决方案 为视频创建内在比例。
效果很酷,但我认为在 body 上使用 noscript 类并设置类似这样的 CSS 是明智的
body.noscript .img object {
width: 100%;
min-height: 350px;
}
这样,纵横比就不会改变——但至少宽度会改变,而不是在没有 JS 的情况下保持固定。
Ethan Marcotte 有一个处理视频的脚本
http://unstoppablerobotninja.com/entry/fluid-images
这正是我正在寻找的,但是……
我是一个年轻的开发者,我不知道把这些脚本放在哪里!
帮帮我 :-)
伙计,这太棒了!我很高兴你找到了如何做到这一点 =D
这太棒了!一定会用它。
此外,圆角在 Safari 中也有效,不仅仅是 Chrome。
我在一个图片幻灯片中也遇到过类似的情况。客户要求它能够根据屏幕分辨率调整幻灯片的大小。
由于幻灯片非常基础(只是将一个图像叠加在另一个图像上然后淡出),我认为这很容易做到,结果却并非如此。我找到的解决方案是让所有图像(position: absolute)都包含在一个 div(position: relative)中,然后将图像剪切到 div 的边框(top:0;right:0;bottom:0;left:0)并且与 div 具有相同的宽度(width:100%)。直到我使用其中一张图像来调整 div 的大小(position:relative)它才真正起作用。
是否也可以通过这种方式使 object 和/或 embed 标签自适应调整大小?
非常棒的技术,发现圆角在 Safari 中也有效。LT
救命!
嗯……很棒,但在使用不同纵横比的视频(4:3 和 16:9)时似乎不起作用……
似乎一旦脚本获取其第一组宽度和高度数据,它就会将其应用于页面上的每个 YouTube 播放器,而不管其他播放器的宽度/高度如何。如何修改脚本以重新检查页面上的每个播放器?
:)
我明白你的意思,Sam。脚本的工作原理确实如此,它查看第一个视频的比例并将所有视频都视为该比例。我将记下尝试更新此内容以适应同一页面上不同比例的视频。
本文现已更新以解决此问题。
不错
喜欢这个
我认为 Paul 关于纯 CSS 解决方案的评论是最好的,但我认为该脚本可以通过仅处理高度来提高效率。
它仅适用于 Youtube 视频,还是适用于其他可嵌入视频(例如 Vimeo、dailymotion 等)?
感谢你的脚本。
我做了什么:给 iframe 设置正确的尺寸(而不是 height:750,给它
height:720),并在脚本末尾将“+30”追加到该行
.height(newWidth * $el.data(‘aspectRatio’) +30);
因此,导航栏(始终具有静态高度)不包含在 aspectRation 中,并且在调整大小后,视频容器中不应该再出现黑条。
难道你不喜欢 Jquery 吗,使用 iframe 的绝妙想法。
我可以使用 YouTube 作为唯一的视频源吗?
不错的资讯。我在 Firefox 3 上检查了一下,它可以工作。将在版本 4 上试一试。希望一切顺利。
我是不是错过了什么?我确定你可以拥有自适应宽度的视频,而无需 JavaScript,我在许多网站上都自己做过……
例如,请查看此演示页面。
http://webdesignerwall.com/demo/elastic-videos/
不想做个烦人精,但我觉得如果你阅读了文章,它会涵盖这一点。
旁注……如果你使用的是元素,我认为你可以使用 max-width:100%;它将灵活地适应其所在的任何父元素(如图像)。但是,在 IE6 中不起作用。
如此优雅——喜欢它的简洁性。已收藏!
反正每个人都在全屏观看。
这还可以让你做另一件很酷的事情,就是将 iframe 包裹在一个周围的元素中,将 iframe 的宽度/高度设置为 100%,并为周围的元素设置 overflow: auto 和 resize: both。非常酷!
是的,我喜欢这个。像 Chris 那样托管你自己的视频很酷,但让 YouTube 做繁重的工作非常简单,自从我开始学习 CSS 以来,我就痴迷于自适应宽度。
你拥有太多的苹果产品;) iFrames 不是 iFrames!
谢谢!也适用于 vimeo。如何定位多种类型?
比如 vimeo 和 youtube?
好吧,我今天偶然发现了这段代码,但也注意到 youtube iframe 嵌入代码已更改了**src** 属性(至少对我来说是这样)。
我知道我知道,这个帖子真的很旧——但无论如何,这里是我的一点贡献,以防其他人偶然发现它。
更改
为
这很棒,正是我想要的。我仍然是一个新手,谁能解释一下如何在 WordPress 中使用它。脚本是放在页面模板文件中还是可以使用页面/帖子文本编辑器添加?
我编写了一个 WordPress 插件,它为你添加了 FitVids.js。FitVids.js 不会默认加载,但如果你安装了该插件,则可以从其设置页面启用 Fitvids.js。
它叫做 视频嵌入。
你好。我想知道是否可以有两列——具有不同的宽度,并相应地调整两列的视频大小?
太天才了!非常感谢!绝对喜欢 CSS-Tricks。