ブログ記事の中に、要点をまとめたスライド画像を入れたいことがあります。
たとえば、
- AIサービスの比較スライド
- 決算資料の要約スライド
- 手順解説の画像スライド
- SNSにも流用できる図解コンテンツ
などです。
この記事では、SWELLユーザー向けに、記事内で画像スライドをきれいに表示する方法を整理します。
結論からいうと、今回のような用途では、ギャラリーブロック+共通CSS/JSで画像スライダー化する方法が、見やすさと運用のバランスが良くておすすめです。
最もおすすめの方法:ギャラリーブロックをスライダー化する










今回、一番バランスがよいと感じたのが、WordPress標準のギャラリーブロックをスライダー化する方法です。
WordPressのギャラリーブロックは、複数の画像を追加し、自動で配置できるブロックです。公式ドキュメントでも、複数画像を簡単に追加して、カラム数や画像サイズを調整できるブロックとして説明されています。
このギャラリーブロックに、追加CSSクラスを付けます。
mode-slider-gallery
そして、サイト全体に登録しておいたCSSとJSで、そのギャラリーだけをスライダー化します。
/* ==============================
ギャラリーブロック画像スライダー
対象:mode-slider-gallery を付けたギャラリーブロック
============================== */
/* スライダー全体の外枠 */
.mode-slider {
position: relative;
width: 100%;
max-width: 980px;
margin: 2rem auto;
}
/* 横スクロールする表示エリア */
.mode-slider__viewport {
overflow-x: auto;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
}
/* Chrome / Safari のスクロールバーを非表示 */
.mode-slider__viewport::-webkit-scrollbar {
display: none;
}
/* ギャラリー画像を横並びにする */
.mode-slider__track {
display: flex !important;
flex-wrap: nowrap !important;
gap: 16px;
align-items: stretch;
margin: 0 !important;
padding: 0 !important;
list-style: none;
}
/* 1枚分のスライド枠 */
.mode-slider__track > .wp-block-image,
.mode-slider__track > .blocks-gallery-item {
flex: 0 0 88% !important;
width: 88% !important;
max-width: 88% !important;
margin: 0 !important;
aspect-ratio: 16 / 9;
scroll-snap-align: center;
border-radius: 16px;
overflow: hidden;
background: #fff;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.10);
}
/* 画像をスライド枠にきれいに収める */
.mode-slider__track > .wp-block-image img,
.mode-slider__track > .blocks-gallery-item img {
display: block;
width: 100% !important;
height: 100% !important;
object-fit: contain;
border-radius: 0;
}
/* 画像リンクがある場合も枠いっぱいにする */
.mode-slider__track > .wp-block-image a,
.mode-slider__track > .blocks-gallery-item a {
display: block;
width: 100%;
height: 100%;
}
/* キャプションがある場合は非表示にする */
.mode-slider__track figcaption,
.mode-slider__track .blocks-gallery-item__caption {
display: none;
}
/* 左右の矢印ボタン共通 */
.mode-slider__arrow {
position: absolute;
top: 50%;
z-index: 2;
transform: translateY(-50%);
width: 42px;
height: 42px;
border: none;
border-radius: 999px;
background: rgba(255, 255, 255, 0.94);
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.16);
color: #333;
font-size: 2rem;
line-height: 1;
cursor: pointer;
}
/* 左矢印 */
.mode-slider__arrow--prev {
left: 8px;
}
/* 右矢印 */
.mode-slider__arrow--next {
right: 8px;
}
/* 下部のドット全体 */
.mode-slider__dots {
display: flex;
justify-content: center;
gap: 8px;
margin-top: 14px;
}
/* 通常状態のドット */
.mode-slider__dot {
width: 8px;
height: 8px;
padding: 0;
border: none;
border-radius: 999px;
background: #d6d6d6;
cursor: pointer;
}
/* 現在表示中のドット */
.mode-slider__dot.is-active {
width: 22px;
background: #ff7a59;
}
/* PC表示 */
@media (min-width: 768px) {
.mode-slider__track > .wp-block-image,
.mode-slider__track > .blocks-gallery-item {
flex-basis: 76% !important;
width: 76% !important;
max-width: 76% !important;
}
.mode-slider__arrow {
width: 48px;
height: 48px;
}
.mode-slider__arrow--prev {
left: -20px;
}
.mode-slider__arrow--next {
right: -20px;
}
}
/* スマホ表示 */
@media (max-width: 767px) {
.mode-slider {
padding-bottom: 56px;
}
.mode-slider__arrow {
top: auto;
bottom: 0;
transform: none;
width: 42px;
height: 42px;
font-size: 1.8rem;
background: #fff;
}
.mode-slider__arrow--prev {
left: calc(50% - 56px);
}
.mode-slider__arrow--next {
right: calc(50% - 56px);
}
.mode-slider__dots {
margin-top: 12px;
}
}document.addEventListener('DOMContentLoaded', function () {
const galleries = document.querySelectorAll('.wp-block-gallery.mode-slider-gallery');
galleries.forEach(function (gallery) {
// 二重初期化を防ぐ
if (gallery.dataset.sliderReady === 'true') return;
gallery.dataset.sliderReady = 'true';
// 古いギャラリーブロック形式にも一応対応
const track = gallery.querySelector('.blocks-gallery-grid') || gallery;
// スライド要素を取得
const slides = Array.from(
track.querySelectorAll(':scope > .wp-block-image, :scope > .blocks-gallery-item')
);
// 画像が2枚未満ならスライダー化しない
if (slides.length < 2) return;
// 外枠を作成
const slider = document.createElement('div');
slider.className = 'mode-slider';
// 表示エリアを作成
const viewport = document.createElement('div');
viewport.className = 'mode-slider__viewport';
// 矢印ボタンを作成
const prevButton = document.createElement('button');
prevButton.className = 'mode-slider__arrow mode-slider__arrow--prev';
prevButton.type = 'button';
prevButton.setAttribute('aria-label', '前の画像');
prevButton.textContent = '‹';
const nextButton = document.createElement('button');
nextButton.className = 'mode-slider__arrow mode-slider__arrow--next';
nextButton.type = 'button';
nextButton.setAttribute('aria-label', '次の画像');
nextButton.textContent = '›';
// ドット用のエリアを作成
const dots = document.createElement('div');
dots.className = 'mode-slider__dots';
dots.setAttribute('aria-label', 'スライド位置');
// 元のギャラリーをスライダー構造の中に移動
gallery.parentNode.insertBefore(slider, gallery);
slider.appendChild(prevButton);
slider.appendChild(viewport);
viewport.appendChild(gallery);
slider.appendChild(nextButton);
slider.appendChild(dots);
// 横並び用クラスを付ける
track.classList.add('mode-slider__track');
let current = 0;
// ドットを作成
slides.forEach(function (_, index) {
const dot = document.createElement('button');
dot.className = 'mode-slider__dot';
dot.type = 'button';
dot.setAttribute('aria-label', (index + 1) + '枚目へ');
dot.addEventListener('click', function () {
goToSlide(index);
});
dots.appendChild(dot);
});
const dotButtons = Array.from(dots.querySelectorAll('.mode-slider__dot'));
// 指定した番号のスライドへ移動
function goToSlide(index) {
current = Math.max(0, Math.min(index, slides.length - 1));
slides[current].scrollIntoView({
behavior: 'smooth',
block: 'nearest',
inline: 'center'
});
updateDots();
}
// 表示中のドットを更新
function updateDots() {
dotButtons.forEach(function (dot, index) {
dot.classList.toggle('is-active', index === current);
});
}
// スワイプや横スクロール後に、現在のスライドを判定
function detectCurrentSlide() {
const viewportCenter =
viewport.getBoundingClientRect().left + viewport.clientWidth / 2;
let closestIndex = 0;
let closestDistance = Infinity;
slides.forEach(function (slide, index) {
const rect = slide.getBoundingClientRect();
const slideCenter = rect.left + rect.width / 2;
const distance = Math.abs(viewportCenter - slideCenter);
if (distance < closestDistance) {
closestDistance = distance;
closestIndex = index;
}
});
current = closestIndex;
updateDots();
}
// 左矢印
prevButton.addEventListener('click', function () {
goToSlide(current - 1);
});
// 右矢印
nextButton.addEventListener('click', function () {
goToSlide(current + 1);
});
// スクロール後に現在位置を更新
viewport.addEventListener('scroll', function () {
window.clearTimeout(viewport._scrollTimer);
viewport._scrollTimer = window.setTimeout(detectCurrentSlide, 80);
});
// 初期状態のドットを反映
updateDots();
});
});この方式のメリット
この方式のメリットは大きいです。
- 投稿画面で画像を選ぶだけでよい
- 画像URLを手打ちしなくてよい
- 記事ごとに画像を変えやすい
- 矢印、ドット、スワイプを付けられる
- プラグインより軽く作りやすい
- iframeよりスマホで見やすい
記事を書く流れは、こうなります。
投稿を書く
↓
ギャラリーブロックを追加
↓
画像を複数選ぶ
↓
追加CSSクラスを付ける
↓
自動でスライダー表示
CSSとJSは毎回書かず、WPCodeなどで一元管理する
ここで大事なのが、CSSとJSの管理方法です。毎回、記事本文にCSSやJSを書くのはおすすめしません。理由はシンプルです。
- 記事本文が汚くなる
- 修正時に全記事を直す必要がある
- どこに何を書いたかわからなくなる
- ミスが起きやすい
理想はこうです。
CSS・JS:サイト全体に1回だけ登録
記事ごと:ギャラリーブロックにクラスを付けるだけ
CSSはWordPressの追加CSSや子テーマで管理できます。WordPress公式ドキュメントでも、カスタムCSSを追加できる仕組みについて説明されています。
ただし、コードが増えてくると、追加CSS欄だけでは管理しづらくなります。その場合は、WPCodeのようなスニペット管理プラグインでCSSとJSを分けて管理する方法もあります。
WPCodeは、PHP、JavaScript、CSS、HTMLなどのカスタムコードをスニペットとして追加できるプラグインです。WordPress.orgの説明でも、テーマファイルを編集せずに、CSSやJavaScriptなどのコードを追加できるとされています。
また、WPCodeには条件付き読み込みの機能もあります。公式ドキュメントでは、特定のルールに応じてスニペットの実行場所を変えられると説明されています。

