SWELL|テキスト型投稿リストを縦向きスライダー化する手順

読みたい箇所へ移動する

はじめに

通常の投稿リストとは別に、重要度の高い投稿を個別に、縦スライダーで表示するデザインがあります。
今回は縦スライダーをWordPressテーマ「SWELL」の専用ブロック「投稿リスト」ブロックを用いて作成する方法をご紹介します。

実装サンプル

実装手順

  1. エディタ上に、SWELLの「投稿リスト」を呼び出します。
  2. 投稿リストブロックの”Settings”タブにてレイアウトを”テキスト”に設定します。
    • 表示順や表示数といったその他の設定は適宜設定を行います。
  3. “高度な設定”にてCSSクラス名”bl_newsList”と”js_newsList”を記入します。
    • クラス名を2つに分けているのは、スタイルと機能を分けて管理するためです。単一クラス名でももちろん問題はありません。その場合は適宜コードを書き換えてください。
  4. TOPページ(呼び出したいページ)の編集画面下「カスタムCSS&JS」にCSSコードとJavaScriptコードを貼り付ける
.bl_newsList {
  ul.p-postList{
    display:flex;                /* 子要素を縦に並べる */
    height:83px;                 /* 1 行分の高さに合わせる */
    flex-direction:column;
    overflow:hidden;             /* はみ出しテキストを隠す */
    border-top:1px solid #ddd;
    border-bottom:1px solid #ddd;
  }

  /* 各リストアイテムを行高いっぱいに広げる */
  li.p-postList__item{
    min-height:100%;
 }

  .p-postList__link{
    border-bottom:1px solid transparent;
 }
}
/**
 * easeInOutQuad – なめらかな加速 / 減速
 */
function easeInOutQuad(progress){
  return progress<0.5
    ? 2*progress*progress
    : -1+(4-2*progress)*progress;
}

/**
 * 縦向きニューススライダーの初期化
 * @param {HTMLElement} container .js_newsList 要素
 */
function initNewsSlider(container){
  const listWrapper = container.querySelector('.js_newsList > ul.p-postList');
  const items       = container.querySelectorAll('.js_newsList li.p-postList__item');
  if(!listWrapper || items.length===0) return;

  const itemH        = items[0].getBoundingClientRect().height;
  const totalH       = itemH * items.length;
  let startPos       = 0;
  let startTime      = null;
  const pauseMs      = 2000;   // 停止時間
  const scrollMs     = 2000;   // アニメーション時間
  let reqID, isStop  = false, stopPos=0;

  /* 複製してループを滑らかに */
  const frag = document.createDocumentFragment();
  items.forEach(i=>frag.appendChild(i.cloneNode(true)));
  listWrapper.appendChild(frag);

  /* 毎フレームのスクロール処理 */
  function step(ts){
    if(isStop) return;
    if(!startTime) startTime = ts;
    const progress = Math.min((ts-startTime)/scrollMs,1);
    const eased    = easeInOutQuad(progress);
    const target   = startPos + itemH;
    listWrapper.scrollTop = startPos + (target-startPos)*eased;

    if(progress<1){
      reqID = requestAnimationFrame(step);
    }else{
      startPos = target >= totalH ? 0 : target;
      listWrapper.scrollTop = startPos;
      startTime = null;
      setTimeout(()=>{ if(!isStop) reqID = requestAnimationFrame(step); }, pauseMs);
    }
  }

  /* ホバーで中央にスナップして停止 */
  container.addEventListener('mouseenter',()=>{
    if(isStop) return;
    isStop = true;
    const raw   = listWrapper.scrollTop;
    const idx   = Math.round(raw / itemH);
    const offs  = (listWrapper.clientHeight-itemH)/2;
    stopPos     = Math.max(0, Math.min(idx*itemH - offs, totalH - listWrapper.clientHeight));
    listWrapper.scrollTop = stopPos;
    cancelAnimationFrame(reqID);
  });

  /* ホバー解除で再開 */
  container.addEventListener('mouseleave',()=>{
    if(!isStop) return;
    isStop   = false;
    startPos = stopPos;
    startTime= null;
    reqID    = requestAnimationFrame(step);
  });

  /* 初回実行 */
  reqID = requestAnimationFrame(step);
}

/* DOM 完了後に一括初期化 */
window.addEventListener('DOMContentLoaded',()=>{
  document.querySelectorAll('.js_newsList').forEach(initNewsSlider);
});

メインビジュアル直下に呼び出したい場合

通常の固定ページから呼び出す以外に、メインビジュアルに配置したい場合は、ブログパーツとSWELLで用意されているアクションフック”swell_inner_main_visual”を用いて呼び出します。
ブログパーツを作成したら、functions.phpに下記コードを追記します。

functions.phpを編集する際は、事前にバックアップを行い、自己責任で編集してください。
編集に失敗するとWordPressサイト全体でエラーが起こり、WordPress上の操作が出来なくなります。
心配な場合は、Code Snippetsなどのプラグインを用いてください。

/* --------------------------------
 * SWELL メインビジュアルに投稿リストを出力
 * -------------------------------- */
add_action('swell_inner_main_visual', function(){
  $part_id = 123;  // ←取得したパーツ ID に変更
  $part    = get_post($part_id);
  if($part){
    echo apply_filters('the_content', $part->post_content);
  }
});

参考資料
SWELL│最新版!アクションフック・フィルターフック79個全まとめ | WAZA │ WordPress・SWELL専門の技術サイト

手助けが必要なお客様へ

NaraWebなら、新規サイトの立ち上げからリニューアル、そしてちょっとした改修やカスタマイズまで幅広くサポートいたします。
はじめてサイトをお持ちになる方も、今お使いのサイトをより良くしたい方も、まずはお気軽にご相談ください。小さなアクションが、大きな成果につながるきっかけになるかもしれません。
あなたのWeb戦略を、一緒に次のステージへと進めてみませんか?

読みたい箇所へ移動する