jQueryスライダーの定番「slick」が、盛大にバグって表示される事象に遭遇しました。
スライダー本体の横幅が親要素の幅を突破し、数万ピクセルにも伸びちゃいました。ブラウザの横スクロールバーがメッチャ小さくなっててビックリした。


最初に結論を言うと、slickが入っているコンテナの親要素がgrid
(グリッドレイアウト)の場合、その子要素にmin-width: 0;
とmin-height: 0;
を一括設定することで解決します。
2025/1/16 追記
原因はGridのカラムに1fr
を指定したことでした。正しい解決方法はminmax()関数
を使い、Gridのカラムの最小サイズに明示的に「0」を指定することです。
問題が発生したコード
.main-wrapper {
display: grid;
grid-template-columns: 1fr 200px;
gap: 30px;
}
解決コード:追記版
.main-wrapper {
display: grid;
grid-template-columns: minmax(0, 1fr) 200px;
gap: 30px;
}
関連記事はこちら

CSS Gridの1frでカラムがはみ出す!? 横スクロール問題をminmax()で解決
CSS Gridの1fr指定でカラムが画面外にはみ出し、横スクロールバーが表示される問題の原因と解決方法を解説。minmax()を使った対処法で、レスポンシブやウィンドウ縮小時のレイアウト崩れを防ぎます。
※以前まで提案していた解決方法はこちら
.main-wrapper {
display: grid;
grid-template-columns: 1fr 200px;
gap: 30px;
/* 以下を設定 */
> * {
min-width: 0;
min-height: 0;
}
}
原因は親要素のグリッドレイアウト(display: grid;)
原因は、slickが入っている親要素にdisplay: grid;
やdisplay: flex;
が指定されていると発生する……ことがある。
バグったコード
.main-wrapper {
display: grid;
grid-template-columns: 1fr 200px;
gap: 20px;
}
display: grid;
でmain
要素とaside
要素を左右のカラムに分けたレイアウト
<div class="main-wrapper">
<main>
<div class="js-slick-slider">
<img src="./slider1.jpg" alt="">
<img src="./slider2.jpg" alt="">
<img src="./slider3.jpg" alt="">
</div>
</main>
<aside>
~内容~
</aside>
</div>
定番のレイアウトだが、これだとslickがバグる
実は直近の案件でもgrid
配下にslickスライダーを搭載したけど、こちらでは問題は発生しませんでした。どうやら、スライドの親要素の幅が固定値なのか、1frなのかなど、発生条件にはいくつかのバリエーションがあるみたい。
2025/1/16 追記
原因はGridのカラムに1fr
を指定したことでした。1fr
は最小コンテンツのサイズがauto
の扱いとなり、コンテナの中身次第では折り返しが発生せず、カラムごと伸びてしまいます。minmax()
関数を使って、コンテナ幅の最小値に明示的に「0」を指定することで解決します。
少なくとも、長年slick.jsを使っていて、今回初めてこの問題に遭遇しました。今のスライダーって、大体は画面幅いっぱいまで伸ばすデザインが多いので、グリッドカラムで並んだ子要素内に、slickを入れる機会が意外と少なかったみたいです。
それと昨今、CSSが進化しすぎて、slickの仕様として想定外のCSS構成が増えていることも、今回の原因だと思う。
対処方法:minmax(0, 1fr)を指定する
対処方法としては、Slickが入っていたカラムの1fr
指定を、minmax()
関数を使って、カラム幅の最小値に明示的に「0」を指定します。
grid-template-columns: minmax(0, 1fr);
これにより、Grid配下のカラム幅のauto
化が防止され、Slickがカラムを引き伸ばすことはなくなります。
コーディング中、同じようにslickで謎のバグに遭遇した人は参考にしてください。長年使い続けて安定していたライブラリが突然盛大にバグると、ビビるよね。何事かと思ったわ。
※以前まで提案していた方法:min-width: 0;とmin-height: 0;
※こちらは以前まで提案していた方法です。
対処方法としては、slickが入っているgrid
やflex
の子要素に、min-width: 0;
とmin-height: 0;
を一括で設定すると解消します。
.main-wrapper > * {
min-width: 0;
min-height: 0;
}
CSSの個別対応が面倒だと感じる人は、root要素から一括で「*」指定しているみたいだけど、流石に影響範囲が広すぎて、どんな副作用があるか分かったもんじゃないので、必要最低限、slickを使用している範囲に限定しました。また、このCSS自体もslickを使用しているページのみ出力されるように、PHPのif文で調整しました。
最初は、grid
で指定したカラムの直下にslickが入っていることがバグの原因だろうと考え、「間にdivでも何でも一つ挟めば大丈夫だろう」と軽く考えていましたが、それでも解消しなかったです。原因は結構複雑な模様。
※追記)1fr
が原因です。