AMP

重要提示:此文档不适用于您当前选择的格式 ads

amp-list

描述

动态下载数据并使用模板创建列表项。

 

必需的脚本

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

用法

amp-list 组件从 CORS JSON 端点获取动态内容。端点的响应包含数据,这些数据在指定的模板中呈现。

您的端点必须实现 AMP 中的 CORS 请求规范中指定的要求。

您可以通过两种方式之一指定模板

  • 一个 template 属性,它引用现有模板元素的 ID。
  • 一个直接嵌套在 amp-list 元素内的模板元素。

当将 <amp-list> 与另一个模板 AMP 组件(如 <amp-form>)一起使用时,请注意模板可能不会在有效的 AMP 文档中嵌套。在这种情况下,有效的解决方法是通过 template 属性通过 id 提供模板。了解有关 <amp-mustache> 中嵌套模板的更多信息。

有关模板的更多详细信息,请参阅 AMP HTML 模板

显示动态列表

在以下示例中,我们检索包含 URL 和标题的 JSON 数据,并在嵌套的 amp-mustache 模板中呈现内容。

<amp-list
  width="auto"
  height="100"
  layout="fixed-height"
  src="/static/inline-examples/data/amp-list-urls.json"
>
  <template type="amp-mustache">

    <div class="url-entry">
      <a href="{{url}}">{{title}}</a>
    </div>
  </template>
</amp-list>
在 Playground 中打开此代码段

这是我们使用的 JSON 文件

{
  "items": [
    {
      "title": "AMP YouTube Channel",
      "url": "https://www.youtube.com/channel/UCXPBsjgKKG2HqsKBhWA4uQw"
    },
    {
      "title": "AMPproject.org",
      "url": "https://www.ampproject.org/"
    },
    {
      "title": "AMP",
      "url": "https://amp.js.cn/"
    },
    {
      "title": "AMP Start",
      "url": "https://ampstart.com/"
    }
  ]
}

这是我们如何设置获取的内容的样式

amp-list div[role='list'] {
  display: grid;
  grid-gap: 0.5em;
}

请求始终从客户端发出,即使文档是从 AMP 缓存提供的。加载是使用正常的 AMP 规则触发的,具体取决于元素与当前视口之间的距离。

如果 <amp-list> 在加载后需要更多空间,它会请求 AMP 运行时使用正常的 AMP 流程更新其高度。如果 AMP 运行时无法满足新高度的请求,它将显示 overflow 元素(如果可用)。但是请注意,<amp-list> 元素在文档底部的典型位置几乎总是保证 AMP 运行时可以调整它们的大小。

amp-list 的可访问性注意事项

默认情况下,<amp-list> 会向列表元素添加 list ARIA 角色,并向通过模板呈现的项目元素添加 listitem 角色。如果列表元素或其任何子元素不是“可制表的”(可以通过键盘按键(例如 abutton 元素或任何具有正 tabindex 的元素)访问),则默认情况下会将 0tabindex 添加到列表项。可以说,这种行为并不总是合适的 - 通常,只有交互式控件/内容才应该是可聚焦的。如果要禁止此行为,请确保将 tabindex="-1" 作为模板的最外层元素的一部分包含在内。

当前,呈现的列表元素被声明为 ARIA 实时区域(使用 aria-live="polite"),这意味着列表内容的任何更改都会导致辅助技术(例如屏幕阅读器)读取/宣布整个列表。由于列表最初呈现的方式,这也会导致在页面加载时完整宣布列表。为了暂时解决此问题,您可以将 aria-live="off" 添加到 <amp-list>,这将覆盖 aria-live="polite" 的添加。

另请注意,一种好的做法是为模板提供一个顶级元素,以防止意外的副作用。这意味着以下输入

<template type="amp-mustache">

  <div class="item">{{item}}</div>
  <div class="price">{{price}}</div>
</template>

如果改为按如下方式提供,则最可预测地应用和呈现

<template type="amp-mustache">

  <div>
    <div class="item">{{item}}</div>
    <div class="price">{{price}}</div>
  </div>
</template>

XHR 批量处理

AMP 将 XMLHttpRequests (XHR) 批量处理到 JSON 端点,也就是说,您可以使用单个 JSON 数据请求作为 AMP 页面上多个使用者(例如,多个 <amp-list> 元素)的数据源。例如,如果您的 <amp-list> 向端点发出 XHR,则当 XHR 正在进行中时,后续对同一端点的所有 XHR 都不会触发,而是会返回来自第一个 XHR 的结果。

<amp-list> 中,您可以使用 items 属性来呈现 JSON 响应的子集,从而允许您拥有多个 <amp-list> 元素,这些元素呈现不同的内容,但共享单个 XHR。

指定溢出

