FirstLayout

画面に入った一覧リストのカードにアニメーションを実装するWordPressテーマCocoonのカスタマイズ

動作

WordPress テーマ Cocoon の一覧リストに、スクロールに応じたアニメーションを実装するカスタマイズの紹介です。

カスタマイズは 3 ステップの 100% コピペででき、カスタマイズ所要時間は 2 ~ 3 分ほどです。

まずは、完成図をご覧ください。画面内に入ったカードが、ふんわりと表示されます。

執筆時点の Cocoon の一覧リストには、7 種類のカードタイプがあります。どのカードタイプを選んでも、今回のアニメーションを実装できます。

IE で動くようにする

今回の方法によるアニメーションは、IE で動きません。下記の 2 つの条件のどちらにも該当する場合は、対策が必要です。

  • IE でもアニメーションを動かしたい
  • Cocoon 設定の「高速化」で「Lazy Load を有効にする」が無効になっている

IE でアニメーションが動く必要がなければ、次のステップに進みます。また、Cocoon 設定の「高速化」で「Lazy Load を有効にする」が有効になっている場合も、次のステップに進みます。

2 つの条件のどちらにも該当する場合は、intersection-observer.js を子テーマの javascript.js に追加します。

やり方は簡単です。上記リンクを開いた後に「Raw」をクリックすると、ブラウザのタブにコードが表示されます。

表示されたコードを ctrl + a で全て選択後にコピーをし、子テーマの javascript.js の 1 番上(javascript.js に最初から書かれている説明後の 4 行目から)に貼り付けます。貼り付け後の javascript.js の状態は、下記のとおりです。

//ここに追加したいJavaScript、jQueryを記入してください。
//このJavaScriptファイルは、親テーマのJavaScriptファイルのあとに呼び出されます。
//JavaScriptやjQueryで親テーマのjavascript.jsに加えて関数を記入したい時に使用します。
/**
 * Copyright 2016 Google Inc. All Rights Reserved.
 *
 * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.
 *
 *  https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document
 *
 */
(function() {
'use strict';

// Exit early if we're not running in a browser.
if (typeof window !== 'object') {
  return;
}
以下省略

今後、javascript.js にコードを書く場合は、追加したコードの下に書いていきます。

これで IE でもアニメーションが動きます。

尚、追加する intersection-observer.js は 700 行を超えるため、JavaScript MinifierOnline JavaScript/CSS/HTML Compressor などでコードを縮小した後に追加しても構いません(縮小すると 1 行になります)。

Cocoon 設定の「Lazy Load を有効にする」が有効の場合は、親テーマが intersection-observer.js を読み込みます。そのため、「Lazy Load を有効にする」が有効の時は、何もせずとも IE でアニメーションが動きます。

JavaScript を追加

次に、子テーマの javascript.js にコードを追加します。

ただ、アニメーションの動く回数が異なる 2 つのコードがあります。お好みに合わせて、コードを選択します。

何回でもアニメーションが動くコード

一覧リストのカードが画面内に入る度に、アニメーションが動くタイプです。

何回でもアニメーションを動かしたい場合は、下記のコードを子テーマの javascript.js に追加します。

(function() {
  const list = document.querySelectorAll('.entry-card-wrap');

  const observer = new IntersectionObserver(function(entries) {
    entries.forEach(function(entry) {
      if (entry.intersectionRatio > 0) {
        entry.target.classList.add('list-animation');
      } else {
        entry.target.classList.remove('list-animation');
      }
    });
  });

  Array.prototype.forEach.call(list, function(card) {
    observer.observe(card);
  });
})();

1 回のみアニメーションが動くコード

一覧リストのカードが最初に画面内に入った時のみ、アニメーションが動くタイプです。1 度アニメーションが動いたカードは、再び画面内に入ってもアニメーションが動きません。

何回もアニメーションが動くのは避けたい場合は、下記のコードを子テーマの javascript.js に追加します。

(function() {
  const list = document.querySelectorAll('.entry-card-wrap');

  const observer = new IntersectionObserver(function(entries) {
    entries.forEach(function(entry) {
      if (entry.intersectionRatio > 0) {
        entry.target.classList.add('list-animation');
        observer.unobserve(entry.target);
      }
    });
  });

  Array.prototype.forEach.call(list, function(card) {
    observer.observe(card);
  });
})();

CSS を追加

最後に CSS を指定すれば終わりです。

子テーマの style.css に、下記の CSS を追加します。

.list {
  overflow: hidden;
}

.list-animation {
  animation: list-animation 1.2s cubic-bezier(.4, 0, .2, 1);
}

@keyframes list-animation {
  from {
    opacity: 0;
    transform: scale(1.1) translateY(24px);
  }

  32% {
    opacity: 0;
    transform: scale(1.1) translateY(24px);
  }
}

これで完成です。

おわりに

さらにカスタマイズをすれば、関連記事や投稿記事内の画像などにも今回のアニメーションを適用できます。

また、CSS の @keyframes の変更で、お好みのアニメーションを表現できます。

今回の Intersection observer によるアニメーションの詳細は、Intersection observer によるスクロールアニメーションで説明しています。

メニュー 閉じる 検索 記事を読む Facebook Twitter はてなブックマーク Pocket LINE ダウンロード 全ての記事 Web制作 便利ツール