AMP

提高互动性

入门代码提供了一个非常简单的用户体验。我们可以通过多种方式来改进它

  • 添加一个指示器来显示当前幻灯片和幻灯片的总数。
  • 当用户选择不同的衬衫颜色时,更改图片轮播以显示所选颜色的衬衫图片。

在引入 amp-bind 组件之前,添加像这些这样的功能是不可能的。让我们亲身体验一下 amp-bind,并将这些新功能添加到我们的示例代码中!

安装 amp-bind 组件

amp-bind 是一个 AMP 组件,它通过数据绑定和类似 JS 的表达式提供自定义互动性。要使用 amp-bind,您必须在页面中安装它。

打开 static/index.html 文件,并将以下脚本添加到页面 <head> 部分的 AMP 组件列表中

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

添加幻灯片指示器

amp-bind 通过将元素属性绑定到自定义表达式来工作。这些表达式可以引用“状态”(可变 JSON 数据)。我们可以通过 <amp-state> 组件(包含在 amp-bind 中)来初始化此状态。

初始化幻灯片状态

让我们初始化一个状态变量来跟踪图片轮播中当前显示的幻灯片的索引。打开 static/index.html,并将以下内容添加到页面 <body> 的顶部(在 <header> 之前)

<amp-state id="selected">
  <script type="application/json">
    {
      "slide": 0
    }
  </script>
</amp-state>

<amp-state> 元素中的数据可通过其关联的 ID 访问。例如,我们可以通过以下表达式片段引用此变量

selected.slide // Evaluates to 0.

更新幻灯片状态

接下来,当用户在轮播中更改幻灯片时,通过将以下 "on" 操作添加到现有的 amp-carousel 元素来更新此变量

<amp-carousel type="slides" layout="fixed-height" height=250 id="carousel"
    on="slideChange:AMP.setState({selected: {slide: event.index}})">

现在,每当 amp-carousel 的显示幻灯片发生更改时,将使用以下参数调用操作 AMP.setState

{
  selected: {
    slide: event.index
  }
}

event.index 表达式计算为新的幻灯片索引,并且 AMP.setState() 操作将此对象字面量合并到当前状态中。这会将 selected.slide 的当前值替换为 event.index 的值。

提示 – AMP.setState() 对嵌套对象字面量执行深度合并。有关更多详细信息,请参阅 amp-bind 文档。

绑定指示器元素

接下来,让我们利用此状态变量来跟踪当前显示的幻灯片,并创建一个幻灯片指示器。找到幻灯片指示器元素(查找 <!-- TODO: "Add a slide indicator" -->)并将其子元素添加以下绑定

<!-- TODO: "Add a slide indicator" -->
<p class="dots">
  <!-- The <span> element corresponding to the current displayed slide
       will have the 'current' CSS class. -->
  <span [class]="selected.slide == 0 ? 'current' : ''" class="current"></span>
  <span [class]="selected.slide == 1 ? 'current' : ''"></span>
  <span [class]="selected.slide == 2 ? 'current' : ''"></span>
</p>

[class] 是一个绑定,它更改 class 属性,你可以使用它向任何元素添加或删除 CSS 类。

试一试:刷新页面并更改幻灯片!

通过更改轮播中的幻灯片,它

  1. 触发 slideChange 事件 ...
  2. 它调用 AMP.setState 操作 ...
  3. 它更新状态变量 selected.slide ...
  4. 它更新指示器 <span> 元素上的 [class] 绑定!

太棒了!现在我们有一个可用的幻灯片指示器。

看看你是否可以添加功能,以便当用户点击幻灯片的指示器圆点时,它使用所选项目更新图片轮播。提示是,在 amp-carousel 上使用 tap 事件和 [slide] 绑定。

当我们更改所选颜色时,如果我们能够看到不同衬衫颜色的图片,那将会很好。使用 amp-bind,我们可以通过绑定 amp-img 元素中的 [src]amp-carousel 中来实现这一点。

初始化 SKU 状态

首先,我们需要使用每种颜色衬衫的图片源 URL 初始化状态数据。让我们使用新的 <amp-state> 元素来实现这一点

<!-- Available shirts. Maps unique string identifier to color and image URL string. -->
<amp-state id="shirts">
  <script type="application/json">
    {
      "1001": {
        "color": "black",
        "image": "./shirts/black.jpg"
      },
      "1002": {
        "color": "blue",
        "image": "./shirts/blue.jpg"
      },
      "1010": {
        "color": "brown",
        "image": "./shirts/brown.jpg"
      },
      "1014": {
        "color": "dark green",
        "image": "./shirts/dark-green.jpg"
      },
      "1015": {
        "color": "gray",
        "image": "./shirts/gray.jpg"
      },
      "1016": {
        "color": "light gray",
        "image": "./shirts/light-gray.jpg"
      },
      "1021": {
        "color": "navy",
        "image": "./shirts/navy.jpg"
      },
      "1030": {
        "color": "wine",
        "image": "./shirts/wine.jpg"
      }
    }
  </script>
</amp-state>

<amp-state> 元素包含一个 JSON 对象,该对象将衬衫标识符字符串(即 SKU)映射到相应衬衫的颜色和图片 URL。JSON 数组也可以在此处使用,但使用对象允许我们执行一些您很快就会看到的更酷的操作。

现在,我们可以通过衬衫的标识符访问图片 URL。例如,shirts['10014'].color 评估为 "dark green",而 shirts['10030'].image 返回 "wine" 衬衫颜色的图片 URL。

追踪选定的 SKU

如果我们添加另一个跟踪所选 SKU 的状态变量,我们就可以将表达式绑定到 amp-img 元素,以便在所选 SKU 更改时更新其 src 属性。向现有 amp-state#selected 元素的 JSON 添加新的 sku

<amp-state id="selected">
  <script type="application/json">
    {
      "slide": 0,
      "sku": "1001"
    }
  </script>
</amp-state>

更新 SKU 状态

amp-selector 添加一个“on”操作,该操作在每次选择新颜色时更新 selected.sku 变量

<amp-selector name="color"
    on="select:AMP.setState({selected: {sku: event.targetOption}})">

提示 – 还可以通过向 amp-selector 中的每个 amp-img 子项添加 on="tap:AMP.setState(...) 操作来实现这一点。关于 amp-selector 的一个优点是,它可以像这样简化标记。

绑定图片元素

然后,向 amp-img 添加绑定

<!-- Update the `src` of each <amp-img> when the `selected.sku` variable changes. -->
<amp-img width=200 height=250 src="./shirts/black.jpg"
    [src]="shirts[selected.sku].image"></amp-img>
<amp-img width=300 height=375 src="./shirts/black.jpg"
    [src]="shirts[selected.sku].image"></amp-img>
<amp-img width=400 height=500 src="./shirts/black.jpg"
    [src]="shirts[selected.sku].image"></amp-img>

注意 – 在实践中,旋转木马中的每张图片可能都有不同的 src。可以通过用图片数组替换单个图片来实现这一点。为了简单起见,本教程使用不同放大倍率的单个图片。

试用:刷新页面并为衬衫选择不同的颜色。当你这样做时,旋转木马的图片会更新为显示所选颜色的衬衫。