重要事項:此文件不適用於您目前選取的格式 廣告!
amp-iframe
說明
顯示 iframe。
必要指令碼
<script async custom-element="amp-iframe" src="https://cdn.ampproject.org/v0/amp-iframe-1.0.js"></script>
<script async custom-element="amp-iframe" src="https://cdn.ampproject.org/v0/amp-iframe-1.0.js"></script> <link rel="stylesheet" href="https://cdn.ampproject.org/v0/amp-iframe-1.0.css">
用法
顯示 AMP 有效的 iframe。amp-iframe
與原始 iframe 有幾個重要的差異,這些差異旨在使其更安全,並避免 AMP 檔案由單一 iframe 所主導
amp-iframe
不得靠近文件頂端顯示 (使用placeholder
的 iframe 除外,如下方所述)。iframe 必須距離頂端 600 像素,或當捲動至頂端時,不得在視窗前 75% 的範圍內,以較小者為準。- 依預設,
amp-iframe
會進行沙箱處理 (請參閱詳細資訊)。 amp-iframe
必須僅透過 HTTPS、data-URI 或透過srcdoc
屬性要求資源。amp-iframe
不得與容器位於相同的來源,除非它們在sandbox
屬性中不允許allow-same-origin
。如需 iframe 允許來源的詳細資訊,請參閱「Iframe 來源政策」文件。
<amp-iframe width="200" height="100" sandbox="allow-scripts allow-same-origin" layout="responsive" src="https://www.google.com/maps/embed/v1/place?key=AIzaSyAyAS599A2GGPKTmtNr9CptD61LE4gN6oQ&q=iceland" > </amp-iframe>
從 0.1 版遷移
與 0.1
不同,實驗性的 1.0
版 amp-iframe
已棄用 frameborder
屬性。請使用 CSS border
屬性來控制 <amp-iframe>
邊框。
使用現有的 AMP 元件來取代 amp-iframe
如果無法透過 AMP 中的其他方式達成所需的使用者體驗,也就是說,如果使用案例沒有現有的 AMP 元件,則應將 amp-iframe
元件視為備用方案。這是因為使用針對特定使用案例量身打造的 AMP 元件有很多好處,例如:
- 更佳的資源管理與效能
- 自訂元件在某些情況下可以提供內建的預留位置圖片。這表示在影片載入之前取得正確的影片縮圖,並減少手動新增預留位置的編碼工作。
- 內建調整大小功能。這表示具有不可預測大小的 iframe 內容,通常更常以如同原生於頁面般的方式呈現給使用者,而不是在可捲動的框架中
- 可以內建其他額外功能 (例如,影片播放器的自動播放)
將 amp-iframe
用於廣告
絕對不得將 amp-iframe
用於顯示廣告的主要目的。將 amp-iframe
用於顯示影片的目的,其中一部分影片是廣告,這是可以接受的。此 AMP 政策可能會透過不轉譯各自的 iframe 來強制執行。
廣告使用案例應改用 amp-ad
。
此政策的原因如下:
amp-iframe
強制執行沙箱處理,且沙箱也適用於子 iframe。這表示到達網頁可能會損壞,即使廣告本身看起來可以運作。amp-iframe
未提供任何機制可將設定傳遞至 iframe。amp-iframe
沒有完全由 iframe 控制的調整大小機制。amp-iframe
可能無法取得可見度資訊。
在有效的 AMP 文件之外單獨使用
Bento 可讓您在非 AMP 頁面中使用 AMP 元件,而無需完全採用有效的 AMP。您可以取得這些元件,並將它們放置在使用不支援 AMP 的架構和 CMS 的實作中。請參閱我們的指南在非 AMP 頁面中使用 AMP 元件以深入瞭解。
若要尋找獨立版本的 amp-iframe
,請參閱bento-iframe
。
具有預留位置的 Iframe
當 amp-iframe
具有 placeholder
元素時,可以讓 amp-iframe
出現在文件頂端,如下方範例所示。
amp-iframe
必須包含具有placeholder
屬性的元素 (例如amp-img
元素),該元素會在 iframe 準備好顯示之前轉譯為預留位置。- iframe 的就緒狀態可透過監聽 iframe 的
onload
或embed-ready
postMessage
來得知,後者會由 iframe 文件傳送,以先到者為準。
以下範例顯示具有預留位置的 iframe
<amp-iframe width="300" height="300" layout="responsive" sandbox="allow-scripts allow-same-origin" src="https://foo.com/iframe" > <amp-img layout="fill" src="https://foo.com/foo.png" placeholder></amp-img> </amp-iframe>
以下範例顯示具有 embed-ready 請求的 iframe
window.parent.postMessage( { sentinel: 'amp', type: 'embed-ready', }, '*' );
Iframe 調整大小
amp-iframe
必須定義靜態版面配置,如同任何其他 AMP 元素一樣。但是,可以在執行階段調整 amp-iframe
的大小。若要執行此操作:
amp-iframe
必須使用resizable
屬性定義。amp-iframe
必須具有overflow
子元素。此元素通常可以是div
。但是,如果amp-iframe
是p
元素的子元素,建議使用span
或button
(以消除p
元素的詞組內容所造成的問題)。amp-iframe
必須設定allow-same-origin
sandbox 屬性。- iframe 文件必須將
embed-size
請求作為視窗訊息傳送。 - 如果請求高度小於特定閾值 (100 像素),則會拒絕
embed-size
請求。
請注意,resizable
會將 scrolling
的值覆寫為 no
。
以下範例顯示具有 overflow
元素的 amp-iframe
<amp-iframe width="300" height="300" layout="responsive" sandbox="allow-scripts allow-same-origin" resizable src="https://foo.com/iframe" > <div overflow tabindex="0" role="button" aria-label="Read more"> Read more! </div> </amp-iframe>
以下範例顯示 iframe 調整大小請求
window.parent.postMessage( { sentinel: 'amp', type: 'embed-size', height: document.body.scrollHeight, }, '*' );
一旦收到此訊息,AMP 執行階段會盡快嘗試配合請求,但會考量讀取器目前的閱讀位置、捲動是否正在進行中,以及任何其他 UX 或效能因素。如果執行階段無法滿足調整大小請求,amp-iframe
將會顯示 overflow
元素。按一下 overflow
元素會立即調整 amp-iframe
的大小,因為它是由使用者動作觸發的。
以下是一些會影響調整大小執行速度的因素:
- 調整大小是否由使用者動作觸發。
- 是否針對目前作用中的 iframe 請求調整大小。
- 是否針對視窗下方或視窗上方的 iframe 請求調整大小。
Iframe 可見度
Iframe 可以將 send-intersections
訊息傳送給其父項,以開始接收 iframe 與父項視窗交集的 IntersectionObserver
樣式變更記錄。
在以下範例中,我們假設指令碼位於建立的 iframe 中,其中 window.parent
是頂層視窗。如果指令碼位於巢狀 iframe 中,請將 window.parent
變更為頂層 AMP 視窗。
以下範例顯示 iframe send-intersections
請求
window.parent.postMessage( { sentinel: 'amp', type: 'send-intersections', }, '*' );
iframe 可以監聽來自父視窗的 intersection
訊息,以接收交集資料。
以下範例顯示 iframe send-intersections
請求
function isAmpMessage(event, type) { return ( event.source == window.parent && event.origin != window.location.origin && event.data && event.data.sentinel == 'amp' && event.data.type == type ); } window.addEventListener('message', function (event) { if (!isAmpMessage(event, 'intersection')) { return; } event.data.changes.forEach(function (change) { console.log(change); }); });
當 intersectionRatio 跨閾值 [0, 0.05, 0.1, ... 0.9, 0.95, 1] 變更時,父項會以 IntersectionObserver 項目的格式將交集訊息傳送至 iframe。
屬性
src
src
屬性的行為主要與標準 iframe 上的行為相同,但有一個例外:#amp=1
片段會新增至 URL,讓來源文件知道它們嵌入在 AMP 環境中。只有在 src
指定的 URL 尚未具有片段時,才會新增此片段。
srcdoc
、frameborder
、allowfullscreen
、allowpaymentrequest
、allowtransparency
和 referrerpolicy
這些屬性的行為應與標準 iframe 上的行為相同。
如果未指定 frameborder
,則預設會將其設定為 0
。
sandbox
由 amp-iframe
建立的 Iframe 始終在其上定義了 sandbox
屬性。依預設,值為空,這表示它們是「最大沙箱化」。透過設定 sandbox
值,可以選擇讓 iframe 減少沙箱化。允許瀏覽器支援的所有值。例如,設定 sandbox="allow-scripts"
可讓 iframe 執行 JavaScript,或 sandbox="allow-scripts allow-same-origin"
可讓 iframe 執行 JavaScript、發出非 CORS XHR,以及讀取/寫入 Cookie。
如果您要將並非特別為了沙箱化而建立的文件放入 iframe,您很可能需要將 allow-scripts allow-same-origin
新增至 sandbox
屬性,而且您可能需要允許其他功能。
另請注意,沙箱適用於從沙箱化 iframe 開啟的所有視窗。這包括透過具有 target=_blank
的連結建立的新視窗 (新增 allow-popups
以允許發生這種情況)。將 allow-popups-to-escape-sandbox
新增至 sandbox
屬性,可讓這些新視窗的行為如同非沙箱化的新視窗。這很可能在大多數情況下是您想要和期望的。遺憾的是,截至撰寫本文時,Chrome、Firefox、Safari 和 Opera 支援 allow-popups-to-escape-sandbox
,但 Edge 不支援。
如需 sandbox
屬性的詳細資訊,請參閱MDN 上的文件。
通用屬性
amp-iframe
包含擴充至 AMP 元件的通用屬性。
分析
我們強烈建議基於分析目的使用amp-analytics
,因為它是一個更強大、完整且有效率的解決方案,可以針對各種分析供應商進行設定。
AMP 每頁僅允許單一 iframe 用於分析和追蹤目的。為了節省資源,這些 iframe 會在載入後 5 秒從 DOM 中移除,這應該有足夠的時間來完成任何需要完成的工作。
如果 iframe 看起來沒有直接的使用者用途 (例如不可見或很小),則會將其識別為追蹤/分析 iframe。
驗證
請參閱 AMP 驗證器規格中的amp-iframe
規則。
您已閱讀本文檔十幾次,但它仍然沒有真正涵蓋您的所有問題嗎?也許其他人也有同樣的感覺:在 Stack Overflow 上與他們聯繫。
前往 Stack Overflow 發現錯誤或缺少功能?AMP 專案強烈鼓勵您的參與和貢獻!我們希望您能成為我們開放原始碼社群的長期參與者,但我們也歡迎針對您特別熱衷的問題提供一次性貢獻。
前往 GitHub