(可选)<amp-list> 组件可以包含一个带有 overflow 属性的元素。如果满足以下所有条件,AMP 将显示此元素

  • 呈现到 amp-list 中的内容超出其指定大小。
  • amp-list 的底部在视口内。
  • amp-list 的底部不在页面底部附近(定义为文档底部 15% 或底部 1000 像素中的最小值)

如果 amp-list 在视口之外,它将自动展开。

示例:当列表需要更多空间时显示溢出

在以下示例中,我们显示图像和标题列表。由于 <amp-list> 内容需要比可用空间更多的空间,因此 AMP 框架会显示溢出元素。

查看更多
<amp-list
  width="auto"
  height="140"
  layout="fixed-height"
  src="/static/inline-examples/data/amp-list-data.json"
>
  <template type="amp-mustache">

    <div class="image-entry">
      <amp-img src="{{imageUrl}}" width="100" height="75"></amp-img>
      <span class="image-title">{{title}}</span>
    </div>
  </template>
  <div overflow class="list-overflow" style="background-color:red;">
    See more
  </div>
</amp-list>
在 Playground 中打开此代码段

AMP 将以下 CSS 应用于具有 overflow 属性的元素

.list-overflow[overflow] {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
}

占位符和回退

(可选)<amp-list> 支持占位符和/或回退。

  • 占位符是具有 placeholder 属性的子元素。此元素会一直显示,直到 <amp-list> 成功加载。如果还提供了回退,则当 <amp-list> 加载失败时,占位符将被隐藏。
  • 回退是具有 fallback 属性的子元素。如果 <amp-list> 加载失败,则会显示此元素。

占位符和回退中了解更多信息。请注意,子元素不能同时是占位符和回退。

<amp-list src="https://foo.com/list.json">
  <div placeholder>Loading ...</div>
  <div fallback>Failed to load data.</div>
</amp-list>

刷新数据

<amp-list> 元素公开一个 refresh 操作,其他元素可以在 on="tap:..." 属性中引用该操作。

<button on="tap:myList.refresh">Refresh List</button>
<amp-list id="myList" src="https://foo.com/list.json">
  <template type="amp-mustache">
    <div>{{title}}</div>
  </template>
</amp-list>

动态调整大小

<button on="tap:list.changeToLayoutContainer()">Show Grid</button>
<amp-list
  id="list"
  width="396"
  height="80"
  layout="responsive"
  src="/test/manual/amp-list-data.json?RANDOM"
>
  <template type="amp-mustache">
{{title}}  </template>
</amp-list>

属性

src(必填)

您的端点必须实现 AMP 中的 CORS 请求规范中指定的要求。

如果在 src URL 获取数据失败,则 <amp-list> 将触发低信任 fetch-error 事件。

items

定义用于查找要在响应中呈现的数组的表达式。这是一个点表示法表达式,通过 JSON 响应的字段进行导航。默认情况下,<amp-list> 需要一个数组,可以使用 single-item 属性从对象加载数据。

  • 默认值为 "items"。预期响应:{items: [...]}
  • 如果响应本身就是所需的数组,请使用值 "."。预期的响应是:[...]
  • 允许嵌套导航(例如,"field1.field2")。预期的响应是:{field1: {field2: [...]}}

当指定 items="items" 时(这是默认值),响应必须是一个 JSON 对象,其中包含名为 "items" 的数组属性。

{
  "items": [...]
}

max-items

一个整数值,指定要渲染的 items 数组的最大长度。如果返回的值超过 max-items,则 items 数组将被截断为 max-items 个条目。

single-item

使 <amp-list> 将返回的结果视为单个元素数组。对象响应将被包装在一个数组中,因此 {items: {...}} 的行为将如同 {items: [{...}]}

binding

对于使用 <amp-list> 同时也使用 amp-bind 的页面,控制是否在渲染子项中阻止对绑定(例如 [text])的评估进行渲染。

我们建议使用 binding="no"binding="refresh" 以获得更快的性能。

  • binding="no": 永不阻止渲染(最快)
  • binding="refresh": 不阻止初始加载时的渲染(更快)
  • binding="always": 始终阻止渲染(慢)

如果未提供 binding 属性,则默认值为 always

通用属性

此元素包含 扩展到 AMP 组件的通用属性

验证

请参阅 AMP 验证器规范中的 amp-list 规则

需要更多帮助?

您已经阅读了此文档十几次,但它并没有真正涵盖您所有的问题?也许其他人也有同感:在 Stack Overflow 上联系他们。

前往 Stack Overflow
发现错误或缺少功能?

AMP 项目强烈鼓励您的参与和贡献!我们希望您能成为我们开源社区的持续参与者,但我们也欢迎您为自己特别关注的问题做出一次性贡献。

前往 GitHub