ドロワーメニュー内にスライダーを表示する方法
ドロワーメニューは、必要なときだけ画面の端からメニューを表示できるUIです。通常のリンクメニューだけでなく、ドロワーメニューの中に別のUIを配置することで、限られたスペースを活用しながらさまざまな情報を見せることができます。この記事では、画面左側から開くドロワーメニューの中に、1枚ずつ画像を切り替えて表示できるスライダーを配置します。
「メニューを開く」ボタンをクリックすると左側からドロワーメニューが表示され、ホーム・サービス・お知らせ・お問い合わせのリンクと一緒にスライダーを確認できます。スライダーは3枚の画像を用意し、左右のボタンまたは下部のドットをクリックして表示する画像を切り替えられます。最初の画像では前ボタン、最後の画像では次ボタンが無効になるため、画像の範囲を超えて移動することはありません。
HTMLでドロワーメニューとスライダーの構造を作り、CSSでドロワーのスライド表示や画像の横方向の配置を整え、JavaScriptでメニューの開閉とスライダーの切り替えを制御します。ドロワーメニューの中でおすすめコンテンツや画像を1枚ずつ大きく紹介したい場合など、複数のUIを組み合わせたレイアウトの基本として利用できます。画面幅640px以下では余白や操作ボタンのサイズを調整し、スマートフォンでも操作しやすい表示にしています。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
「メニューを開く」をクリックすると、スライダーを配置したドロワーメニューが画面左側から表示されます。
「メニューを開く」をクリックすると左側からドロワーメニューが表示されます。ドロワー内では左右のボタンまたはドットを使って画像を切り替えられます。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>ドロワーメニュー内のスライダー</title>
<!-- CSSファイル -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- ドロワーメニューを開くボタン -->
<button class="drawer-carousel_open" type="button">
メニューを開く
</button>
<!-- ドロワーメニュー表示時の背景 -->
<div class="drawer-carousel_overlay"></div>
<!-- ドロワーメニュー -->
<div class="drawer-carousel_drawer">
<!-- ドロワーメニューの見出し -->
<div class="drawer-carousel_heading">
メニュー
</div>
<!-- ナビゲーション -->
<nav class="drawer-carousel_nav">
<a class="drawer-carousel_link" href="#">
ホーム
</a>
<a class="drawer-carousel_link" href="#">
サービス
</a>
<a class="drawer-carousel_link" href="#">
お知らせ
</a>
<a class="drawer-carousel_link" href="#">
お問い合わせ
</a>
</nav>
<!-- スライダー -->
<div class="drawer-carousel_carousel">
<!-- スライダーの見出し -->
<div class="drawer-carousel_carousel-title">
おすすめコンテンツ
</div>
<!-- スライダー本体 -->
<div class="drawer-carousel_area">
<!-- 前の画像へ移動するボタン -->
<button
class="drawer-carousel_button drawer-carousel_prev"
type="button"
aria-label="前の画像">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M15 18l-6-6 6-6"></path>
</svg>
</button>
<!-- スライダー表示領域 -->
<div class="drawer-carousel_view">
<!-- 横方向へ移動するトラック -->
<div class="drawer-carousel_track">
<!--
使用する画像は利用者自身で用意してください。
sampleフォルダ内にimagesフォルダを作成し、
image1.png・image2.png・image3.pngを配置します。
画像ファイルはZIPには含まれていません。
-->
<!-- 1枚目の画像 -->
<div class="drawer-carousel_item">
<img
src="images/image1.png"
alt="1枚目の画像">
</div>
<!-- 2枚目の画像 -->
<div class="drawer-carousel_item">
<img
src="images/image2.png"
alt="2枚目の画像">
</div>
<!-- 3枚目の画像 -->
<div class="drawer-carousel_item">
<img
src="images/image3.png"
alt="3枚目の画像">
</div>
</div>
</div>
<!-- 次の画像へ移動するボタン -->
<button
class="drawer-carousel_button drawer-carousel_next"
type="button"
aria-label="次の画像">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M9 6l6 6-6 6"></path>
</svg>
</button>
</div>
<!-- スライダーのドット -->
<div class="drawer-carousel_dots" aria-label="画像を選択">
<button
class="drawer-carousel_dot is-active"
type="button"
aria-label="1枚目を表示">
</button>
<button
class="drawer-carousel_dot"
type="button"
aria-label="2枚目を表示">
</button>
<button
class="drawer-carousel_dot"
type="button"
aria-label="3枚目を表示">
</button>
</div>
</div>
<!-- ドロワーメニューを閉じるボタン -->
<button class="drawer-carousel_close" type="button">
閉じる
</button>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。 サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLでは画面左側から表示するドロワーメニュー、その中のナビゲーションと3枚の画像を切り替えるスライダーを配置します。CSSではドロワーメニューの開閉位置、背景オーバーレイ、ナビゲーション、スライダーの画像・前後ボタン・ドットなどの表示を設定し、JavaScriptではドロワーメニューの開閉とスライダーの画像切り替えを行います。スライダーで使用する画像ファイルはZIPには含まれていないため、利用者自身で用意します。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはドロワーメニューとスライダーの構造を作るファイルです。「メニューを開く」ボタン、背景オーバーレイ、ナビゲーション、スライダーの3つの画像項目、前後ボタン、3つのドット、「閉じる」ボタンを配置しています。ナビゲーションのリンク先や表示文字、スライダーで使用する画像のパスやalt属性はこのファイルから変更できます。
style.cssはドロワーメニューとスライダーのデザインを設定するファイルです。ドロワーメニューの横幅や余白、左側から表示するアニメーション、背景オーバーレイ、ナビゲーションの間隔、スライダー画像の比率や角丸、前後ボタンやドットのサイズ・色などを変更できます。
script.jsはドロワーメニューとスライダーの動作を制御するファイルです。「メニューを開く」をクリックするとドロワーメニューと背景オーバーレイを表示し、「閉じる」をクリックすると両方を非表示にします。スライダーでは現在表示している画像番号を管理し、前後ボタンまたはドットをクリックすると対応する画像へ移動します。1枚目では前ボタン、最後の画像では次ボタンが無効になり、最後から最初へ戻るループ動作は行いません。
設置方法・使い方
ZIPを展開すると、sampleフォルダ内にindex.html、style.css、script.jsが配置されています。スライダーで使用する画像はZIPに含まれていないため、sampleフォルダ内へimagesフォルダを作成し、利用者自身で用意したPNG画像をimage1.png、image2.png、image3.pngとして配置してください。画像を別のファイル名にする場合は、index.htmlのsrc="images/image1.png"などを実際のファイル名に合わせて変更します。
index.htmlから同じ階層のstyle.cssとscript.jsを読み込む構成になっています。3つのファイルとimagesフォルダを配置したあと、sample/index.htmlをブラウザで開いてください。「メニューを開く」をクリックすると画面左側からドロワーメニューが表示されます。ドロワーメニュー内ではナビゲーションの下にスライダーが表示され、左右のボタンまたはドットをクリックすると3枚の画像を切り替えられます。「閉じる」をクリックするとドロワーメニューが画面左側へ戻ります。
カスタマイズできる内容
index.htmlでは、「メニュー」の表示文字、ホーム・サービス・お知らせ・お問い合わせのリンク文字とhref、スライダーの「おすすめコンテンツ」という表示文字、画像のパスとalt属性を変更できます。画像を追加または削除する場合は、drawer-carousel_itemと、それに対応するdrawer-carousel_dotを同じ数になるように追加・削除します。JavaScriptは項目数をdrawer-carousel_itemから取得するため、画像項目とドットの数を一致させてください。
style.cssでは、ドロワーメニューの横幅、背景色、内側余白、影、ナビゲーションリンクの背景色、スライダー画像の比率や角丸、前後ボタンとドットのサイズ・色、画像切り替え速度などを変更できます。script.jsでは最初に表示する画像をdrawerCarouselCurrentIndexで管理しており、初期値の0は1枚目を表します。
数値調整
style.css
padding:40px 20px;
ページ全体の余白です。40pxは上下、20pxは左右の余白です。値を大きくすると画面端との間隔が広がります。
padding:12px 26px;
「メニューを開く」ボタンの内側余白です。12pxは上下、26pxは左右の余白です。値を大きくするとボタンが大きくなります。
border-radius:8px;
「メニューを開く」ボタン、ナビゲーションリンク、「閉じる」ボタンの角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
font-size:16px;
「メニューを開く」ボタンと「閉じる」ボタンの文字サイズです。値を大きくすると文字が大きくなります。
transition:.3s;
ドロワーメニューと背景オーバーレイの開閉時間です。0.3秒で変化します。値を大きくするとゆっくり、小さくすると速く切り替わります。
width:420px;
ドロワーメニューの横幅です。値を大きくするとドロワーメニューが横に広がり、小さくすると狭くなります。
max-width:90%;
ドロワーメニューが画面幅に対して使用できる最大横幅です。値を小さくすると画面右側に残る余白が広くなります。
padding:32px 24px;
ドロワーメニューの内側余白です。32pxは上下、24pxは左右です。値を大きくすると内容と画面端との間隔が広がります。
translateX(calc(-100% - 40px))
閉じているドロワーメニューを左側へ移動する位置です。100%でドロワー自身の横幅分を移動し、さらに40px左へ移動しています。40pxを大きくすると非表示時の位置がさらに左になります。
box-shadow:12px 0 30px ...
開いたドロワーメニューの影です。12pxは横方向の位置、30pxはぼかし範囲です。値を大きくすると影の位置や広がりが変わります。
margin:0 0 28px;
「メニュー」の見出し下側の余白です。28pxを大きくするとナビゲーションとの間隔が広がります。
font-size:24px;
「メニュー」の文字サイズです。値を大きくすると見出しが大きくなります。
gap:10px;
ナビゲーションリンク同士の間隔です。また、スライダーでは前後ボタンと画像の間隔にも10pxを使用しています。値を大きくするとそれぞれの間隔が広がります。
margin-bottom:32px;
ナビゲーションとスライダーの間隔です。値を大きくすると両者の間隔が広がります。
padding:14px 16px;
ナビゲーションリンクの内側余白です。14pxは上下、16pxは左右です。値を大きくするとリンクのクリック領域が広がります。
margin-bottom:28px;
スライダー全体と「閉じる」ボタンの間隔です。値を大きくすると間隔が広がります。
margin:0 0 16px;
「おすすめコンテンツ」とスライダー本体の間隔です。16pxを大きくすると間隔が広がります。
font-size:18px;
「おすすめコンテンツ」の文字サイズです。値を大きくすると文字が大きくなります。
40px
スライダーの前後ボタンの横幅と高さです。値を大きくすると円形ボタンが大きくなり、小さくするとコンパクトになります。
20px
前後ボタン内のSVG矢印の横幅と高さです。値を大きくすると矢印が大きくなります。
stroke-width:2;
SVG矢印の線幅です。値を大きくすると矢印の線が太くなります。
transition:transform .4s ease;
スライダー画像の移動時間です。0.4秒で切り替わります。値を大きくするとゆっくり、小さくすると速く移動します。
aspect-ratio:16 / 9;
スライダー画像の表示比率です。16が横、9が縦の比率を表します。値を変更すると画像表示領域の縦横比が変わります。
border-radius:14px;
スライダー画像の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
gap:8px;
スライダー下部にあるドット同士の間隔です。値を大きくするとドット同士が離れます。
margin-top:16px;
スライダー画像とドットの間隔です。値を大きくすると上下の間隔が広がります。
width:10px;・height:10px;
各ドットの大きさです。値を大きくするとドットが大きくなります。
script.js
let drawerCarouselCurrentIndex = 0;
スライダーの初期表示位置です。0は1枚目、1は2枚目、2は3枚目を表します。初期値を変更すると、ページを開いたときに選択する画像を変更できます。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのドロワーメニューにはwidth:420pxとmax-width:90%を指定しているため、画面幅が狭い場合は画面に合わせて横幅が縮小されます。スライダーの表示領域にはflex:1とmin-width:0、画像にはwidth:100%を指定しているため、ドロワーメニューの横幅に合わせて画像も縮小されます。
画面幅640px以下では、ページ全体の余白を24px 12px、ドロワーメニューの内側余白を24px 18pxへ変更します。スライダーでは前後ボタンと画像の間隔を6px、前後ボタンを36px、SVG矢印を18pxへ縮小します。これにより、スマートフォン・タブレット・PCの画面幅に合わせて表示できます。
コメント