Swiperウェブコンポーネントは、Swiperバージョン9以降で利用できます。
カスタム要素はすべての主要なブラウザーとほとんどすべてのフレームワークでサポートされています。
Swiper Elementをプロジェクトにインストールする方法はいくつかあります。
SwiperをNPMからインストールできます。
$ npm install swiper
ノードモジュールからSwiperカスタム要素をインポートするときは、手動で登録する必要があります。これは1回だけ行う必要があり、Swiperカスタム要素をグローバルに登録します。
// import function to register Swiper custom elements
import { register } from 'swiper/element/bundle';
// register Swiper custom elements
register();
<script>
タグを使用してWebサイトに直接追加することで、CDNからインストールすることもできます。
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-element-bundle.min.js"></script>
この場合、自動的に登録され、register()
を呼び出す必要はありません。
Swiper Elementをインストールすると(ノードモジュールを介してregister()
を呼び出すか、スクリプトタグを含めることで)、使用可能な2つのウェブコンポーネント(カスタム要素)があります。
<swiper-container>
- すべての参数を定義するSwiperのメイン要素<swiper-slide>
- Swiperスライド要素<swiper-container>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
すべてのSwiperパラメータは、<swiper-container>
のkebab-case
属性の形式で使用できます。たとえば、
<swiper-container slides-per-view="3" speed="500" loop="true" css-mode="true">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
オブジェクトとして渡されるすべてのパラメータは、[key]-[subkey]="value"
の形式の属性としても渡すことができます。
たとえば、そのような構成
new Swiper('.swiper', {
slidesPerView: 3,
grid: {
rows: 3,
},
mousewheel: {
forceToAxis: true,
},
});
このように渡す必要があります。
<swiper-container
slides-per-view="3"
grid-rows="3"
mousewheel-force-to-axis="true"
>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
より複雑なパラメータオブジェクト(ブレークポイントなど)を使用するさらに複雑な場合は、すべてのパラメータをHTMLElement
プロパティとして渡すことができます。
ここでは、すべての必須パラメータを渡すまでSwiperの初期化を防止するには、init="false"
属性を追加する必要があります。
<!-- Add init="false" -->
<swiper-container init="false">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
<script>
// swiper element
const swiperEl = document.querySelector('swiper-container');
// swiper parameters
const swiperParams = {
slidesPerView: 1,
breakpoints: {
640: {
slidesPerView: 2,
},
1024: {
slidesPerView: 3,
},
},
on: {
init() {
// ...
},
},
};
// now we need to assign all parameters to Swiper element
Object.assign(swiperEl, swiperParams);
// and now initialize it
swiperEl.initialize();
</script>
Swiper のパラメーターは、Swiper 要素の属性または HTMLElement
プロパティーを直接変更することで更新できます(プロップで初期化された場合)。
<swiper-container slides-per-view="1">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
<button>Update</button>
<script>
const swiperEl = document.querySelector('swiper-container');
const buttonEl = document.querySelector('button');
buttonEl.addEventListener('click', () => {
// if it was initialized with attributes
swiperEl.setAttribute('slides-per-view', '3');
// or if it was initialized with props
swiperEl.slidesPerView = 3;
});
</script>
初期化された Swiper インスタンスは、Swiper の HTMLElement
の swiper
プロップとして使用できます。
<swiper-container slides-per-view="1">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
<button>Slide Next</button>
<script>
const swiperEl = document.querySelector('swiper-container');
const buttonEl = document.querySelector('button');
buttonEl.addEventListener('click', () => {
swiperEl.swiper.slideNext();
});
</script>
すべての Swiper イベント はネイティブ DOM イベントとして利用できますが、小文字の名前と swiper
プレフィクスを使用します(events-prefix
パラメーターで設定可能)。たとえば、slideChange
は swiperslidechange
になります。
すべてのイベントハンドラーの引数は event.detail
に配列として渡されます。
<swiper-container>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
<script>
const swiperEl = document.querySelector('swiper-container');
swiperEl.addEventListener('swiperprogress', (event) => {
const [swiper, progress] = event.detail;
});
swiperEl.addEventListener('swiperslidechange', (event) => {
console.log('slide changed');
});
</script>
他のライブラリーやネイティブイベントと衝突しないように、events-prefix
属性/パラメーターを使用して、発行されたイベント名にプレフィクスを追加することもできます。
<swiper-container events-prefix="swiper-">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
<script>
const swiperEl = document.querySelector('swiper-container');
swiperEl.addEventListener('swiper-progress', (event) => {
const [swiper, progress] = event.detail;
});
swiperEl.addEventListener('swiper-slidechange', (event) => {
console.log('slide changed');
});
</script>
これらのモジュール要素をパラメーター(例:scrollbar.el
、pagination.el
)で渡さない場合は、モジュールパラメーターが指定されていれば自動的にレンダリングされます。
<!-- enable navigation, pagination, scrollbar -->
<swiper-container navigation="true" pagination="true" scrollbar="true">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
読み込み画像を遅延させる場合は、それぞれのスライドにレイジープリローダー要素を追加する必要があります。swiper-slide
コンポーネントは、lazy="true"
属性を追加することでこれを実行します。
<swiper-container>
<!-- lazy="true" attribute will automatically render the preloader element -->
<swiper-slide lazy="true">
<img src="..." loading="lazy" />
</swiper-slide>
<swiper-slide lazy="true">
<img src="..." loading="lazy" />
</swiper-slide>
<swiper-slide lazy="true">
<img src="..." loading="lazy" />
</swiper-slide>
...
</swiper-container>
Swiper web コンポーネントでは、仮想スライドを使用する際に 2 つのオプションがあります。
1 つ目のオプションは、virtual.slides
配列にスライドを渡すことですが、Swiper 要素を初期化するには要素のプロパティーを使用する必要があります。
<swiper-container init="false"></swiper-container>
<script>
// swiper element
const swiperEl = document.querySelector('swiper-container');
// swiper parameters
const swiperParams = {
virtual: {
// virtual slides
slides: ['Slide 1', 'Slide 2', 'Slide 3'],
},
};
// assign all parameters to Swiper element
Object.assign(swiperEl, swiperParams);
// and now initialize it
swiperEl.initialize();
</script>
バージョン 9 以降、Swiper の仮想スライドは、もともと DOM 内でレンダリングされたスライドで動作します。初期化時に DOM からそれらを削除し、キャッシュし、その後必要なスライドを再利用します。
<!-- it is enough to add virtual="true" attribute -->
<swiper-container virtual="true">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
バージョン 9 では、thumbs.swiper
パラメーターもサムスワイパーの CSS セレクターを受け付けます。そのため、どちらも Swiper 要素で行うには、以下を使用できます。
<!-- main swiper, pass thumbs swiper as CSS selector -->
<swiper-container thumbs-swiper=".my-thumbs"> ... </swiper-container>
<!-- thumbs swiper -->
<swiper-container class="my-thumbs"> ... </swiper-container>
Thumbs と同様に、バージョン 9 の Controller も CSS セレクターを受け付けます。
<swiper-container class="swiper-1" controller-control=".swiper-2">
...
</swiper-container>
<swiper-container class="swiper-2" controller-control=".swiper-1">
...
</swiper-container>
シャドウ DOM スコープにスタイルを追加する必要がある場合は、injectStyles
または injectStylesUrls
パラメーターを使用できます(例)。
<swiper-container init="false"> ... </swiper-container>
<script type="module">
import { register } from 'swiper/element/bundle';
register();
const swiperEl = document.querySelector('swiper-container');
const params = {
// array with CSS styles
injectStyles: [
`
:host(.red) .swiper-wrapper {
background-color: red;
}
`,
],
// array with CSS urls
injectStylesUrls: ['path/to/one.css', 'path/to/two.css'],
};
Object.assign(swiperEl, params);
swiperEl.initialize();
</script>
追加のモジュールなしで利用できる Swiper 要素のコアバージョンもあります。
これはノードモジュールからインポートできます。
// import function to register Swiper Core custom elements
import { register } from 'swiper/element';
// register Swiper custom elements
register();
モジュールを追加するには、モジュールスクリプトを含めるために通常どおりmodules
パラメータを使用する必要があり、モジュールスタイルをグローバルに追加し、モジュールスタイルをシャドウDOMに挿入する必要もあります
<swiper-container init="false"> ... </swiper-container>
<script>
import { register } from 'swiper/element';
import { Navigation, Pagination } from 'swiper/modules';
register();
const swiperEl = document.querySelector('swiper-container');
const params = {
modules: [Navigation, Pagination],
// inject modules styles to shadow DOM
injectStylesUrls: [
'path/to/navigation-element.min.css',
'path/to/pagination-element.min.css',
],
};
Object.assign(swiperEl, params);
swiperEl.initialize();
</script>
次のエレメントモジュールスタイルインポートを使用できます
swiper/element/css/a11y
- A11yモジュールに必要なスタイルswiper/element/css/autoplay
- Autoplayモジュールに必要なスタイルswiper/element/css/controller
- Controllerモジュールに必要なスタイルswiper/element/css/effect-cards
- Cards Effectモジュールに必要なスタイルswiper/element/css/effect-coverflow
- Coverflow Effectモジュールに必要なスタイルswiper/element/css/effect-creative
- Creative Effectモジュールに必要なスタイルswiper/element/css/effect-cube
- Cube Effectモジュールに必要なスタイルswiper/element/css/effect-fade
- Fade Effectモジュールに必要なスタイルswiper/element/css/effect-flip
- Flip Effectモジュールに必要なスタイルswiper/element/css/free-mode
- Free Modeモジュールに必要なスタイルswiper/element/css/grid
- Gridモジュールに必要なスタイルswiper/element/css/hash-navigation
- Hash Navigationモジュールに必要なスタイルswiper/element/css/history
- Historyモジュールに必要なスタイルswiper/element/css/keyboard
- Keyboardモジュールに必要なスタイルswiper/element/css/manipulation
- Manipulationモジュールに必要なスタイルswiper/element/css/mousewheel
- Mousewheelモジュールに必要なスタイルswiper/element/css/navigation
- Navigationモジュール必要なスタイルswiper/element/css/pagination
- Paginationモジュール必要なスタイルswiper/element/css/parallax
- Parallaxモジュールに必要なスタイルswiper/element/css/scrollbar
- Scrollbarモジュールに必要なスタイルswiper/element/css/thumbs
- Thumbsモジュールに必要なスタイルswiper/element/css/virtual
- Virtualモジュールに必要なスタイルswiper/element/css/zoom
- Zoomモジュールに必要なスタイル既定では、すべてのswiper-container
子要素は.swiper-wrapper
エレメントの子要素としてレンダリングされます。前または後に要素を追加する必要がある場合は、2つのスロットを使用できます
container-start
- .swiper-wrapper
の前にレンダリングされますcontainer-end
- .swiper-wrapper
の後にレンダリングされます<swiper-container>
<div slot="container-start">Rendered before wrapper</div>
<div slot="container-end">Rendered after wrapper</div>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
スタイル設定に使用できる次のCSSパーツがあります
container
- <div class="swiper">
のスタイルwrapper
- <div class="swiper-wrapper">
のスタイルbutton-prev
- 前のナビゲーションボタンのスタイル<div class="swiper-button-prev">
button-next
- 次のナビゲーションボタンのスタイル<div class="swiper-button-next">
pagination
- 前のページネーションコンテナーのスタイル<div class="swiper-pagination">
bullet
- ページネーション項目スタイルbullet-active
- アクティブなページネーション項目スタイルscrollbar
- - スクロールバーコンテナーのスタイル<div class="swiper-scrollbar">
たとえば
swiper-container::part(bullet-active) {
background-color: red;
}
9.1.0以降、既定のSwiperパラメータに含まれない新しい(または追加の)パラメータを登録する新しいグローバルwindow.SwiperElementRegisterParams
関数が追加されています。Swiperパラメータを拡張するカスタムプラグインを使用してSwiperエレメントを使用する場合に必要となる場合があります。
// register swiper-container HTMLElement props to be treated as Swiper parameters
window.SwiperElementRegisterParams(['foo', 'bar']);
const swiperEl = document.querySelector('swiper-container');
Object.assign(swiperEl, {
foo: 1,
bar: 2,
});
swiperEl.initialize();
Reactは、まだ(バージョン18時点では)Webコンポーネントを完全にサポートしていません。そのため、使用方法は基本的にHTMLでの使用と同じです。
import { useRef, useEffect } from 'react';
import { register } from 'swiper/element/bundle';
register();
export const MyComponent = () => {
const swiperElRef = useRef(null);
useEffect(() => {
// listen for Swiper events using addEventListener
swiperElRef.current.addEventListener('swiperprogress', (e) => {
const [swiper, progress] = e.detail;
console.log(progress);
});
swiperElRef.current.addEventListener('swiperslidechange', (e) => {
console.log('slide changed');
});
}, []);
return (
<swiper-container
ref={swiperElRef}
slides-per-view="3"
navigation="true"
pagination="true"
>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
);
};
Vueは、属性をプロパティとして渡したり、カスタムイベントをリスニングしたりする機能を含め、Webコンポーネントを完全にサポートしています。
<template>
<swiper-container
:slides-per-view="3"
:space-between="spaceBetween"
:centered-slides="true"
:pagination="{
hideOnClick: true
}"
:breakpoints="{
768: {
slidesPerView: 3,
},
}"
@swiperprogress="onProgress"
@swiperslidechange="onSlideChange"
>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper-container>
</template>
<script>
import { register } from 'swiper/element/bundle';
register();
export default function () {
setup() {
const spaceBetween = 10;
const onProgress = (e) => {
const [swiper, progress] = e.detail;
console.log(progress)
};
const onSlideChange = (e) => {
console.log('slide changed')
}
return {
spaceBetween,
onProgress,
onSlideChange,
};
}
}
</script>
Svelteは、属性をプロパティとして渡したり、カスタムイベントをリスニングしたりする機能を含め、Webコンポーネントを完全にサポートしています。
<script>
import { register } from 'swiper/element/bundle';
register();
const spaceBetween = 10;
const onProgress = (e) => {
const [swiper, progress] = e.detail;
console.log(progress)
};
const onSlideChange = (e) => {
console.log('slide changed')
}
</script>
<swiper-container
slides-per-view={3}
space-between={spaceBetween}
centered-slides={true}
pagination={{
hideOnClick: true,
}}
breakpoints={{
768: {
slidesPerView: 3,
},
}}
on:swiperprogress={onProgress}
on:swiperslidechange={onSlideChange}
>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper-container>
Solidは、属性をプロパティとして渡したり、カスタムイベントをリスニングしたりする機能を含め、Webコンポーネントを完全にサポートしています。
import { register } from 'swiper/element/bundle';
register();
export default () => {
const spaceBetween = 10;
const onProgress = (e) => {
const [swiper, progress] = e.detail;
console.log(progress);
};
const onSlideChange = (e) => {
console.log('slide changed');
};
return (
<swiper-container
slides-per-view={1}
space-between={spaceBetween}
centered-slides={true}
pagination={{
hideOnClick: true,
}}
breakpoints={{
768: {
slidesPerView: 3,
},
}}
onSwiperprogress={onProgress}
onSwiperslidechange={onSlideChange}
>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper-container>
);
};
ご覧のとおり、SwiperをWebサイトまたはアプリに統合するのは本当に簡単です。そのため、次に実行する手順は次のとおりです。