最初に試した方法:HTMLスライドをiframeで埋め込む
HTMLで作ったスライドを、以下のようにiframeで記事内に表示する方法があります。
<div style="position:relative; width:100%; max-width:1200px; margin:0 auto; padding-top:65%; border:1px solid #eee; border-radius:12px; overflow:hidden; background:#fff;">
<iframe
src="スライドHTMLのURL"
style="position:absolute; inset:0; width:100%; height:100%; border:0; display:block;"
loading="lazy"
allowfullscreen
></iframe>
</div>
PCではそれなりに見えますが、スマホではかなり難があります。
iframeスライドがスマホで読みにくい理由
スマホでiframeスライドが読みにくい理由は、主に3つです。
1つ目は、横長スライドと縦長スマホの相性が悪いことです。
16:9のスライドをスマホ幅に合わせると、高さがかなり小さくなります。結果として、文字も小さく見えます。
2つ目は、iframe内の操作と記事全体のスクロールがぶつかることです。
読者は記事を縦に読んでいるのに、途中でiframe内だけを操作する必要が出ます。これが地味にストレスになります。
3つ目は、SEO上も本文として扱いづらいことです。
iframe内の内容は、通常の記事本文と比べて読者にも検索エンジンにも伝わりにくくなります。
そのため、ブログ記事のメインコンテンツとしては、iframeスライドはあまり向いていません。
画像スライド化すると扱いやすくなる
そこで、HTMLスライドではなく、スライドをPNGやWebP画像として書き出す方法に切り替えます。
画像化すると、次のメリットがあります。
- 表示崩れが少ない
- スマホでも見た目を保ちやすい
- SNSにも流用しやすい
- WordPressのメディア管理に載せられる
- 記事内の画像として扱いやすい
特に、図解や要約スライドは、HTMLで動かすよりも画像化した方が安定します。
ただし、PNGのまま高解像度画像を何枚も並べると重くなりやすいです。記事内で使うなら、WebP化して横幅1200px前後に圧縮しておくと扱いやすくなります。
候補1:SWELLのリッチカラムで横スクロール表示する










