AMP

AMP HTML 規格

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

AMP HTML 是 HTML 的子集,用於編寫內容網頁 (例如新聞報導),以確保特定的基本效能特性。

身為 HTML 的子集,AMP HTML 針對透過 HTML 提供的完整標籤和功能集施加了一些限制,但並不需要開發新的呈現引擎:現有的使用者代理程式可以像呈現所有其他 HTML 一樣呈現 AMP HTML。

如果您主要想瞭解 AMP 中允許和不允許的內容,請觀看我們的AMP 限制入門影片

此外,AMP HTML 文件可以上傳到網路伺服器並像任何其他 HTML 文件一樣提供服務;伺服器不需要特殊設定。但是,它們也設計為可選擇性地透過專門的 AMP 服務系統提供服務,這些系統會代理 AMP 文件。這些文件會從其自身的來源提供服務,並允許對文件套用轉換,以提供額外的效能優勢。以下列出此類服務系統可能執行之部分最佳化作業:

  • 將圖片參照替換為調整為檢視器視埠大小的圖片。
  • 內嵌在首頁可見範圍內的圖片。
  • 內嵌 CSS 變數。
  • 預先載入擴充元件。
  • 最小化 HTML 和 CSS。

AMP HTML 使用一組貢獻但集中管理和託管的自訂元素,來實作進階功能,例如可能在 AMP HTML 文件中找到的圖片庫。雖然它允許使用自訂 CSS 設定文件樣式,但不允許作者撰寫超出透過自訂元素提供的 JavaScript,以達到其效能目標。

透過使用 AMP 格式,內容生產者可以讓第三方檢索 (受 robots.txt 限制)、快取和顯示 AMP 檔案中的內容。

效能

可預測的效能是 AMP HTML 的主要設計目標。我們的主要目標是縮短頁面內容可供使用者取用/使用之前的時間。具體來說,這表示:

  • 應盡可能減少呈現和完整配置文件所需的 HTTP 要求。
  • 只有在使用者可能看到圖片或廣告等資源時,才應下載這些資源。
  • 瀏覽器應能夠在不擷取資源的情況下,計算頁面上每個資源所需的空間。

AMP HTML 格式

文件範例

<!DOCTYPE html>
<html  lang="en">
  <head>
    <meta charset="utf-8" />
    <title>Sample document</title>
    <link rel="canonical" href="./regular-html-version.html" />
    <meta
      name="viewport"
      content="width=device-width,minimum-scale=1,initial-scale=1"
    />
    <style amp-custom>
      h1 {
        color: red;
      }
    </style>
    <script type="application/ld+json">
      {
        "@context": "http://schema.org",
        "@type": "NewsArticle",
        "headline": "Article headline",
        "image": ["thumbnail1.jpg"],
        "datePublished": "2015-02-05T08:00:00+08:00"
      }
    </script>
    <script
      async
      custom-element="amp-carousel"
      src="https://cdn.ampproject.org/v0/amp-carousel-0.1.js"
    ></script>
    <script
      async
      custom-element="amp-ad"
      src="https://cdn.ampproject.org/v0/amp-ad-0.1.js"
    ></script>
    <style amp-boilerplate>
      body {
        -webkit-animation: -amp-start 8s steps(1, end) 0s 1 normal both;
        -moz-animation: -amp-start 8s steps(1, end) 0s 1 normal both;
        -ms-animation: -amp-start 8s steps(1, end) 0s 1 normal both;
        animation: -amp-start 8s steps(1, end) 0s 1 normal both;
      }
      @-webkit-keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
      @-moz-keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
      @-ms-keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
      @-o-keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
      @keyframes -amp-start {
        from {
          visibility: hidden;
        }
        to {
          visibility: visible;
        }
      }
    </style>
    <noscript
      ><style amp-boilerplate>
        body {
          -webkit-animation: none;
          -moz-animation: none;
          -ms-animation: none;
          animation: none;
        }
      </style></noscript
    >
    <script async src="https://cdn.ampproject.org/v0.js"></script>
  </head>
  <body>
    <h1>Sample document</h1>
    <p>
      Some text
      <amp-img src="sample.jpg" width="300" height="300"></amp-img>
    </p>
    <amp-ad
      width="300"
      height="250"
      type="a9"
      data-aax_size="300x250"
      data-aax_pubname="test123"
      data-aax_src="302"
    >
    </amp-ad>
  </body>
</html>

必要標記

