読みたい箇所へ移動する
はじめに
通常の投稿リストとは別に、重要度の高い投稿を個別に、縦スライダーで表示するデザインがあります。
今回は縦スライダーをWordPressテーマ「SWELL」の専用ブロック「投稿リスト」ブロックを用いて作成する方法をご紹介します。
実装サンプル
実装手順
- エディタ上に、SWELLの「投稿リスト」を呼び出します。
- 投稿リストブロックの”Settings”タブにてレイアウトを”テキスト”に設定します。
- 表示順や表示数といったその他の設定は適宜設定を行います。
- “高度な設定”にてCSSクラス名”bl_newsList”と”js_newsList”を記入します。
- クラス名を2つに分けているのは、スタイルと機能を分けて管理するためです。単一クラス名でももちろん問題はありません。その場合は適宜コードを書き換えてください。
- 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戦略を、一緒に次のステージへと進めてみませんか?