aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/html/element/iframe/index.html
blob: ff3a806853378797c25b6047b19a5df220e6efe5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
---
title: <iframe>
slug: Web/HTML/Element/iframe
tags:
  - <iframe>
  - CORS
  - Content
  - HTML5
  - iframe.contentWindow.document
translation_of: Web/HTML/Element/iframe
---
<div>{{HTMLRef}}</div>

<p><strong>HTML 内联框架元素 (<code>&lt;iframe&gt;</code>)</strong> 表示嵌套的<span class="seoSummary">{{Glossary("browsing context")}}</span>。它能够将另一个 HTML 页面嵌入到当前页面中。</p>

<div>{{EmbedInteractiveExample("pages/tabbed/iframe.html", "tabbed-standard")}}</div>

<div class="hidden">这个示例的源代码存储在 GitHub 仓库中。如果你想给这个项目贡献代码,请克隆 <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples </a>仓库并给我们提交 pull request。</div>

<p>每个嵌入的浏览上下文(embedded browsing context)都有自己的<a href="/zh-CN/docs/Web/API/History">会话历史记录 (session history)</a><a href="/zh-CN/docs/Web/API/Document">DOM 树</a>。包含嵌入内容的浏览上下文称为<em><dfn>父级</dfn>浏览上下文</em>。顶级浏览上下文(没有父级)通常是由 {{domxref("Window")}} 对象表示的浏览器窗口。</p>

<div class="blockIndicator warning">
<p>页面上的每个<code>&lt;iframe&gt;</code>都需要增加内存和其它计算资源,这是因为每个浏览上下文都拥有完整的文档环境。虽然理论上来说你能够在代码中写出来无限多的<code>&lt;iframe&gt;</code>,但是你最好还是先看看这么做会不会导致某些性能问题。</p>
</div>

<h2 id="属性">属性</h2>

<p>该元素包含<a href="/zh-CN/docs/Web/HTML/Global_attributes" title="Global_attributes">全局属性</a></p>

<dl>
 <dt>{{htmlattrdef("allow")}}</dt>
 <dd>用于为<code>&lt;iframe&gt;</code>指定其<a href="/zh-CN/docs/Web/HTTP/策略特征">特征策略</a>.</dd>
</dl>

