HTML内联框架元素 <iframe> 表示嵌套的浏览上下文,有效地将另一个HTML页面嵌入到当前页面中。在HTML 4.01中,文档可能包含头部和正文,或头部和框架集,但不能包含正文和框架集。但是,<iframe>可以在正常的文档主体中使用。每个浏览上下文都有自己的会话历史记录和活动文档。包含嵌入内容的浏览上下文称为父浏览上下文。顶级浏览上下文(没有父级)通常是浏览器窗口。
- 内容分类 Flow content, phrasing content, embedded content, interactive content, palpable content.
- Permitted contentSpecial, see prose
- Tag 遗漏 不允许,开始标签和结束标签都不能省略。
- 允许的父类元素 任何可以接受嵌入内容的元素
- DOM 接口
HTMLIFrameElement
属性
该元素包含全局属性。
align
已废弃 HTML4.01, 已废弃 HTML5- 在包含此元素的上下文环境中的对齐方式
frameborder
HTML 4 only- 取值为1时(默认值),告诉浏览器在当前iframe与其他iframe之间绘制边框,取0时则无需绘制此边框。
height
- 以CSS像素格式HTML5,或像素格式HTML 4.01,或百分比格式指定frame的高度。
longdesc
HTML 4 only- 指向frame详细描述的URI(统一资源标识符),因为广泛乱用,该属性在非视觉浏览器中没什么作用。
marginheight
HTML 4 only- 框架内容到框架的上下边距,以像素格式表示。
marginwidth
HTML 4 only- 框架内容到框架的左右边距,以像素格式表示。
mozallowfullscreen
使用allowfullscreen属性代替。
在Gecko9.9及更高版本上,如果允许通过调用element.mozRequestFullScreen()
方法,设置frame为全屏模式,该属性被设置为true。如果该属性未被设置,iframe元素不能被设置为全屏模式。webkitallowfullscreen
- 使用
allowfullscreen
属性代替。在Chrome 17及更高版本上(或者更早),如果允许通过调用element.webkitRequestFullScreen()
方法,设置iframe为全屏模式,该属性被设置为true,如果该属性未被设置,iframe元素不能被设置为全屏模式。 mozapp
Only available on Firefox OS- For frames hosting an open web app, this specifies the URL of the app manifest. This ensures that the app is loaded with the right permissions. See Using the Browser API for details. Available in Gecko 13.0 and later.
mozbrowser
Only available on Firefox OS- Indicates that the frame is to appear like a top-level browser window to the embedded content. This means that
window.top
,window.parent
,window.frameElement
, etc. will not reflect the frame hierarchy. This allows for a web browser UI to be implemented entirely with web technology, given the right permissions. See Using the Browser API for details. Available in Gecko 13.0 and later. name
- 嵌入的浏览上下文(框架)的名称。该名称可以用作
<a>
标签,<form>
标签的target
属性值,或<input>
标签和<button>
标签的formtaget
属性值。 remote
Only available on Firefox OS- Load the frame's page in a separate content process.
scrolling
HTML 4 only- Enumerated attribute indicating when the browser should provide a scroll bar (or other scrolling device) for the frame:
auto
: Only when needed.yes
: Always provide a scroll bar.no
: Never provide a scoll bar.
sandbox
HTML5 only- 如果指定了空字符串,该属性对呈现在iframe框架中的内容启用一些额外的限制条件。属性值可以是用空格分隔的一系列指定的字符串。有效的值有:
-
allow-forms
: 允许嵌入的浏览上下文可以提交表单。如果该关键字未使用,该操作将不可用。allow-modals
: 允许内嵌浏览环境打开模态窗口。allow-orientation-lock
: 允许内嵌浏览环境禁用屏幕朝向锁定(译者注:比如智能手机、平板电脑的水平朝向或垂直朝向)。allow-pointer-lock
: 允许内嵌浏览环境使用 Pointer Lock API.allow-popups
: 允许弹窗 (类似window.open, target="_blank",showModalDialog
)。如果没有设置该属性,相应的功能将静默失效。allow-popups-to-escape-sandbox
: 允许沙箱文档打开新窗口,并且不强制要求新窗口设置沙箱标记。例如,这将允许一个第三方的沙箱环境运行广告开启一个登陆页面,新页面不强制受到沙箱相关限制。allow-presentation
: 允许嵌入者控制是否iframe启用一个展示会话。allow-same-origin
: 允许将内容作为普通来源对待。如果未使用该关键字,嵌入的内容将被视为一个独立的源。allow-scripts
: 允许嵌入的浏览上下文运行脚本(但不能window创建弹窗)。如果该关键字未使用,这项操作不可用。allow-top-navigation
:嵌入的页面的上下文可以导航(加载)内容到顶级的浏览上下文环境(browsing context)。如果未使用该关键字,这个操作将不可用。
注意:
- 当被嵌入的文档与主页面同源时,强烈建议不要同时使用
allow-scripts
和allow-same-origin
,否则的话将允许嵌入的文档通过代码删除sandbox
属性。虽然你可以这么做,但是这样的话其安全性还不如不用sandbox。
- 如果攻击者可以将潜在的恶意内容往用户的已沙箱化的iframe中显示,那么沙箱操作的安全性将不再可靠。推荐把这种内容放置到独立的专用域中,减小可能的损失。
- 沙箱属性(sandbox)在Internet Explorer 9及更早的版本上不被支持
seamless
HTML5 only- 该布尔属性指示浏览器将iframe渲染成容器页面文档的一部分。例如,通过打被包含的文档的链接,在iframe页面的样式被渲染之前,父页面的CSS样式就可以应用在iframe中(除非被其他设置阻止)。
src
- 嵌套页面的URL地址。使用遵守同源策略的 'about:blank' 来嵌套空白页。
srcdoc
HTML5 only- 该属性值可以是HTML代码,这些代码会被渲染到iframe中,如果同时指定了src属性,srcdoc会覆盖src所指向的页面。该属性最好能与sandbox和seamless属性一起使用。
width
- 以CSS像素格式HTML5,或以像素格式HTML 4.01,或以百分比格式指定frame的宽度。
脚本
内联的框架,就像 <frame>
元素一样,会加入 window.frames
伪数组(类数组的对象)中。
通过contentWindow属性,脚本可以访问iframe元素所包含的HTML页面的window对象。contentDocument属性则引用了iframe中的文档元素(等同于使用contentWindow.document),但IE8-不支持。
通过访问window.parent,脚本可以从框架中引用它的父框架的window。
脚本试图访问的框架内容必须遵守同源策略,并且无法访问非同源的window对象的几乎所有属性。同源策略同样适用于子窗体访问父窗体的window对象。跨域通信可以通过window.postMessage来实现。
示例
Here are a few examples demonstrating the use of the <iframe>
element.
A simple <iframe>
This is a basic example of an <iframe>
in action. After creating the frame, when the user clicks a button, its title is retrieved and displayed in an alert.
HTML
<iframe src="https://mdn-samples.mozilla.org/snippets/html/iframe-simple-contents.html" title="iframe example 1" width="400" height="300">
<p>Your browser does not support iframes.</p>
</iframe>
Result
Open a link in an <iframe>
in another tab
In this example, a Google map is displayed in a frame;
HTML
<base target="_blank">
<iframe id="Example2"
title="Example2"
width="400"
height="300"
frameborder="0"
scrolling="no"
marginheight="0"
marginwidth="0"
src="https://maps.google.com/maps?f=q&source=s_q&hl=es-419&geocode=&q=buenos+aires&sll=37.0625,-95.677068&sspn=38.638819,80.859375&t=h&ie=UTF8&hq=&hnear=Buenos+Aires,+Argentina&z=11&ll=-34.603723,-58.381593&output=embed">
</iframe>
<br>
<small>
<a href="https://maps.google.com/maps?f=q&source=embed&hl=es-419&geocode=&q=buenos+aires&sll=37.0625,-95.677068&sspn=38.638819,80.859375&t=h&ie=UTF8&hq=&hnear=Buenos+Aires,+Argentina&z=11&ll=-34.603723,-58.381593" style="color:#0000FF;text-align:left"> See bigger map </a>
</small>
Result
Notes
Starting in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3), rendering of inline frames correctly respects the borders of their containing element when they're rounded using border-radius
.
说明
Specification | Status | Comment |
---|---|---|
HTML Living Standard <iframe> |
Living Standard | |
HTML5 <iframe> |
Recommendation | |
HTML 4.01 Specification <iframe> |
Recommendation |
浏览器兼容性
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|---|
Basic support | 1 | (Yes) | (Yes)[1] | (Yes) | (Yes) | (Yes)[2] |
sandbox |
4 | (Yes) | 17.0 (17.0) | 10 | 15 | 5 |
srcdoc |
20 | 未实现 | 25.0 (25.0) | 未实现 | 15 | 6 |
allowfullscreen |
17 webkit 27 |
(Yes) | 9.0 (9.0) moz 18.0 (18.0) |
11 ms |
(Yes) | (Yes) webkit 7 |
sandbox="allow-popups" |
(Yes) | (Yes) | 28.0 (28.0) | ? | ? | ? |
sandbox="allow-popups-to-escape-sandbox" |
46 | 未实现 | 49.0 (49.0) | ? | 32 | ? |
sandbox="allow-modals" |
? | 未实现 | 49.0 (49.0) | ? | ? | ? |
referrerpolicy |
51 | 未实现 | 50.0 (50.0) | ? | ? | ? |
sandbox="allow-presentation" |
53 | 未实现 | ? | ? |
40 |
? |
sandbox="allow-top-navigation-by-user-activation" |
58 | ? | ? | ? | 45 | ? |
allowpaymentrequest |
? | ? | ? | ? | ? | ? |
Feature | Android Webview | Chrome for Android | Edge | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support |
(Yes) |
(Yes) |
(Yes) | (Yes)[1] | (Yes) | (Yes) | (Yes) |
sandbox |
(Yes) |
(Yes) |
(Yes) | 17.0 (17.0) | 10 | 未实现 | 4.2 |
srcdoc |
? | ? | (Yes) | 25.0 (25.0) | 未实现 | ? | ? |
allowfullscreen |
? | ? | (Yes) | 9.0 (9.0) moz 18.0 (18.0) |
未实现 | 未实现 | (Yes) webkit 7 |
sandbox="allow-popups" |
? | ? | 未实现 | 27.0 (27.0) | ? | ? | ? |
sandbox="allow-popups-to-escape-sandbox" |
46 | 46 | 未实现 | 49.0 (49.0) | ? | 32 | ? |
sandbox="allow-modals" |
? | ? | 未实现 | 49.0 (49.0) | ? | ? | ? |
referrerpolicy |
51 | 51 | 未实现 | 50.0 (50.0) | ? | ? | ? |
sandbox="allow-presentation" |
未实现 | 53 | 未实现 | ? | ? |
40 |
? |
sandbox="allow-top-navigation-by-user-activation" |
58 | 58 | ? | ? | ? | 45 | ? |
allowpaymentrequest |
? | ? | ? | ? | ? | ? | ? |
[1] The resize
CSS property doesn't have any effect on this element due to bug 680823.
[2] Safari has a well-known bug that prevents iframes from loading if the iframe element was hidden when added to the page. iframeElement.src = iframeElement.src should cause it to load the iframe.