SWELLのリッチカラムと投稿リストを組み合わせると、ブロック設定だけで記事を横スクロール表示にできます。
各カラムに1件ずつ記事を指定するため、見せたい記事と順番を手動で選ぶ用途に向いています。
自動で動かす場合だけ、後半のJavaScriptとボタン用CSSを追加します。
この見本は読み込み直後には動かず、「自動スクロールを開始」を押してから動きます。
新着記事を1つの投稿リストから自動取得するならCSSによる横スクロール、前後ボタンを付けるならSwiperの投稿リストも選べます。
ブロック設定だけの横スクロール見本
下の見本は4つの投稿リストを横へ並べています。
各リストの表示件数は1件、対象の記事IDをそれぞれ指定しています。
リッチカラムと投稿リストの設定
リッチカラムブロックを追加し、横スクロールの設定を有効にします。
各カラムに投稿リストを1つ置き、表示件数を1件にします。
表示したい記事は投稿リストのID指定で選び、同じ記事が重複しないようにします。
見本のカラム幅はPC・タブレット400px、スマホ300pxです。
実際には文字量と表示する場所の幅に合わせて調整してください。
横スクロールが発生するのは、カラム全体が表示領域より広い場合です。
固定ページを並べる場合は、投稿リストで対象の投稿タイプを固定ページへ切り替えてからIDを指定します。
記事を選ぶだけで並び替えが自動になる仕組みではないため、表示する内容が変わったときは各カラムを編集してください。
開始・停止できる自動スクロールの見本
次の見本は開始ボタンを押すと3.5秒ごとに次の位置へ動きます。
末尾まで来ると先頭へ戻りますが、同じ記事を複製する継ぎ目のない無限ループではありません。
停止ボタンのほか、リストをマウスやタッチで操作した場合、リスト内のリンクへキーボードで移動した場合、ホイール操作、画面サイズ変更、別のタブへ移動した場合も停止します。
再開は開始ボタンで行います。
端末で「動きを抑える」設定が有効な場合は自動再生を無効にします。
別タブへの移動時の停止と「動きを抑える」設定への対応は、掲載コードに含まれる処理です。
2026年10月2日の検証では新しいタブを開いても元ページが非表示状態にならず、別タブ移動による停止を確認できませんでした。
OSの低減設定を切り替える試験も未実施のため、これらを検証済みの開始・停止操作とは分けて扱います。
自動スクロール用のクラスとCSS
自動スクロールさせたいリッチカラムの「高度な設定 → 追加CSSクラス」にwaza-column-autoを入力します。
投稿リストや各カラムではなく、外側のリッチカラムへ付けてください。
次のCSSは「外観 → カスタマイズ → 追加CSS」へ追加します。
.waza-column-auto > .waza-column-play {
min-height: 44px;
margin-top: 1rem;
padding: .6em 1em;
border: 1px solid #888;
border-radius: 4px;
background: #fff;
color: #333;
font: inherit;
cursor: pointer;
}
.waza-column-auto > .waza-column-play:focus-visible { outline: 3px solid #245bba; outline-offset: 3px; }
.waza-column-auto > .waza-column-play:disabled { opacity: .7; cursor: default; }
自動スクロール用のJavaScript
記事編集画面の「カスタムJS」欄に、scriptタグなしで追加します。
複数のリッチカラムへ使う場合も、コード自体はそのページに1回だけ追加します。
それぞれの開始・停止ボタンは独立しています。
(function () {
function initColumns() {
document.querySelectorAll('.waza-column-auto').forEach(function (root) {
if (root.dataset.wazaReady) return;
const track = root.querySelector('.swell-block-columns__inner');
if (!track || track.children.length < 2) return;
root.dataset.wazaReady = '1';
const button = document.createElement('button');
button.type = 'button';
button.className = 'waza-column-play';
root.appendChild(button);
const reduced = window.matchMedia('(prefers-reduced-motion: reduce)');
let timer = null;
function stop() {
if (timer !== null) window.clearInterval(timer);
timer = null;
button.textContent = '自動スクロールを開始';
button.setAttribute('aria-pressed', 'false');
}
function update() {
stop();
button.disabled = reduced.matches || track.scrollWidth <= track.clientWidth + 2;
if (reduced.matches) button.textContent = '動きを抑える設定のため自動再生は無効';
else if (button.disabled) button.textContent = 'すべての項目を表示しています';
}
function advance() {
const max = track.scrollWidth - track.clientWidth;
const first = track.children[0].getBoundingClientRect().left;
const positions = Array.from(track.children).map(function (el) {
return el.getBoundingClientRect().left - first;
});
const next = positions.find(function (left) { return left > track.scrollLeft + 2; });
const target = track.scrollLeft >= max - 2 ? 0 : Math.min(next === undefined ? max : next, max);
track.scrollTo({ left: target, behavior: 'smooth' });
}
button.addEventListener('click', function () {
if (timer !== null) { stop(); return; }
if (reduced.matches || track.scrollWidth <= track.clientWidth + 2) { update(); return; }
button.textContent = '自動スクロールを停止';
button.setAttribute('aria-pressed', 'true');
timer = window.setInterval(advance, 3500);
});
track.addEventListener('pointerdown', stop);
track.addEventListener('focusin', stop);
track.addEventListener('wheel', stop, { passive: true });
document.addEventListener('visibilitychange', function () { if (document.hidden) stop(); });
window.addEventListener('resize', update);
reduced.addEventListener('change', update);
update();
});
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initColumns, { once: true });
else initColumns();
})();
間隔は3500ミリ秒で指定しています。
カラムの幅と間隔は実際の表示位置から計算するため、JavaScript内に余白24pxを固定で書く必要はありません。
記事要素は複製しません。
動かない場合と元に戻す方法
手動でも横に動かない場合は、横スクロール設定とカラムの合計幅を確認します。
自動で動かない場合は、外側のクラス名、カスタムJSの保存、キャッシュ、端末の動きを抑える設定を確認してください。
全項目が表示領域に収まっている場合は開始ボタンが無効になります。
旧版のauto-slideクラスと自動再生JavaScriptを使用している場合は、控えを保存してから取り外し、新版へ置き換えます。
旧版と新版を重ねて実行しないでください。
自動スクロールだけをやめる場合は、JavaScript・ボタン用CSS・専用クラスを削除します。
ブロックの手動横スクロールは残ります。
横並び自体を戻す場合は、リッチカラムの横スクロール設定も解除してください。
用途に合う方式は投稿リスト・記事スライダーの比較表でも確認できます。
2つの自動スクロールと1項目の見本
次は別の開始ボタンを持つ2つ目の自動スクロールです。
各ボタンは、そのリストだけを開始・停止します。
片方を動かした後に画面幅を変更すると、動作中のリストは停止します。
次は記事1件だけの見本です。
2件未満では自動再生用のボタンを作りません。
表示領域に収まる場合の無効化とは別の分岐です。
全項目が収まる幅では開始ボタンを無効にする
次は記事2件、PCとタブレットの幅300px・スマホ200pxの見本です。
記事の本文幅が広いPCでは全項目が収まり、開始ボタンは無効になります。
スマホ幅では横スクロールが発生して開始ボタンが有効になります。
幅を変更しても自動で再生は始まりません。
スマホでの操作画面
2つ目のリストの開始ボタンと、その下の1項目の見本です。
複数リストを個別に操作でき、1項目のリストには再生ボタンを追加しません。