<dl>
 <dt>{{htmlattrdef("allowfullscreen")}}</dt>
 <dd>设置为<code>true</code>时,可以通过调用 <code>&lt;iframe&gt;</code>{{domxref("Element.requestFullscreen", "requestFullscreen()")}} 方法激活全屏模式。</dd>
 <dd>
 <div class="note">这是一个历史遗留属性,已经被重新定义为 <code>allow="fullscreen"</code></div>
 </dd>
 <dt>{{htmlattrdef("allowpaymentrequest")}}</dt>
 <dd>设置为<code>true</code>时,跨域的 <code>&lt;iframe&gt;</code> 就可以调用 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Payment_Request_API">Payment Request API</a></dd>
 <dd>
 <div class="note">这是一个历史遗留属性,已经被重新定义为 <code>allow="payment"</code>.</div>
 </dd>
 <dt>{{htmlattrdef("csp")}} {{experimental_inline}}</dt>
 <dd>对嵌入的资源配置<a href="/zh-CN/docs/Web/HTTP/CSP">内容安全策略</a>。 查看 {{domxref("HTMLIFrameElement.csp")}} 获取详情。</dd>
 <dt>{{htmlattrdef("height")}}</dt>
 <dd>以 CSS 像素格式<span style="line-height: inherit;">{{HTMLVersionInline(5)}},或像素格式{{HTMLVersionInline(4.01)}},或百分比格式指定 frame 的高度。默认值为<code>150</code></span></dd>
 <dt id="name-attribute">{{htmlattrdef("importance")}} {{experimental_inline}}</dt>
 <dd>表示 <code>&lt;iframe&gt; </code><code>src</code> 属性指定的资源的加载优先级。允许的值有:
 <dl>
  <dt><code>auto</code> (default)</dt>
  <dd>不指定优先级。浏览器根据自身情况决定资源的加载顺序</dd>
  <dt><code>high</code></dt>
  <dd>资源的加载优先级较高</dd>
  <dt><code>low</code></dt>
  <dd>资源的加载优先级较低</dd>
 </dl>
 </dd>
 <dt>{{htmlattrdef("name")}}</dt>
 <dd>用于定位嵌入的浏览上下文的名称。该名称可以用作 <span style="line-height: inherit;">{{HTMLElement("a")}} 标签与 {{HTMLElement("form")}} 标签的 <code>target</code> 属性值,也可以用作 {{HTMLElement("input")}} 标签和 {{HTMLElement("button")}} 标签的 <code>formtarget</code> 属性值,还可以用作</span> {{domxref("Window.open()","window.open()")}} 方法的 <code>windowName</code> 参数值。</dd>
 <dt id="attr-referrer">{{htmlattrdef("referrerpolicy")}}</dt>
 <dd>表示在获取 iframe 资源时如何发送 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/referrer">referrer</a> 首部:
 <ul>
  <li><code>no-referrer</code>: 不发送 {{HTTPHeader("Referer")}} 首部。</li>
  <li><code>no-referrer-when-downgrade</code> (default): 向不受 {{Glossary("TLS")}} ({{Glossary("HTTPS")}}) 保护的 {{Glossary("origin")}} 发送请求时,不发送 {{HTTPHeader("Referer")}} 首部。</li>
  <li><code>origin</code>: referrer 首部中仅包含来源页面的源。换言之,仅包含来源页面的 <a href="https://developer.mozilla.org/en-US/docs/Archive/Mozilla/URIScheme">scheme</a>, {{Glossary("host")}}, 以及 {{Glossary("port")}}</li>
  <li><code>origin-when-cross-origin</code>: 发起跨域请求时,仅在 referrer 中包含来源页面的源。发起同源请求时,仍然会在 referrer 中包含来源页面在服务器上的路径信息。</li>
  <li><code>same-origin</code>: 对于 {{Glossary("Same-origin policy", "same origin")}}(同源)请求,发送 referrer 首部,否则不发送。</li>
  <li><code>strict-origin</code>: 仅当被请求页面和来源页面具有相同的协议安全等级时才发送 referrer 首部(比如从采用 HTTPS 协议的页面请求另一个采用 HTTPS 协议的页面)。如果被请求页面的协议安全等级较低,则不会发送 referrer 首部(比如从采用 HTTPS 协议的页面请求采用 HTTP 协议的页面)。</li>
  <li><code>strict-origin-when-cross-origin</code>: 当发起同源请求时,在 referrer 首部中包含完整的 URL。当被请求页面与来源页面不同源但是有相同协议安全等级时(比如 HTTPS→HTTPS),在 referrer 首部中仅包含来源页面的源。当被请求页面的协议安全等级较低时(比如 HTTPS→HTTP),不发送 referrer 首部。</li>
  <li><code>unsafe-url</code>: 始终在 referrer 首部中包含源以及路径(但不包括 <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/hash">fragment</a><a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/password">密码</a>,或<a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/username">用户名</a>)。<strong>这个值是不安全的</strong>, 因为这样做会暴露受 TLS 保护的资源的源和路径信息。</li>
 </ul>
 </dd>
 <dt>{{htmlattrdef("sandbox")}}</dt>
 <dd>该属性对呈现在 iframe 框架中的内容启用一些额外的限制条件。属性值可以为空字符串(这种情况下会启用所有限制),也可以是用空格分隔的一系列指定的字符串。有效的值有:
 <ul>
  <li><code>allow-downloads-without-user-activation</code> {{experimental_inline}}: 允许在没有征求用户同意的情况下下载文件。</li>
  <li><code>allow-forms</code>: 允许嵌入的浏览上下文提交表单。如果没有使用该关键字,则无法提交表单。</li>
  <li><code>allow-modals</code>: 允许嵌入的浏览上下文打开模态窗口。</li>
  <li><code>allow-orientation-lock</code>: 允许嵌入的浏览上下文锁定屏幕方向(译者注:比如智能手机、平板电脑的水平朝向或垂直朝向)。</li>
  <li><code>allow-pointer-lock</code>: 允许嵌入的浏览上下文使用 <a href="/zh-CN/docs/API/Pointer_Lock_API">Pointer Lock API</a>.</li>
  <li><code>allow-popups</code>: 允许弹窗 (例如 window.open, target="_blank", <code>showModalDialog</code>)。如果没有使用该关键字,相应的功能将自动被禁用。</li>
  <li><code>allow-popups-to-escape-sandbox</code>:  允许沙箱化的文档打开新窗口,并且新窗口不会继承沙箱标记。例如,安全地沙箱化一个广告页面,而不会在广告链接到的新页面中启用相同的限制条件。</li>
  <li><code>allow-presentation</code>: 允许嵌入的浏览上下文开始一个<a href="https://developer.mozilla.org/en-US/docs/Web/API/PresentationRequest"> presentation session</a></li>
  <li><code>allow-same-origin</code>: 如果没有使用该关键字,嵌入的浏览上下文将被视为来自一个独立的源,这将使 {{Glossary("same-origin policy")}} 同源检查失败。</li>
  <li><code>allow-scripts</code>: 允许嵌入的浏览上下文运行脚本(但不能创建弹窗)。如果没有使用该关键字,就无法运行脚本。</li>
  <li><code>allow-storage-access-by-user-activation</code> {{experimental_inline}}: 允许嵌入的浏览上下文通过 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API">Storage Access API</a> 使用父级浏览上下文的存储功能。</li>
  <li><code>allow-top-navigation</code>: 允许嵌入的浏览上下文导航(加载)内容到顶级的浏览上下文。</li>
  <li><code>allow-top-navigation-by-user-activation</code>: 允许嵌入的浏览上下文<u><strong>在经过用户允许后</strong></u>导航(加载)内容到顶级的浏览上下文。</li>
 </ul>

 <div class="note">
 <p><strong>注意:</strong></p>

 <ul>
  <li>当被嵌入的文档与主页面同源时,强烈建议不要同时使用 <code>allow-scripts</code><code>allow-same-origin</code>。如果同时使用,嵌入的文档就可以通过代码删除 <code>sandbox</code> 属性,如此,就安全性而言还不如不用<code>sandbox</code></li>
  <li>如果攻击者可以在沙箱化的 <code>iframe</code> 之外展示内容,例如用户在新标签页中打开内联框架,那么沙箱化也就没有意义了。建议把这种内容放置到独立的专用域中,以减小可能的损失。</li>
  <li>沙箱属性 (sandbox) 在 Internet Explorer 9 及更早的版本上不被支持。</li>
 </ul>
 </div>
 </dd>
 <dt>{{htmlattrdef("src")}}</dt>
 <dd>被嵌套的页面的 URL 地址。使用 <code>about:blank</code> 值可以嵌入一个遵从<a href="/zh-CN/docs/Web/Security/Same-origin_policy">同源策略</a>的空白页。在 Firefox(version 65 及更高版本)、基于 Chromium 的浏览器、Safari/iOS 中使用代码移除 <code>iframe</code><code>src</code> 属性(例如通过 {{domxref("Element.removeAttribute()")}} )会导致 <code>about:blank</code> 被载入 frame。</dd>
 <dt>{{htmlattrdef("srcdoc")}} {{HTMLVersionInline(5)}} only</dt>
 <dd>该属性是一段 HTML 代码,这些代码会被渲染到 iframe 中。如果浏览器不支持 <code>srcdoc</code> 属性,则会渲染 <code>src</code> 属性表示的内容。</dd>
 <dt>{{htmlattrdef("width")}}</dt>
 <dd>以 CSS 像素格式<span style="line-height: inherit;">{{HTMLVersionInline(5)}}</span><span style="line-height: inherit;">,或以像素格式</span><span style="line-height: inherit;">{{HTMLVersionInline(4.01)}},或以百分比格式指定的 frame 的宽度。默认值是<code>300</code></span></dd>
</dl>

<h3 id="不赞成使用的属性"><span style="line-height: inherit;">不赞成使用的属性</span></h3>

<p>下面这些属性已不赞成使用,并且可能不再被所有的浏览器支持。你应避免在新项目里面使用它们,也应尽量从旧项目中移除它们。</p>

<dl>
 <dt>{{htmlattrdef("align")}} {{deprecated_inline("html4.01")}}, {{obsolete_inline("html5")}}</dt>
 <dd>此元素相对于周围元素的对齐方式。</dd>
 <dt>{{htmlattrdef("frameborder")}} {{obsolete_inline("html5")}}</dt>
 <dd>值为<code>1</code>(默认值)时,显示此框架的边框。值为<code>0</code>时移除边框。此属性已不赞成使用,请使用 CSS 属性 {{cssxref("border")}} 代替。</dd>
 <dt>{{htmlattrdef("longdesc")}} {{obsolete_inline("html5")}}</dt>
 <dd>表示框架内容的长描述的 URL。由于广泛的误用,该属性对于无图形界面的浏览器不起作用。</dd>
 <dt>{{htmlattrdef("marginheight")}} {{obsolete_inline("html5")}}</dt>
 <dd>这个属性定义了框架的内容距其上边框与下边框的距离,单位是像素。</dd>
 <dt>{{htmlattrdef("marginwidth")}} {{obsolete_inline("html5")}}</dt>
 <dd>这个属性定义了框架的内容距其左边框和右边框的距离,单位是像素。</dd>
 <dt>{{htmlattrdef("scrolling")}} {{obsolete_inline("html5")}}</dt>
 <dd>这个属性控制是否要在框架内显示滚动条,允许的值包括:
 <ul>
  <li><code>auto</code>: 仅当框架的内容超出框架的范围时显示滚动条。</li>
  <li><code>yes</code>: 始终显示滚动条。</li>
  <li><code>no</code>: 从不显示滚动条。</li>
 </ul>
 </dd>
</dl>

<h3 id="非标准属性_non-standard_inline">非标准属性 {{non-standard_inline}}<span class="hidden"> </span><span class="hidden"> </span></h3>

<dl>
 <dt><strong>{{htmlattrdef("mozbrowser")}} {{non-standard_inline}} </strong><span class="hidden"> </span><span class="hidden"> </span></dt>
</dl>

<div class="blockIndicator note">
<p>查看 {{bug(1318532)}} 了解如何在 Firefox 的 WebExtensions 中使用此属性。</p>
</div>

<p>这个属性可以让 <code>&lt;iframe&gt;</code> 变得像顶级浏览器窗口,详情请参看 <a href="/zh-CN/docs/Web/API/Using_the_Browser_API">Browser API</a>。这个属性<strong>只能</strong><a href="/zh-CN/docs/Mozilla/Add-ons/WebExtensions">WebExtensions</a> 中使用。</p>

<h2 id="脚本">脚本</h2>

<p>内联的框架,就像 {{HTMLElement("frame")}} 元素一样,会被包含在 {{domxref("window.frames")}} 伪数组(类数组的对象)中。</p>

<p>有了 DOM {{domxref("HTMLIFrameElement")}} 对象,脚本可以通过 {{domxref("HTMLIFrameElement.contentWindow", "contentWindow")}} 访问内联框架的 {{domxref("window")}} 对象。 {{domxref("HTMLIFrameElement.contentDocument", "contentDocument")}} 属性则引用了 <code>&lt;iframe&gt;</code> 内部的 <code>document</code> 元素,(等同于使用 contentWindow.document),但 IE8-不支持。</p>

<p>在框架内部,脚本可以通过 {{domxref("window.parent")}} 引用父窗口对象。</p>

<p>脚本访问框架内容必须遵守<a href="/zh-CN/docs/Web/Security/Same-origin_policy" title="/en-US/docs/Same_origin_policy_for_JavaScript">同源策略</a>,并且无法访问非同源的 <code>window</code> 对象的几乎所有属性。同源策略同样适用于子窗体访问父窗体的 <code>window</code> 对象。跨域通信可以通过 <a href="/zh-CN/docs/Web/API/Window/postMessage" title="/zh-CN/docs/Web/API/Window/postMessage">window.postMessage</a> 来实现。</p>

<h2 id="定位和缩放">定位和缩放</h2>

<p>作为一个<a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/Replaced_element">可替换元素</a>, 可以使用 {{cssxref("object-position")}}{{cssxref("object-fit")}} 来定位、对齐、缩放 <code>&lt;iframe&gt;</code> 元素内的文档。</p>

<h2 id="示例">示例</h2>

<h3 id="Example1" name="Example1">一个简单的 <code>&lt;iframe&gt;</code></h3>

<p>下面的例子中,我们创建了一个框架。当用户点击框架中的按钮时,浏览器会弹出一个提示框。</p>

<h4 id="HTML">HTML</h4>

<pre><code>&lt;iframe src="https://mdn-samples.mozilla.org/snippets/html/iframe-simple-contents.html" title="iframe example 1" width="400" height="300"&gt;
  &lt;p&gt;Your browser does not support iframes.&lt;/p&gt;
&lt;/iframe&gt;</code></pre>

<h4 id="Result">Result</h4>

<p>{{ EmbedLiveSample('Example1', '', '', '', 'Web/HTML/Element/iframe') }}</p>

<h3 id="Example2" name="Example2">在新标签页中打开 <code>&lt;iframe&gt;</code> 里面的链接</h3>

<p>下面的例子演示了在框架中展示谷歌地图。</p>

<h4 id="HTML_2">HTML</h4>

<pre><code>&lt;base target="_blank"&gt;
&lt;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&amp;amp;source=s_q&amp;amp;hl=es-419&amp;amp;geocode=&amp;amp;q=buenos+aires&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=38.638819,80.859375&amp;amp;t=h&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Buenos+Aires,+Argentina&amp;amp;z=11&amp;amp;ll=-34.603723,-58.381593&amp;amp;output=embed"&gt;
&lt;/iframe&gt;

&lt;br&gt;
&lt;small&gt;
  &lt;a href="https://maps.google.com/maps?f=q&amp;amp;source=embed&amp;amp;hl=es-419&amp;amp;geocode=&amp;amp;q=buenos+aires&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=38.638819,80.859375&amp;amp;t=h&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Buenos+Aires,+Argentina&amp;amp;z=11&amp;amp;ll=-34.603723,-58.381593" style="color:#0000FF;text-align:left"&gt; See bigger map &lt;/a&gt;
&lt;/small&gt;</code></pre>

<h4 id="Result_2">Result</h4>

<p>{{ EmbedLiveSample('Example2', '', '', '', 'Web/HTML/Element/iframe') }}</p>

<h2 id="无障碍环境">无障碍环境</h2>

<p>使用 <code>iframe</code><a href="/zh-CN/docs/Web/HTML/Global_attributes/title">title</a> 属性来标识框架的主要内容,这样可以极大方便使用辅助技术(例如屏幕阅读器)浏览网页的人。框架的标题应该清楚地描述框架的内容,例如:</p>

<pre class="brush: html line-numbers language-html"><code class="language-html"><span class="tag token"><span class="tag token"><span class="punctuation token">&lt;</span>iframe</span> <span class="attr-name token">title</span><span class="attr-value token"><span class="punctuation token">=</span><span class="punctuation token">"</span>Wikipedia page for Avocados<span class="punctuation token">"</span></span> <span class="attr-name token">src</span><span class="attr-value token"><span class="punctuation token">=</span><span class="punctuation token">"</span>https://en.wikipedia.org/wiki/Avocado<span class="punctuation token">"</span></span><span class="punctuation token">&gt;</span></span><span class="tag token"><span class="tag token"><span class="punctuation token">&lt;/</span>iframe</span><span class="punctuation token">&gt;</span></span></code></pre>

<p>如果没有标题,他们就只能浏览每一个框架来获取需要的内容。这非常耗时间,也很容易让人迷惑,尤其是当页面中包含很多框架或者互动内容如音视频等的时候。</p>

<h2 id="Specifications" name="Specifications">规范</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">规范</th>
   <th scope="col">状态</th>
   <th scope="col">说明</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('Referrer Policy', '#referrer-policy-delivery-referrer-attribute', 'referrerpolicy attribute')}}</td>
   <td>{{Spec2('Referrer Policy')}}</td>
   <td>新增属性:<code>referrerpolicy</code></td>
  </tr>
  <tr>
   <td>{{SpecName('HTML WHATWG', 'iframe-embed-object.html#the-iframe-element', '&lt;iframe&gt;')}}</td>
   <td>{{Spec2('HTML WHATWG')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('HTML5 W3C', 'embedded-content-0.html#the-iframe-element', '&lt;iframe&gt;')}}</td>
   <td>{{Spec2('HTML5 W3C')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('HTML4.01', 'present/frames.html#h-16.5', '&lt;iframe&gt;')}}</td>
   <td>{{Spec2('HTML4.01')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('Screen Orientation')}}</td>
   <td>{{Spec2('Screen Orientation')}}</td>
   <td>Adds <code>allow-orientation-lock</code> to the <code>sandbox</code> attribute.</td>
  </tr>
  <tr>
   <td>{{SpecName('Presentation','#sandboxing-and-the-allow-presentation-keyword','allow-presentation')}}</td>
   <td>{{Spec2('Presentation')}}</td>
   <td>Adds <code>allow-presentation</code> to the <code>sandbox</code> attribute</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility" name="Browser_compatibility">浏览器兼容性</h2>

<article>
<p>{{Compat("html.elements.iframe", 3)}}</p>
</article>