AMP HTML 文件必須:

  • 以 doctype <!doctype html> 開頭。🔗
  • 包含最上層的 <html ⚡> 標籤 (也接受 <html amp>)。🔗
  • 包含 <head><body> 標籤 (在 HTML 中為選用)。🔗
  • 在其 head 標籤內包含 <link rel="canonical" href="$SOME_URL"> 標籤,該標籤指向 AMP HTML 文件的正規 HTML 版本,如果沒有此類 HTML 版本,則指向自身。🔗
  • 在其 head 標籤中,包含 <meta charset="utf-8"> 標籤作為第一個子項。🔗
  • 在其 head 標籤內包含 <meta name="viewport" content="width=device-width"> 標籤。也建議加入 minimum-scale=1initial-scale=1🔗
  • 在其 head 標籤內包含 <script async src="https://cdn.ampproject.org/v0.js"></script> 標籤。🔗
  • 在其 head 標籤中,包含 AMP 樣板程式碼 (head > style[amp-boilerplate]noscript > style[amp-boilerplate])。🔗

中繼資料

建議使用標準化中繼資料註解 AMP HTML 文件:Open Graph ProtocolTwitter Cards 等。

我們也建議使用 schema.org/CreativeWork 或其任何更具體的類型 (例如 schema.org/NewsArticleschema.org/BlogPosting) 標記 AMP HTML 文件。

HTML 標籤

HTML 標籤可以在 AMP HTML 中保持不變地使用。某些標籤具有等效的自訂標籤 (例如 <img><amp-img>),而其他標籤則完全禁止使用

標籤 AMP HTML 中的狀態
script 禁止使用,除非類型為 application/ld+jsonapplication/jsontext/plain。(可能會視需要新增其他非可執行值。) 例外情況是載入 AMP 執行階段的必要 script 標籤,以及載入擴充元件的 script 標籤。
noscript 允許使用。可以在文件中的任何位置使用。如果指定,如果使用者停用 JavaScript,則會顯示 <noscript> 元素內的內容。
base 禁止使用。
img 已替換為 amp-img
請注意:<img>根據 HTML5 的 Void Element (空元素),因此沒有結束標籤。但是,<amp-img> 具有結束標籤 </amp-img>
picture 禁止使用。透過使用 後備 屬性或提供多個 <amp-img> 上的 srcset,來提供不同的圖片格式。
video 已替換為 amp-video
audio 已替換為 amp-audio
iframe 已替換為 amp-iframe
frame 禁止使用。
frameset 禁止使用。
object 禁止使用。
param 禁止使用。
applet 禁止使用。
embed 禁止使用。
form 允許使用。需要加入 amp-form 擴充功能。
input 元素 大部分允許使用,但 部分輸入類型例外,也就是說,<input type=button><button type=image> 無效。也允許使用相關標籤:<fieldset><label>
button 允許使用。
style amp-boilerplate 的必要樣式標籤。允許在 head 標籤中使用一個額外的樣式標籤,以用於自訂樣式。此樣式標籤必須具有屬性 amp-custom🔗
link 允許使用在 microformats.org 上註冊的 rel 值。如果我們的允許清單中缺少 rel 值,請提交錯誤報告。不允許使用 stylesheet 和其他具有瀏覽器端效應的值 (例如 preconnectprerenderprefetch)。從允許清單中的字型供應商擷取樣式表是一種特殊情況。
meta http-equiv 屬性可用於特定的允許值;如需詳細資訊,請參閱 AMP 驗證器規格
a href 屬性值不得以 javascript: 開頭。如果設定了 target 屬性值,則必須為 _blank。否則允許使用。🔗
svg 允許使用大多數 SVG 元素。

驗證器實作應使用以 HTML5 規格為基礎的允許清單,並移除上述標籤。請參閱 AMP 標籤附錄

註解

不允許使用條件式 HTML 註解。

HTML 屬性

在 AMP HTML 中不允許使用以 on 開頭的屬性名稱 (例如 onclickonmouseover)。允許使用具有字面名稱 on (無後綴) 的屬性。

在 AMP HTML 中不允許使用 XML 相關屬性,例如 xmlns、xml:lang、xml:base 和 xml:space。

在 AMP HTML 中不允許使用以 i-amp- 為字首的內部 AMP 屬性。

類別

在 AMP HTML 中不允許使用以 -amp-i-amp- 為字首的內部 AMP 類別名稱。

