AMP

触发 CSS 动画和过渡

CSS 动画使 Web 元素能够从一种 CSS 样式配置过渡到另一种 CSS 样式配置。浏览器可以在加载时启动已定义的动画,但事件触发的 CSS 动画依赖于添加和移除类。AMP 支持这两种动画类型。

当您有一个较小、独立的动画且不需要精确计时时,请使用 CSS。

定义 CSS 和关键帧

您可以在 AMP 中通过以下方式定义 CSS

样式和布局中阅读更多关于在 AMP 中使用 CSS 的信息。

  <style amp-custom>
    div {
      width: 100px;
      height: 100px;
      background: red;
      position: relative;
      animation: mymove 5s infinite;
    }
  </style>
</head>
<body>

<div></div>
  <style amp-keyframes>
   @keyframes mymove {
      0%   {transform: translatey(0px);}
      25%  {transform: translatey(200px);}
      75%  {transform: translatey(50px);}
      100% {transform: translatey(100px);}
    }
  </style>
</body>

添加、移除和切换类

AMP 操作toggleClass允许向已定义元素添加和移除类。

elementName.toggleClass(class="className")

您可以在您希望用户与其交互的同一元素上切换类,例如动画汉堡菜单。

 <div id="hamburger" tabindex=1 role=button on="tap:hamburger.toggleClass(class='close')">

toggleClass 操作还可以应用于其他元素,并通过添加 force 属性在两个类之间切换。

<button on="tap:magicBox.toggleClass(class='invisible', force=true),magicBox.toggleClass(class='visible', force=false)">
  Disappear
</button>
<button on="tap:magicBox.toggleClass(class='visible', force=true),magicBox.toggleClass(class='invisible', force=false)">
  Reappear
</button>

如果您需要删除一个类并禁止重新应用,请添加值为 falseforce 属性。如果您需要添加一个类并禁止删除,请添加值为 trueforce

使用 CSS 和状态进行动画

您可以使用 amp-bind 添加和删除任何数量的带有状态的 CSS 类。

<head>
  <script async custom-element="amp-bind" src="https://cdn.ampproject.org/v0/amp-bind-0.1.js"></script>
  <style amp-custom>
    div {
      height: 100px;
      width: 100px;
      margin: 1em;
      background-color: green;
      margin-left: 100px;
      transition: 2s;
    }
    .visible {
      opacity: 1;
    }
    .invisible {
      opacity: 0;
    }
    .left {
      transform: translatex(-50px)
    }
    .right {
      transform: translatex(50px)
    }
    button {
      margin-top:  1rem;
      margin-left: 1rem;
    }
  </style>
</head>
<body>
  <amp-state id="magicBox">
    <script type="application/json">
      {
        "visibleBox": {
          "className": "visible"
        },
        "invisibleBox": {
          "className": "invisible"
        },
        "moveLeft": {
          "className": "left"
        },
        "moveRight": {
          "className": "right"
        }
      }
    </script>
  </amp-state>
  <div [class]="magicBox[animateBox].className"> </div>
  <button on="tap:AMP.setState({animateBox: 'invisibleBox'})">
    Disappear
  </button>
  <button on="tap:AMP.setState({animateBox: 'visibleBox'})">
    Reappear
  </button>
  <button on="tap:AMP.setState({animateBox: 'moveLeft'})">
    Move Left
  </button>
  <button on="tap:AMP.setState({animateBox: 'moveRight'})">
    Move Right
  </button>
</body>
在游乐场中打开此代码段

首先在文档的 head 中的 <style amp-custom> 标记内添加一个 CSS 类列表,定义多个类动画

    .visible {
      opacity: 1;
    }
    .invisible {
      opacity: 0;
    }
    .left {
      transform: translatex(-50px)
    }
    .right {
      transform: translatex(50px)
    }

然后将每个类与一个状态配对

<amp-state id="magicBox">
  <script type="application/json">
    {
      "visibleBox": {
        "className": "visible"
      },
      "invisibleBox": {
        "className": "invisible"
      },
      "moveLeft": {
        "className": "left"
      },
      "moveRight": {
        "className": "right"
      }
    }
  </script>
</amp-state>

并将元素与类链接

  <div [class]="magicBox[animateBox].className"> </div>

状态会因链接的 AMP 操作或事件而改变。以下示例会因用户交互而改变状态

<button on="tap:AMP.setState({animateBox: 'invisibleBox'})">
    Disappear
</button>
<button on="tap:AMP.setState({animateBox: 'visibleBox'})">
    Reappear
</button>
<button on="tap:AMP.setState({animateBox: 'moveLeft'})">
    Move Left
</button>
<button on="tap:AMP.setState({animateBox: 'moveRight'})">
  Move Right
</button>

以这种方式使用 amp-bind 会将类明确设置为已定义的类。您不必告诉它删除其他类。