次のようにドロワ側のスクロールバーの表示/非表示をマウスオーバーで切り替える。
スタイリングなしのスクロールバーが表示されっぱなしだと次のようになる。
これが表示されることでドロワの文字表示領域が圧迫され、想定外の改行が入ることがある。
また、このアンバランスなデザインが目の注意を引いてしまい使用感を含むデザインレベルが低くなったように感じる。
Youtubeにこの表示/非表示が実装されており非常にスマートである。
ぜひとも真似していこうと考えた。
この機能を実現するための前提条件を記す。
とはいえ実装そのものは単なるCSS
(SCSS
)なのでMUI
やReact
関係なくあらゆるWEBサイトで利用可能であるはず。
そのあたりは各自で工夫してもらえればと思う。
この記事はMUI
のv5
にCSS
を書き込んで動作させるものである。
※v4
以前でもCSS
をオーバーライドする方法を知っていれば可能かと思う。
MUI
にはスクロールバーを直接いじるコンポーネントは存在していないのでv5
から実装されているsx
を利用する。
※sx
はコンポーネントに直接スタイリングを書き込むためのもの:The sx prop - MUI
::-webkit-scrollbar
が定義されていること以前の記事
【MUI】スクロルバーのデザインを変える【Gatsby.js】 | 謎の技術研究部
これを利用して::-webkit-scrollbar
が定義されている必要がある。
いきなりこの記事を実装すると恐らくスクロールバーが消えるだけで終わる。
ドロワだけに適用したいのであればDrawer
内部にすべて書いても良いかと思う。
::-webkit-scrollbar
はFirefox
ではサポートされていないので注意。
Firefox
等一部のブラウザでは非表示にならない。
このサイトの実装を例として掲載する。
//Drawerは次でインポート
//import { Drawer } from '@mui/material'
<Drawer
sx={{
'& ::-webkit-scrollbar': {
display: "none"
},
'& :hover': {
'::-webkit-scrollbar': {
display: "inline"
}
}
}}
>
※実際にはもっとコードは多いが不要な部分は消去してある。
ドロワに直接sx
を利用してスタイリングしている。
このコードを利用することでドロワ自体のスクロールバーが調整できる。
ここで使われている&
記号は必須なので注意。
またアンパサンドのあとの「スペース1個」を省略しても動作しなくなる。
これはSCSS
の機能で親セレクタを参照するもの。このあたり詳しくは別サイトで調べてもらえればと思う。
display: "none"
これにより一旦スクロールバーを完全に非表示にしている。
※次のhoverの部分がないとスクロールバーはずっと非表示のままになる
& :hover
ここで& :hover
を追加することで「マウスがドロワの上にある時だけ」にその中のCSS
が適用される
つまりスクロールバーにdisplay: "inline"
が適用され「表示状態」となるわけだ。
スクロールバーに余白を付けるスタイリングは次の記事で紹介している。
【CSS】::-webkit-scrollbarの上下左右に余白を作りたい | 謎の技術研究部
本当にこれだけだ。
想像以上に簡単だったと思う。