ウェブ制作

サイト制作のちょっとしたティップスまとめ

ウェブ制作

公開日:2024/12/02

更新日:2025/01/16

当サイトのリンクには広告が含まれています。

Grid(Flex)配下のslick.jsが、バグって横幅が異常に伸びる時の解決方法

「slick.js」でスライダーを実装した際、display: grid;やdisplay: flex;要素の配下だと、slickの横幅が異常に伸びるバグに遭遇しました。デモコードを交えつつ、その解決方法を解説します。

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が入っているgridflexの子要素に、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が原因です。

上に戻る