CSS + α で画像を横スクロールさせる方法 - スマホでもスクロールバーを常に表示させる
今回はCSSで複数の画像を横スクロールさせる方法について説明します。
前提条件は以下です。
- 画像の横スクロールはCSSで行う
- PCでもスマホでも、スクロールバーは常に表示させる(JavaScript)
- スクロールバーの色を変更する
説明する環境は以下です。
- macOS Catalina v10.15.5
- Visual Studio Code v1.57.0
CSSで画像を横スクロールさせる方法
画像を横スクロールさせるときに注意する点はスクロールバーの表示です。macOSではスクロール領域でマウスを動かさないと表示されませんし、iOSではスクロール領域をタップして指を動かしている間しかスクロールバーが表示されません。(Andoroidは常に表示されている)
CSSだけでスクロールバーを常に表示させる方法やデザインを変更する方法はありますが、macOSでは機能しますが、iOSでは機能しません。
そこでスクロールバーについてはsimplebar.jsを使って実装します。
simplebar.jsを読み込む
CDNが用意されているので、以下のようにCSSとJS分のファイルを読み込みます。
<!-- simplebar専用のCSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/simplebar@5.3.6/dist/simplebar.min.css"/>
<!-- simplebar.js -->
<script src="https://cdn.jsdelivr.net/npm/simplebar@5.3.6/dist/simplebar.min.js"></script>
ダウンロードして読み込みたい方は以下の公式ページをどうぞ。
HTMLに書くこと
<div class="p-slide">
<div class="p-slide__inner" >
<div class="p-slide-mask"></div>
<div class="p-slide-scroll" data-simplebar data-simplebar-auto-hide="false">
<div class="p-slide__main">
<!-- 画像1枚分 -->
<a href="#" class="p-slide__block">
<div class="p-slide__img">
<img src="https://yumegori.com/wp-content/uploads/2021/11/scrollbar01.jpg" alt="" />
</div>
</a>
<!-- 画像1枚分 -->
<a href="#" class="p-slide__block">
<div class="p-slide__img">
<img src="https://yumegori.com/wp-content/uploads/2021/11/scrollbar02.jpg" alt="" />
</div>
</a>
<!-- 2枚目以降は省略 -->
</div>
</div>
</div>
</div>
ポイントは4行目に指定している以下の2つです。
- data-simplebar … simplebar.jsのターゲットとなる要素に指定する
- data-simplebar-auto-hide="false" … スクロールバーを常に表示させる指定
data属性で指定するメリットは、jsファイルを用意してsimplebarの指定について書く必要がないことです。
CSSに書くこと
.p-slide {
padding-left: 15px;
padding-right: 15px;
}
.p-slide__inner {
position: relative;
max-width: 1000px;
margin-left: auto;
margin-right: auto;
overflow: hidden; /*-- はみ出した要素を非表示にする --*/
}
.p-slide-mask { /*-- ドロップシャドウ用 --*/
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none; /*-- 下にある要素をクリックできるようにする --*/
box-shadow: 10px 0 14px -14px black inset, -10px 0 14px -14px black inset;
z-index: 1;
}
.p-slide__main {
display: flex; /*-- 横に並べるのに必要 --*/
margin-left: -10px;
padding-bottom: 17px;
}
.p-slide__block {
flex: 0 0 calc(30% - 10px); /*-- 横に並べるのに必要 --*/
margin-left: 10px;
}
.p-slide__img img {
width: 100%;
}
.simplebar-scrollbar::before { /*-- スクロールバー自体の色を変更 --*/
background-color: #debc00;
}
/*-- スクロールバーが動く領域の背景色の変更 お好みで
.simplebar-track {
background-color: #f6f6f6;
}
--*/
.simplebar-content-wrapper::-webkit-scrollbar { /*-- iOSでデフォルトのスクロールバーを非表示 --*/
display: none;
-webkit-appearance: none;
}
CSSの指定について簡単に説明します。
横並びに必要な指定
重要な指定だけ下にピックアップしました。
.p-slide__inner {
overflow: hidden; /*-- はみ出した要素を非表示にする --*/
}
.p-slide__main {
display: flex; /*-- 横に並べるのに必要 --*/
margin-left: -10px;
}
.p-slide__block {
flex: 0 0 calc(30% - 10px); /*-- 横に並べるのに必要 --*/
margin-left: 10px;
}
flexboxで横並びにしているので、クラス名p-side__blockに対してwidthを%で指定してしまうとスクロールしてくれません。スクロールさせるためにはflex-growとflex-shrinkを0にして、flex-basisで数値を指定する必要があります。(flex: 0 0 calc(30% - 10px)の部分)
スクロールバーのデザインを変える
.simplebar-scrollbar::before { /*-- スクロールバー自体の色を変更 --*/
background-color: #debc00;
}
/*-- スクロールバーが動く領域の背景色の変更 お好みで
.simplebar-track {
background-color: #f6f6f6;
}
--*/
simplebar.jsではスクロールバー自体の色、それからスクロールバー移動領域の色を変更するためのクラス名が用意されています。
デフォルトのスクロールバーを非表示にする
.simplebar-content-wrapper::-webkit-scrollbar { /*-- iOSでデフォルトのスクロールバーを非表示 --*/
display: none;
-webkit-appearance: none;
}
MacOSではsimplebar.jsを使っていればデフォルトのスクロールバーは表示されませんが、iOSでは表示されてしまいます。これだとスクロールバーが2つあるように見えてしまうので、デフォルトのスクロールバーを非表示にしています。(Andoroidもこの設定で非表示になる)
スクロール領域の左右にドロップシャドウ
.p-slide-mask { /*-- ドロップシャドウ用 --*/
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none; /*-- 下にある要素をクリックできるようにする --*/
-webkit-box-shadow: 10px 0 14px -14px black inset, -10px 0 14px -14px black inset;
box-shadow: 10px 0 14px -14px black inset, -10px 0 14px -14px black inset;
z-index: 1;
}
スクロール領域の左右にドロップシャドウをつけています。pointer-events: noneの指定がないとドロップシャドウを指定した要素の、下にある要素にクリックできなくなるので必ず指定しましょう。
JavaScriptで書くこと
今回はHTML側でdata属性を使ってsimplebar.jsを動かしているのでJavaScript側で書くことはありません。
data属性を使わず、JavaScript側でsimplebar.jsを指定したいなら以下のように書くことができます。
//HTML側でdata属性で指定せず、JavaScript側で指定する場合
new SimpleBar(document.getElementById("ここにid名を指定"), { autoHide: false });
さいごに
今回はCSSで複数の画像を横スクロールさせる方法について説明しました。スクロールバーについて、iOSでは横スクロールさせるとき以外は非表示になってしまうので、JavaScriptで表示の設定をする必要があります。(CSSだけのカスタマイズでは効かない)
画像だけではなく、テキストも入ったブログカードのようなデザインも横スクロールできます。使い方の幅が広いので試してみてください。