請參閱 AMP 文件,瞭解以 amp- 為字首的類別名稱的含義。允許使用這些類別,目的是允許自訂 AMP 執行階段和擴充功能的部分功能。

在 AMP HTML 標記中,允許使用所有其他作者撰寫的類別名稱。

ID

在 AMP HTML 中不允許使用某些 ID 名稱,例如以 -amp-i-amp- 為字首的 ID,這些 ID 可能與內部 AMP ID 衝突。

在使用 amp-AMP ID 之前,請參閱特定擴充功能的 AMP 文件,以避免與這些擴充功能提供的功能衝突,例如 amp-access

如要檢視不允許使用的 ID 名稱的完整清單,請在此處搜尋 mandatory-id-attr

不允許使用 javascript: 結構描述。

樣式表

主要的語意標籤和 AMP 自訂元素隨附預設樣式,以便輕鬆編寫回應式文件。未來可能會新增選擇退出預設樣式的選項。

@-規則

樣式表中允許使用下列 @-規則:

@font-face@keyframes@media@page@supports

不允許使用 @import。未來可能會新增其他規則。

作者樣式表

作者可以使用文件 head 中的單個 <style amp-custom> 標籤或內嵌樣式,將自訂樣式新增至文件。

@keyframes 規則允許在 <style amp-custom> 中使用。但是,如果規則太多,建議將它們放在額外的 <style amp-keyframes> 標籤中,該標籤必須位於 AMP 文件的結尾。如需詳細資訊,請參閱本文件的「Keyframes 樣式表」章節。

選取器

下列限制適用於作者樣式表中的選取器:

類別和標籤名稱

在作者樣式表中,類別名稱、ID、標籤名稱和屬性不得以字串 -amp-i-amp- 開頭。這些字串保留供 AMP 執行階段內部使用。因此,使用者的樣式表不得參照 -amp- 類別、i-amp- ID 和 i-amp- 標籤和屬性的 CSS 選取器。這些類別、ID 和標籤/屬性名稱不適用於作者自訂。但是,對於這些元件規格未明確禁止的任何 CSS 屬性,作者可以覆寫 amp- 類別和標籤的樣式。

為了防止使用屬性選取器來規避類別名稱限制,一般而言,CSS 選取器不允許包含以 -amp-i-amp- 開頭的符記和字串。

重要

不允許使用 !important 限定詞。這是讓 AMP 能夠強制執行其元素尺寸不變性的必要條件。

屬性

AMP 僅允許在常見瀏覽器中可透過 GPU 加速的屬性進行轉換和動畫。我們目前允許:opacitytransform (以及 -vendorPrefix-transform)。

在以下範例中,<property> 需要在上述允許清單中。

  • transition <property> (以及 -vendorPrefix-transition)
  • @keyframes name { from: {<property>: value} to {<property: value>} } (以及 @-vendorPrefix-keyframes)

最大尺寸

如果作者樣式表或內嵌樣式加總後大於 75,000 個位元組,則會發生驗證錯誤。

Keyframes 樣式表

除了 <style amp-custom> 之外,作者也可以加入 <style amp-keyframes> 標籤,該標籤專門用於 keyframes 動畫。

下列限制適用於 <style amp-keyframes> 標籤:

  1. 只能放在文件 <body> 元素的最後一個子項。
  2. 只能包含 @keyframes@media@supports 規則及其組合。
  3. 大小不得超過 500,000 個位元組。

<style amp-keyframes> 標籤存在的原因是,即使是稍微複雜的動畫,keyframes 規則通常也很龐大,這會導致 CSS 剖析速度緩慢和首次內容繪製緩慢。但此類規則通常會超出 <style amp-custom> 上強制執行的尺寸限制。將此類 keyframes 宣告放在文件底部的 <style amp-keyframes> 中,可讓它們超出尺寸限制。而且由於 keyframes 不會阻擋轉譯,因此也可以避免阻擋首次內容繪製來剖析它們。

範例

<style amp-keyframes>
@keyframes anim1 {}

@media (min-width: 600px) {
  @keyframes anim1 {}
}
</style>
</body>

自訂字型

作者可以加入自訂字型的樣式表。支援的兩種方法是指向允許清單中字型供應商的連結標籤,以及 @font-face 包含項目。

範例

<link
  rel="stylesheet"
  href="https://fonts.googleapis.com/css?family=Tangerine"
/>

