AMP

重要事項:本文件不適用於您目前選取的格式 電子郵件

amp-iframe

實驗性質
Bento

說明

顯示 iframe。

 

必要指令碼

<script async custom-element="amp-iframe" src="https://cdn.ampproject.org/v0/amp-iframe-1.0.js"></script>

用法

顯示有效的 AMP iframe。amp-iframe 與原始 iframe 有幾個重要的差異,這些差異旨在使其更安全,並避免 AMP 檔案被單一 iframe 所主導

  • amp-iframe 不得顯示在文件頂端附近 (使用 placeholder 的 iframe 除外,如下所述)。iframe 必須與頂端保持 600 像素的距離,或當捲動至頂端時,不得在視窗前 75% 的範圍內,以較小者為準。
  • 根據預設,amp-iframe 會進行沙箱處理 (請參閱詳細資訊)。
  • amp-iframe 只能透過 HTTPS、data-URI 或 srcdoc 屬性要求資源。
  • 除非在 sandbox 屬性中不允許 allow-same-origin,否則 amp-iframe 不得與容器位於相同的來源。如需 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.0amp-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 或 iframe 文件傳送的 embed-ready postMessage 來得知,以先到者為準。

下列範例顯示含預留位置的 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 的大小。若要執行此操作:

  1. 必須使用 resizable 屬性定義 amp-iframe
  2. amp-iframe 必須具有 overflow 子元素。此元素通常可以是 div。但是,如果 amp-iframep 元素的子元素,建議使用 spanbutton (以消除 p 元素的詞組內容所造成的問題)。
  3. amp-iframe 必須設定 allow-same-origin sandbox 屬性。
  4. iframe 文件必須將 embed-size 要求作為視窗訊息傳送。
  5. 如果要求高度小於特定閾值 (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 尚未有片段時,才會新增此片段。

srcdocframeborderallowfullscreenallowpaymentrequestallowtransparencyreferrerpolicy

這些屬性的行為應與標準 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