スライドの各ページをバナー画像のように表示したい。
カルーセル処理を実装するのは難易度が高いので、以下のライブラリーの機能を確認し利用させていただくことにした。
以下の項目について確認(計画的に試したわけではなく、mardock で実際に使ってみて軽くメモしていた程度)。
Next.js で利用する場合は少し対応が必要
画像以外も意識した作り
各項目(要素)は表示時だけ Document ツリーに追加される
スワイプ対応だが指で弾くように操作、キーボードには未対応
インジケーターは要素とは別領域、前後ボタンは要素に重ねて表示
シンプルな構成だが必要な機能は搭載されている。名称にもあるように Material UI 環境で使っても違和感が少ない。スタイル設定は外部 CSS 等を必要としない。前後ボタンの表示方法等も調整できる(その代わりにバージョンで挙動に差異あり)。
スワイプ操作時に前後項目とのドラッグ表示は行われないが、指で弾くようなページ送りは比較的軽快に行われる。
Next.js でも利用可能
画像を意識した作り(設定で画像以外にも対応)
各項目(要素)はリスト(ul li ) で常に Document ツリーに存在
ul
li
スワイプ、キーボードにも対応
インジケーター、前後ボタンどちらも要素に重ねて表示
一通りそろった高機能な構成。縦スクロール対応等もある。Material UI 環境で使うと若干の違和感あり、カスタマイズする場合は外部 CSS とのすり合わせが必要。
Next.js では利用できなかった(window が前提のもよう)
window
基本的なコンポーネントを組み合わせる構成(インジケーター等も個別コンポーネント)
プラグインでの拡張を意識した作り
Next.js 未対応だったので詳細な利用はしていない。
img
block
各項目(要素)は div の階層として常に Document ツリーに存在
div
インジケーター、前後ボタンどちらも要素外に表示
デフォルトで提示されているテーマは slick-carousel から各種ファイルをコピーする必要がある
一通りそろった高機能な構成。縦スクロール、rtl 対応等もある。スタイルは編集することが前提なので(外部 CSS はテーマが分離されている)、Material UI 環境でも自然な表示にできる。環境によってスワイプ時のページ間に隙間あり(消す方法は不明)。
スワイプ操作の反応が若干良くないように感じた(使い方の問題の可能性もある)。
なお、他の用途でも使う可能性がありそうだったので、外部 CSS(テーマ)は jss 化した。詳細は「付録」ページを参照。
「スワイプ時のドラッグ表示」「自然なループ表示」を理由に react-slick へ傾きかけたが、以下が決め手となり react-material-ui-carousel を利用することとした。
デザインと機能、応答性のバランス
react-slick を試したときに Next.js + Material UI で扱いやすように作成したコンポーネント(現在は未使用なので検証はあまりしていない)。
.css
https://github.com/hankei6km/mardock/blob/804715df04d8e3d9ec372bffbb998f0c3eab2fe1/components/PageSwitcher.tsx