Categories: CSSHTMLJavaScript

【iOSでは出ないスクロールバー】iPhoneでもカスタムスクロールバーを表示したい!→はい、SimpleBar!

Windows環境では表示される、このようなカスタムスクロールバー。

けっこうがんばって

::-webkit-scrollbar

とか

::-webkit-scrollbar-track

とか、

::-webkit-scrollbar-thumb

とか、

::-webkit-scrollbar-thumb:hover

とかの疑似要素を駆使して(いったい何種類あるんだよ、、)

スクロールバーをカスタマイズできるのですが、

これらの疑似要素は、iOS端末、MacOSでは、無視され、表示されません!!

昔は表示できていたようですが、

MacOSではOSX10.9.xから、iOSではiOS13から仕様が変更され、

初期設定では自動的に表示され一定時間後に消えるようになりました。

結構前に変更があったのか。

なんでだよ、iPhone、iPad、Mac・・・

スクロールしたときのみスクロールバーが表示されるんじゃ、

初見では、そのコンテンツ範囲がそもそも「スクロールできる」ということが視覚的にわからないのではないだろうか。。

はっきり言って改悪。そしてこの改悪に今日も多くのエンジニアがこの解決に時間を取られる。

この事象に多くのエンジニアが頭を悩ませるが、それでもデザインカンプでは洗練されたスクロールバーがデザイナー様から降りてくるし(スクロールバーがiOSで無効化されるなんて誰も想像できない)、実際どうやってか、表示できているサイトもある。。じゃあやらないとね!となるわけです。

というわけで、解消方法を備忘録として記載します。

SimpleBarという発明をした猛者が全世界のエンジニアを救っています

GitHub - Grsmto/simplebar: Custom scrollbars vanilla javascript library with native scroll, done simple, lightweight, easy to use and cross-browser.
Custom scrollbars vanilla javascript library with native scroll, done simple, lightweight, easy to use and cross-browser. - Grsmto/simplebar

これを使用することで、以下のような表示がiOSやMac上でも問題なく表示できます。

See the Pen SimpleBarの実装 by Naoto Yoshikawa (@nanaironanaoto) on CodePen.

やった!楽勝!

・・・と思ったら、このGithubのdemo pageを見ると、

Examples
SimpleBar does only one thing: replace the browser's default scrollbar with a custom CSS-styled one without losing performances. For React, Vue, Angular or Vani...

上の例のような横スクロールのデモが紹介されていない!?

なぜか縦スクロールのデモで、いやいや、縦スクロール時のバー表示はあんまり要らないんだわ・・・と思うことでしょう。

多くのSimpleBarの紹介記事は説明不足!!

また、上の例のように、細かい配慮として、左右のスクロール端の画像やテキストがフェードアウトしていく画像処理も、自力で付け足さなければいけない。

僕が作成した上のCodePenのHTMLとCSSを使えば、やっとほんとに解決すると思います。

解説すると、

1) まず公式のCDNで、SimpleBarのcssとjsをロード。

<!--SimpleBar-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/simplebar@latest/dist/simplebar.min.css" />
<script src="https://cdn.jsdelivr.net/npm/simplebar@latest/dist/simplebar.min.js"></script>
<!--SimpleBar-->

2) そしてスクロールさせたいコンテンツを以下のようにdata-simplebar属性をつけた要素で囲む。この例ではではdivで囲む。

<div data-simplebar>
 ここにスクロールさせたいコンテンツ
</div>

いちおうもうこれでスクロールバーは表示される。ただしデフォルトの縦スクロールバーが。

3) 横方向にスクロールさせたい場合は、

<div data-simplebar data-simplebar-auto-hide="false">

というように、属性に

data-simplebar-auto-hide="false"

を加える必要がある。

これで横スクロールになる。

4) が、包んでいるコンテンツがこのボックスの横幅を超えていないと、当然スクロールバーは表示されない。

だってスクロール不要なコンテンツなんだから。

ということで、cssでスタイル付けしていく必要がある。

カスタマイズするために、例えば以下のように任意のクラス名を付与。

.my-scroll-content
<div class="my-scroll-content" data-simplebar data-simplebar-auto-hide="false">

そのクラスに適用したスタイルは、CodePen内のcssを参照いただければと存じます。

5) そんでもって、この例のようにスクロールコンテンツの左右にフェードアウトの処理を加えるためにもひと手間かかかる。

See the Pen SimpleBarの実装 by Naoto Yoshikawa (@nanaironanaoto) on CodePen.

どうするかというと、さきほど作ったSimpleBarが表示されるスクロールコンテンツを、

さらにボックスで囲み、その直下の子要素として左と右、ふたつのボックスを作成して、それぞれのフェードアウト表示用に配置する。

<div class="custom-scroll-container">
    <div class="custom-scroll-fade-left"></div>
    <div class="custom-scroll-fade-right"></div>
    ここにさっきのSimpleBarのボックスを配置
</div>

そして

.custom-scroll-container

.custom-scroll-fade-left

.custom-scroll-fade-right

のクラスにスタイルを当てていけばようやくまともな横スクロールの表示になってくれる。

当てているスタイルはCodePenの”CSS”タブでご確認いただけます。

See the Pen SimpleBarの実装 by Naoto Yoshikawa (@nanaironanaoto) on CodePen.

6) 最後に実は落とし穴!

.scroll-content{
    touch-action: auto ; /*これをつけないとスクロール領域でiPhoneなどで縦スクロールできなくなる!*/}

スタイルで、スクロール領域内の

.scroll-content

にtouch-action:auto;をつけないと、SimpleBarのデフォルトの挙動により、

スクロール領域内ではiPhoneなどでの縦方向フリックが無効化される。

横スクロールにしているから縦にフリックが効かなくしているのだろうか。

ただ、デフォルトだと、スマホをするするスクロールしたときにこのスクロール領域でフリックができずユーザは「いや、なんでよ!?」とストレスになること請け合い。

エンジニアはこうやってサーバー上に反映したあとにさらに実機を触って入念に操作して見つけて、潰していかないと、ちょこちょこまさかの嫌な問題がでてきますね。

しかも、この件はChatGPTなどAIでも解決方法を提示できていなかった。まだ情報を知らないのだろう。かつ実機のフリック時の挙動とか、エミュレータではわからないことだし細かすぎる。

手間をかけないといいものが作れないようにできているってことか。。

いやー、横スクロールバーいっこちゃんとデザインするだけでどんだけかかるんだ!

これはCodePenのコードをちゃんと備忘録してないと、毎回記憶を頼りにしてたら面倒すぎる!!記事が書けてよかったー、これで安心。。

以上です!

ナナイロ

ECサイト制作に強いフロントエンドエンジニア。Web関連のお役立ち技術情報を発信しています。 2025年の最新のAI生成コーディングのコースをUdemyに公開いたしました。爆速でコードを書きたい方は必見です!! さらに、今年(2025年)からVoicyのパーソナリティに挑戦し始めました!ラジオでWebエンジニアの生の声をお届けしています。