AMP に「ページトップへ戻る」ボタンを設置する方法
拡張コンポーネントと動作
通常ページでは見かけるものの、AMP ページでは見かけないものがあります。それが、下にスクロールをすると画面右下に出てきて、クリックをするとページの 1 番上まで移動する「ページトップへ戻る」ボタン。
「ページトップへ戻る」ボタンは、一般的に JavaScript を使い設置します。しかし、2018 年 3 月の執筆時点では、AMP で JavaScript を使えません。AMP ページで「ページトップへ戻る」ボタンを見かけないのは、これが理由です。
ただ、amp-animation と amp-position-observer の 2 つの AMP 拡張コンポーネントを使えば、AMP ページにも「ページトップへ戻る」ボタンを設置できます。
設置方法は AMP 公式サイトの Scroll to top で紹介されています。一部を変更しながら、もう少し詳しくご説明します。
使用する amp-animation は、その名のとおり AMP でアニメーションを表現するためのものです。もう 1 つの amp-position-observer は、スクロール位置を判定しイベントを発生させるもの。
この 2 つの組み合わせで、ある一定の位置で「ページトップへ戻る」ボタンの表示・非表示を切り替えるアニメーションを表現できます。もちろん、クリックをすると、ページの 1 番上に移動します。
実際にボタンを設置した例を動画でご覧ください。サイト右下に、ピンクの「ページトップへ戻る」ボタンが現れます。
図にすると以下のとおりです。
任意の高さに設置したイベント発生位置より上の領域では、ボタンが非表示に。下の領域では、ボタンが表示されます。
amp-position-observer で作るイベント発生位置は、width
も height
も 0
にします。そのため、サイト上では見えません。レイアウトには、何も影響を与えません。
これより設置方法を説明します。
script タグの設置
まずは、amp-animation と amp-position-observer を使えるように、AMP ページの <head>
タグ内に <script>
タグを追加します。。
<script
async
custom-element="amp-animation"
src="https://cdn.ampproject.org/v0/amp-animation-0.1.js"></script>
<script
async
custom-element="amp-position-observer"
src="https://cdn.ampproject.org/v0/amp-position-observer-0.1.js"></script>
今回はボタンに Font Awesome を使います。Font Awesome のスタイルシートを読み込んでいない場合は、以下の <link>
タグも AMP ページの <head>
タグ内に追加します。
<!-- Font Awesome バージョン 4 を使う場合 -->
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" />
<!-- Font Awesome バージョン 5 を使う場合 -->
<!-- バージョン 5.11.2 は 2019 年 11 月時点の最新バージョン -->
<link
rel="stylesheet"
href="https://use.fontawesome.com/releases/v5.11.2/css/all.css" />
尚、今回はバージョン 4 を使った説明をしています。
amp-animation の指定
次に、amp-animation を JSON で指定します。
以下のコードを AMP ページの <body>
タグ直下に追加します。
<amp-animation id="show-page-top" layout="nodisplay">
<script type="application/json">
{
"direction": "alternate",
"duration": "300ms",
"fill": "both",
"animations": [
{
"selector": "#page-top",
"easing": "cubic-bezier(.4,0,.2,1)",
"keyframes": [
{
"opacity": "1",
"visibility": "visible"
}
]
}
]
}
</script>
</amp-animation>
<amp-animation id="hide-page-top" layout="nodisplay">
<script type="application/json">
{
"direction": "alternate",
"duration": "300ms",
"fill": "both",
"animations": [
{
"selector": "#page-top",
"easing": "cubic-bezier(.4,0,.2,1)",
"keyframes": [
{
"opacity": "0",
"visibility": "hidden"
}
]
}
]
}
</script>
</amp-animation>
id="show-page-top"
が、ボタンを表示するアニメーション。id="hide-page-top"
が、ボタンを非表示にするアニメーションの指定です。
サイトによって変更する可能性があるのが "duration": "300ms"
。これは「ページトップへ戻る」ボタンの表示・非表示にかかる時間です。300ms
であれば、非表示になっていたボタンが 0.3 秒をかけて表示されます。その逆も同じです。尚、マテリアルデザインでは、400ms
を超える指定は非推奨となっています。
ボタンとイベント発生エリアを設置
次は「ページトップへ戻る」ボタンを設置します。
また、amp-position-observer を使い、イベントを発生させるエリアも設置します。
AMP ページの <body>
タグ直下、かつ <footer>
タグより後に以下のコードを追加します。ほとんどのサイトの通常ページでは、<footer>
タグの後にボタンが設置されているように思えます。
<div class="page-top-button">
<button id="page-top" on="tap:header.scrollTo('duration' = 375)">
<i class="fa fa-arrow-up" aria-hidden="true"></i>
</button>
</div>
<div class="page-top-trigger">
<amp-position-observer
on="enter:hide-page-top.start; exit:show-page-top.start"
layout="nodisplay"></amp-position-observer>
</div>
2 行目の on="tap:header
の header
が、ボタンをクリック後に移動する先の id です。サイト上部の要素の id をご指定ください。<header>
タグやサイトタイトルの id であれば、問題ないはずです。
同じく 2 行目の 'duration' = 375
で、ボタンをクリック後のページトップへの移動にかかる時間を指定します。375
であれば、0.375 秒をかけてページトップに戻ります。
ほとんどのケースで移動距離が長いことが予想されるため、少し長めの時間を指定するのがいいかもしれません。マテリアルデザインでは、移動距離が長い場合は 375
を超える指定を許可しています。ただし、400
を超えるのは非推奨です。サイトに合わせてご指定ください。
CSS で装飾
あとは CSS を指定すると終わりです。CSS の一例は下記のとおりです。
#page-top {
background: #616161;
border: none;
border-radius: 50px;
bottom: 16px;
box-shadow:
0 2px 8px rgba(0, 0, 0, 0.2),
0 0 8px rgba(0, 0, 0, 0.1);
color: #fff;
font-size: 24px;
height: 56px;
line-height: 56px;
outline: none;
position: fixed;
right: 16px;
transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
visibility: hidden;
width: 56px;
z-index: 19999;
}
#page-top:active {
background: #424242;
box-shadow:
0 8px 24px rgba(0, 0, 0, 0.2),
0 0 24px rgba(0, 0, 0, 0.1);
transform: translateY(-1px);
}
.page-top-trigger {
height: 0;
position: absolute;
top: 500px;
width: 0;
}
.page-top-trigger
の top: 500px
が、イベント発生エリアの位置の指定です。500px
であれば、サイト上部から 500px スクロールした位置で、ボタンの表示・非表示が切り替わります。
ただし、top
の値が大きい場合は、サイト上部でもボタンが表示されてしまうかもしれません。私のテスト環境では 600px
を指定すると、以下の動画のようにページトップの周辺でもボタンが表示されてしまいました。
ボタンの表示・非表示の切り替え位置が、2 ヶ所になる恐れがあります。確認しながらサイトに合った top
の値をご指定ください。
Simplicity のカスタマイズ
WordPress テーマ Simplicity をお使いであれば、これまでのカスタマイズをコピペで可能です。
カスタマイズの要点を説明します。
script タグの追加
FTP ソフトやサーバーのファイルマネージャー機能を使い、親テーマの amp-header.php を子テーマにコピペをします。
コピペ後に、子テーマに設置した amp-header.php の下記のコードを探します。
echo '<link rel="stylesheet" href="https://max'.'cdn.boot'.'strapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">'.PHP_EOL;
上記コードの上の行に、下記のコードを追加します。
echo '<script async custom-element="amp-animation" src="https://cdn.ampproject.org/v0/amp-animation-0.1.js"></script>' . PHP_EOL;
echo '<script async custom-element="amp-position-observer" src="https://cdn.ampproject.org/v0/amp-position-observer-0.1.js"></script>' . PHP_EOL;
アニメーション用 JSON
子テーマに設置した amp-header.php に、amp-animation の指定のコードを追加します。
追加場所は、下記の部分の下の行です。
}//AMP Analytics終了 ?>
ボタンとイベント発生エリア
ボタンとイベント発生エリアを設置します。
親テーマの amp-footer.php を子テーマにコピペをします。子テーマに設置した amp-footer.php の </body>
タグの 1 つ上の </div>
タグの上に、ボタンとイベント発生エリアを設置の HTML を追加します。
その後の HTML も含めると、追加後の HTML は以下のとおりです。
<div class="page-top-button">
<button id="page-top" on="tap:header.scrollTo('duration' = 375)"><i class="fa fa-arrow-up" aria-hidden="true"></i></button>
</div>
<div class="page-top-trigger">
<amp-position-observer on="enter:hide-page-top.start; exit:show-page-top.start" layout="nodisplay"></amp-position-observer>
</div>
</div>
</body>
</html>
CSS の指定
最後に、子テーマの amp.css に、CSS で装飾の CSS を追加します。
おわりに
amp-animation と amp-position-observer を使えば、AMP でも動きのあるサイトを作れます。
今回はボタンに使いましたが、他の部分に使うのも面白いです。
例えば、スクロールをするとフェードインしてくる画像やテキスト。スクロールに応じて動く画像。最初は高さのある大きなヘッダーが、下にスクロールをすると小さくなるなど。アイデア次第で、人を惹きつけるアニメーションを表現できます。
CodePen の Visual Effects in AMP では、サンプルが用意されています。どんなことができるのか、非常に参考になります。