如果字型供應商支援僅限 CSS 的整合,並透過 HTTPS 提供服務,則可以將其加入允許清單。目前允許透過連結標籤提供字型服務的來源如下:

  • Fonts.com: https://fast.fonts.net
  • Google Fonts: https://fonts.googleapis.com
  • Font Awesome: https://maxcdn.bootstrapcdn.com, https://use.fontawesome.com
  • Typekit: https://use.typekit.net/kitId.css (請據此替換 kitId)

實作者注意事項:新增至此清單需要變更 AMP 快取 CSP 規則。

作者可以透過自訂 CSS,自由地透過 @font-face CSS 指令包含所有自訂字型。透過 @font-face 包含的字型必須透過 HTTP 或 HTTPS 結構描述擷取。

AMP 執行階段

AMP 執行階段是一段 JavaScript,可在每個 AMP 文件內執行。它提供 AMP 自訂元素的實作、管理資源載入和優先順序,並選擇性地包含 AMP HTML 的執行階段驗證器,以在開發期間使用。

AMP 執行階段是透過 AMP 文件 <head> 中的必要 <script src="https://cdn.ampproject.org/v0.js"></script> 標籤載入的。

AMP 執行階段可以置於任何頁面的開發模式。開發模式將觸發內嵌頁面上的 AMP 驗證,這會將驗證狀態和任何錯誤發送到 JavaScript 開發人員主控台。可以透過將 #development=1 附加到頁面的網址來觸發開發模式。

資源

圖片、影片、音訊檔案或廣告等資源必須透過自訂元素 (例如 <amp-img>) 包含到 AMP HTML 檔案中。我們將它們稱為「受管理資源」,因為它們是否以及何時載入並顯示給使用者是由 AMP 執行階段決定的。

AMP 執行階段的載入行為沒有任何特定保證,但它通常應力求盡快載入資源,以便在使用者想要查看資源時 (如果可能的話) 載入資源。執行階段應優先處理目前在視埠中的資源,並嘗試預測視埠的變更並據此預先載入資源。

AMP 執行階段可能隨時決定卸載目前不在視埠中的資源,或重複使用資源容器 (例如 iframe) 以減少整體 RAM 消耗。

AMP 元件

AMP HTML 使用稱為「AMP 元件」的自訂元素來取代內建的資源載入標籤 (例如 <img><video>),並實作具有複雜互動的功能,例如圖片燈箱或輪播。

請參閱 AMP 元件規格,瞭解關於支援元件的詳細資訊。

支援 2 種類型的 AMP 元件:

  1. 內建
  2. 擴充

內建元件在 AMP 文件中始終可用,並具有專用的自訂元素,例如 <amp-img>。擴充元件必須明確加入到文件中。

通用屬性

layoutwidthheightmediaplaceholderfallback

這些屬性定義元素的版面配置。此處的關鍵目標是確保元素可以顯示,並且可以在下載任何 JavaScript 或遠端資源之前正確地保留其空間。

請參閱 AMP 版面配置系統,瞭解關於版面配置系統的詳細資訊。

on

on 屬性用於在元素上安裝事件處理常式。支援的事件取決於元素。

語法的值是一種簡單的網域特定語言,形式如下:

eventName:targetId[.methodName[(arg1=value, arg2=value)]]

範例:on="tap:fooId.showLightbox"

如果省略 methodName,則如果為元素定義了預設方法,則會執行預設方法。範例:on="tap:fooId"

某些動作 (如果記錄在案) 可能接受引數。引數在括號之間以 key=value 標記法定義。接受的值為:

  • 簡單的未加引號字串:simple-value
  • 加引號的字串:"string value"'string value'
  • 布林值:truefalse
  • 數字:111.1

您可以透過使用分號 ; 分隔兩個事件,來監聽元素上的多個事件。

範例:on="submit-success:lightbox1;submit-error:lightbox2"

請參閱 AMP 動作和事件,瞭解更多資訊。

擴充元件

擴充元件是不一定隨附 AMP 執行階段的元件。相反地,它們必須明確加入到文件中。

擴充元件是透過在文件 head 中加入 <script> 標籤來載入的,如下所示:

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

<script> 標籤必須具有 async 屬性,並且必須具有 custom-element 屬性,該屬性參照元素的名稱。

執行階段實作可以使用名稱來呈現這些元素的預留位置。

指令碼網址必須以 https://cdn.ampproject.org 開頭,並且必須遵循非常嚴格的模式 /v\d+/[a-z-]+-(latest|\d+|\d+\.\d+)\.js