SWELLには、画像やカードを横に並べやすい「リッチカラム」系の機能があります。SWELLユーザー向けの解説記事でも、リッチカラムの横スクロール機能は、画像や口コミなどを並べる用途に便利と紹介されています。
リッチカラムを使うと、画像を横並びにして、スマホでは横スクロールで見せることができます。
リッチカラム方式のメリット
リッチカラム方式のメリットは、次の通りです。
- SWELL標準機能だけで作りやすい
- 画像を横並びで見せられる
- コードをほとんど書かなくてよい
- まず試す方法としては手軽
少しCSSを足すと、次の画像の端を見せたり、スワイプ時に1枚ごとに止まりやすくしたりできます。
リッチカラム方式のデメリット
一方で、デメリットもあります。
- 横スクロールできることが伝わりにくい
- 矢印やドットがないとスライド感が弱い
- 読者が横スクロールに気づかないことがある
- 「1枚ずつ切り替える」操作感にはなりにくい
スマホでは、横スクロール要素が見逃されることもあります。実際、リッチカラムの横スクロールを紹介する記事でも、スマホでは横スクロール部分を見逃される可能性があると指摘されています。
候補2:スライダープラグインを使う
次に考えられるのが、画像スライダー用プラグインを使う方法です。
スライダープラグインを使えば、矢印、ドット、自動再生、フェード切り替えなどを管理画面から設定できます。
プラグイン方式のメリット
プラグイン方式のメリットは次の通りです。
- ノーコードで作りやすい
- 矢印やドットを簡単に付けられる
- デザイン設定が管理画面でできる
- 同じスライダーを何度も使い回しやすい
プラグイン方式のデメリット
ただし、今回のように記事ごとに違う画像スライドを入れたい場合は、少し面倒です。
多くのスライダープラグインでは、
プラグインの管理画面でスライダーを作る
↓
画像を登録する
↓
ショートコードをコピーする
↓
投稿画面に貼る
という流れになります。
投稿を書いている途中に、画像ブロックやギャラリーブロックのような感覚でサッと入れるには、やや遠回りです。
つまり、プラグインは「固定スライダーを作って使い回す」用途には向いています。しかし、「記事ごとに画像を選んで、その場でスライダー化したい」用途では、少し運用が重くなります。
ブログパーツやパターン登録はどうか
SWELLにはブログパーツ機能もあります。SWELL公式では、ブログパーツとして登録したコンテンツをショートコードで呼び出せると説明されています。
これは便利ですが、今回のように記事ごとに画像が変わるスライダーには、少し向きません。
ブログパーツが向いているのは、たとえば次のようなケースです。
- 全記事共通のCTA
- プロフィールボックス
- 固定のバナー
- 同じスライダーを何度も使う場合
一方で、今回のように、
記事A:ChatGPT比較スライド
記事B:AI動画比較スライド
記事C:決算解説スライド
のように毎回画像が変わるなら、ブログパーツよりギャラリーブロックの方がおすすめです。
おすすめの運用フロー
最終的なおすすめ運用は、次の形です。
1. スライドをPNGまたはWebPで作る
2. できればWebP化して軽量化する
3. WordPressに画像をアップロードする
4. 投稿画面でギャラリーブロックを追加する
5. 画像を複数選ぶ
6. 追加CSSクラスに mode-slider-gallery を付ける
7. 共通CSS/JSで自動スライダー化する
これなら、記事ごとに長いHTMLを書く必要がありません。また、画像URLを1つずつ入力する必要もありません。
投稿画面の流れを壊さずに、スライド画像を自然に挿入できます。
どの方法を選ぶべきか
最後に、方法ごとの向き不向きを整理します。
| 方法 | 向いているケース | 注意点 |
|---|---|---|
| iframe埋め込み | HTMLスライドをそのまま見せたい | スマホで読みにくい |
| リッチカラム横スクロール | 手軽に画像を横並びにしたい | スライド感は弱い |
| スライダープラグイン | 固定スライダーを作り込みたい | 記事ごとに作ると面倒 |
| ギャラリーブロック+CSS/JS | 記事ごとに画像スライドを入れたい | 最初だけCSS/JS設定が必要 |
| ブログパーツ | 同じ内容を使い回したい | 画像が毎回変わる用途には不向き |
今回のように、記事ごとに違う画像スライドを入れたいSWELLユーザーなら、ギャラリーブロック+CSS/JS方式が扱いやすいです。
まとめ
SWELLの記事内にスライドを入れたい場合、最初はiframeやリッチカラムで対応したくなります。
しかし、スマホでの見やすさや記事制作のしやすさを考えると、横長HTMLスライドをiframeで埋め込む方法はあまり相性がよくありません。
おすすめは、スライドを画像化し、WordPressのギャラリーブロックを使って記事内に挿入する方法です。
そのうえで、CSSとJSをサイト側に1回だけ登録しておけば、記事ごとにやることはかなりシンプルになります。
ギャラリーブロックを追加
↓
画像を選ぶ
↓
クラス名を付ける
これだけで、矢印・ドット・スワイプ対応の画像スライダーを表示できます。
SWELLで画像スライドを記事に入れたいなら、プラグインを増やす前に、ギャラリーブロック+共通CSS/JSで仕組み化するのが、軽さと運用のバランスがよい方法です。