網址

擴充元件的網址格式如下:

https://cdn.ampproject.org/$RUNTIME_VERSION/$ELEMENT_NAME-$ELEMENT_VERSION.js
版本設定

請參閱 AMP 版本設定政策

範本

範本根據語言特定的範本和提供的 JSON 資料來呈現 HTML 內容。

請參閱 AMP 範本規格,瞭解關於支援範本的詳細資訊。

範本未隨附 AMP 執行階段,必須像擴充元素一樣下載。擴充元件是透過在文件 head 中加入 <script> 標籤來載入的,如下所示:

<script
  async
  custom-template="amp-mustache"
  src="https://cdn.ampproject.org/v0/amp-mustache-0.2.js"
></script>

<script> 標籤必須具有 async 屬性,並且必須具有 custom-template 屬性,該屬性參照範本的類型。指令碼網址必須以 https://cdn.ampproject.org 開頭,並且必須遵循非常嚴格的模式 /v\d+/[a-z-]+-(latest|\d+|\d+\.\d+)\.js

範本在文件中宣告如下:

<template type="amp-mustache" id="template1">
  Hello {{you}}!
</template>

type 屬性為必要屬性,並且必須參照已宣告的 custom-template 指令碼。

id 屬性為選用屬性。個別 AMP 元素會探索自己的範本。典型的案例會牽涉到 AMP 元素在其子項中尋找 <template>,或由 ID 參照的 <template>

範本元素內的語法取決於特定的範本語言。但是,範本語言可能會在 AMP 中受到限制。例如,根據「範本」元素,所有產品都必須透過有效的格式正確的 DOM。所有範本輸出也都要經過清理,以確保 AMP 有效輸出。

如要瞭解範本的語法和限制,請造訪範本文件

網址

擴充元件的網址格式如下:

https://cdn.ampproject.org/$RUNTIME_VERSION/$TEMPLATE_TYPE-$TEMPLATE_VERSION.js
版本設定

請參閱自訂元素的版本設定,瞭解更多詳細資訊。

安全性

AMP HTML 文件在使用不包含關鍵字 unsafe-inlineunsafe-eval 的內容安全性政策提供服務時,不得觸發錯誤。

AMP HTML 格式的設計使其始終如此。

所有 AMP 範本元素都必須經過 AMP 安全性審查,才能提交到 AMP 儲存庫。

SVG

目前,允許使用下列 SVG 元素:

  • 容器元素:「clipPath」、「defs」、「g」、「marker」、「mask」、「pattern」、「svg」、「switch」和「symbol」。
  • 結構元素:「defs」、「g」、「svg」、「symbol」和「use」。
  • 圖形元素:「circle」、「ellipse」、「foreignObject」、「image」、「line」、「path」、「polygon」、「polyline」、「rect」、「text」、「textPath」和「tspan」。
  • 文字內容元素:「text」、「textPath」和「tspan」。
  • 繪圖伺服器元素:「linearGradient」、「pattern」和「radialGradient」。
  • 描述性元素:「desc」、「metadata」和「title」。
  • 濾鏡基本元素:「feColorMatrix」、「feComposite」、「feGaussianBlur」、「feMerge」、「feMergeNode」和「feOffset」。
  • 未分類元素:「view」和「filter」。
  • 已淘汰元素:「glyph」「glyphRef」「hkern」「tref」「vkern」

以及這些屬性:

  • 「xlink:href」:僅允許使用以「#」開頭的 URI
  • 「style」

AMP 文件探索

以下描述的機制提供了一種標準化方式,讓軟體探索正規文件是否存在 AMP 版本。

如果存在 AMP 文件作為正規文件的替代表示形式,則正規文件應透過具有 關聯「amphtml」link 標籤指向 AMP 文件。

範例

<link rel="amphtml" href="https://www.example.com/url/to/amp/document.html" />

AMP 文件本身預期會透過具有關聯「canonical」的 link 標籤指回其正規文件。

範例

<link
  rel="canonical"
  href="https://www.example.com/url/to/canonical/document.html"
/>

(如果單一資源同時是 AMP 正規文件,則正規關聯應指向自身 - 不需要「amphtml」關聯。)

請注意,為了與取用 AMP 的系統達到最廣泛的相容性,應可以在不執行 JavaScript 的情況下讀取「amphtml」關聯。(也就是說,標籤應存在於原始 HTML 中,而不是透過 JavaScript 注入。)