質問するログイン新規登録
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

461閲覧

slick.jsで無限ループのサムネイルを設定し、2周目に入ると表示がガタつく。

nur_tour

総合スコア1

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2023/12/19 06:10

0

0

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • slick.jsで作ったカルーセルのサムネイルが2周目に入るときにガタつくバグを直したい

前提

ここに質問の内容を詳しく書いてください。
現在、slick.jsでカルーセルスライダーを作っています。
要件は
・slick.jsでメインビジュアルを作る
・メインビジュアルに対するサムネイルもslick.jsで作る
・pcではサムネイルが並んでいるだけだがSPでは無限ループする
・サムネイルをクリックすると連動してメインビジュアルが切り替わる
です。

発生している問題・エラーメッセージ

codepenに記載していますが、SPで見たときにサムネイルが2周目に入ると
・ガタツキが起こる
・slick-currentより前の要素が一瞬見える
というバグが発生しています。

該当のソースコード

html/css/jsどれが駄目なのか分からなかったためcodepenで記載いたしました。

html/css/js

1https://codepen.io/nari-dsn/pen/jOdgJoP

試したこと

下記に記載の対処方法は試してみたのですが、全て駄目でした…
slideToShowオプションは1を設定しているのでこれらも対処法とは違っているかも知れません。
https://qiita.com/daipdaip/items/d2fbcc6e47cfd4cd619a
https://masakichi-code.com/blog/slick_lap2_flickering/
https://teratail.com/questions/126058
https://www.sfidax.okinawa/sfidax_okinawa_wp/column/slick-slidestoshow-not-working/

補足情報(FW/ツールのバージョンなど)

利用しているslick.jsはver1.8.1です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2023/12/20 05:43

スライドの途中で .slick-current が動いてしまっているのが原因だと思うので、beforeChange で何かしらをすれば上手くいくかもしれません。
nur_tour

2023/12/20 08:56

なるほど・・・!ありがとうございます、beforeChangeで.slick-currentを操作するのはできそうです。試してみたいと思います。
guest

回答1

0

ベストアンサー

codepen のコードを以下のように変更したところ、多少改善が見られました。

js

1$(function () { 2 const slickImageCount = $('.mv_slider .mv_sliderItem').length; 3 const $mvCarousel = $('.mv_slider'); 4 const $mvThumbnail = $('.mv_thumb'); 5 const $mvToggle = $('.mv_toggle'); 6 const progressDuration = 4000; 7 8 const mainCarouselConfig = { 9 pauseOnFocus: false, 10 pauseOnHover: false, 11 focusOnSelect: false, 12 draggable: true, 13 infinite: true, 14 dots: false, 15 slidesToShow: 1, 16 slidesToScroll: 1, 17 autoplay: true, 18 speed: 500, 19 autoplaySpeed: progressDuration, 20 fade: true, 21 arrows: false, 22 asNavFor: '.mv_thumb', 23 }; 24 const thumbnailCarouselConfig = { 25 fade: false, 26 infinite: false, 27 centerMode: false, 28 slidesToShow: parseInt(slickImageCount), 29 slidesToScroll: 1, 30 asNavFor: '.mv_slider', 31 arrows: false, 32 pauseOnDotsHover: false, 33 speed: 500, 34 dots: false, 35 adaptiveHeight: false, 36 variableWidth: true, 37 focusOnSelect: true, 38 responsive: [{ 39 breakpoint: 768, 40 settings: { 41 fade: false, 42 infinite: true, 43 centerMode: false, 44 adaptiveHeight: true, 45 variableWidth: true, 46 slidesToShow: 1, 47 slidesToScroll: 1, 48 }, 49 }], 50 }; 51 52 $mvCarousel.slick(mainCarouselConfig); 53 $mvThumbnail.slick(thumbnailCarouselConfig) 54 .on('beforeChange', function(slick,currentSlide,nextSlide) { 55 if (nextSlide===2) $(slick.currentTarget).addClass('beforeChange') 56 }) 57 .on('afterChange', function(slick,currentSlide,nextSlide) { 58 $(slick.currentTarget).removeClass('beforeChange') 59 }) 60 _setupToggleHandler($mvToggle, $mvCarousel); 61 62 function _setupToggleHandler($mvToggle, $mvCarousel) { 63 $mvToggle.on('click', (e) => { 64 const _class = 'js-pause'; 65 const _target = $(e.currentTarget).closest('.mv'); 66 const _isPause = _target.hasClass('js-pause'); 67 68 _isPause ? _target.removeClass(_class) : _target.addClass(_class); 69 70 if (_isPause) { 71 $mvCarousel.slick('slickPlay'); 72 } else { 73 $mvCarousel.slick('slickPause'); 74 } 75 }); 76 } 77});

scss

1@mixin mobileView() { 2 @media screen and (max-width: 767px) { 3 @content; 4 } 5} 6 7@mixin desktopView() { 8 @media screen and (min-width: 768px) { 9 @content; 10 } 11} 12@mixin lineHeight($line-height) { 13 &::before, 14 &::after { 15 content: ""; 16 display: block; 17 width: 0; 18 height: 0; 19 } 20 &::before { 21 margin-top: calc((1 - #{$line-height}) * 0.5em); 22 } 23 &::after { 24 margin-bottom: calc((1 - #{$line-height}) * 0.5em); 25 } 26} 27 28.mv { 29 @include mobileView() { 30 padding: 5.3%; 31 } 32 @include desktopView() { 33 max-width: 1360px; 34 } 35 width: 100%; 36 margin: 0 auto; 37 position: relative; 38 overflow: hidden; 39 40 .mv_notification { 41 position: absolute; 42 width: fit-content; 43 height: fit-content; 44 top: 32px; 45 right: 38px; 46 z-index: 10; 47 } 48 49 .mv_banner { 50 & + & { 51 margin-top: 4px; 52 } 53 border-radius: 8px; 54 overflow: hidden; 55 width: 304px; 56 height: 84px; 57 box-sizing: content-box; 58 border: 4px solid rgba(255, 255, 255, 0.2); 59 @include mobileView() { 60 width: auto; 61 } 62 63 a { 64 display: flex; 65 font-size: 1.2rem; 66 background: #fff; 67 } 68 69 img { 70 width: 84px; 71 height: 84px; 72 } 73 74 } 75 76 .mv_slider .slick-slide * { 77 @include mobileView() { 78 width: 100%; 79 aspect-ratio: 9 / 16; 80 } 81 } 82 83 .mv_thumb { 84 @include desktopView() { 85 right: 38px; 86 bottom: 28px; 87 } 88 @include mobileView() { 89 left: calc(5.3% + 80px); 90 bottom: calc(5.3% + 40px); 91 } 92 position: absolute; 93 94 .slick-track { 95 @include desktopView() { 96 display: flex; 97 align-items: baseline; 98 width: fit-content !important; 99 transform: none !important; 100 } 101 } 102 103 .slick-list { 104 @include mobileView() { 105 overflow: visible !important; 106 transform: none !important; 107 } 108 } 109 110 .slick-slide { 111 @include mobileView() { 112 height: auto !important; 113 -webkit-backface-visibility: hidden; 114 -webkit-transform-style: preserve-3d; 115 width: 115px; 116 margin-left: 8px; 117 } 118 @include desktopView() { 119 flex: 1; 120 width: 144px; 121 margin-left: 12px; 122 } 123 height: auto!important; 124 -webkit-backface-visibility: hidden; 125 -webkit-transform-style: preserve-3d; 126 cursor: pointer; 127 transition: 0.3s cubic-bezier(0.165, 0.84, 0.44, 1) 0s; 128 } 129 130 .slick-slide:not(.slick-current ~ .slick-slide):not(.slick-current) { 131 @include mobileView { 132 visibility: hidden !important; 133 opacity: 0 !important; 134 } 135 } 136 137 .mv_thumb_inner { 138 border-radius: 8px; 139 overflow: hidden; 140 position: relative; 141 } 142 143 .mv_thumb_progress { 144 display: none; 145 position: absolute; 146 bottom: 0; 147 height: 4px; 148 background-color: #ffffff; 149 width: 0%; 150 border-radius: 10px; 151 } 152 153 .mv_thumb_lead { 154 bottom: 16px; 155 left: 16px; 156 color: #600624; 157 display: block; 158 font-size: 1.4rem; 159 position: absolute; 160 white-space: nowrap; 161 font-family: "reuben"; 162 font-weight: 600; 163 letter-spacing: 0.02em; 164 width: calc(100% - 32px); 165 display: flex; 166 justify-content: space-between; 167 168 em { 169 @include mobileView() { 170 transform: scale(.8); 171 transform-origin: left bottom; 172 } 173 } 174 175 * { 176 font-style: normal; 177 } 178 } 179 .mv_thumb_lead [class^="lead_"]{ 180 display: none; 181 } 182 .mv_thumb_lead .lead_sp { 183 @include mobileView() { 184 display: block; 185 } 186 } 187 .mv_thumb_lead .lead_pcPast{ 188 @include desktopView() { 189 display: block; 190 } 191 } 192 193 .slick-current, 194 .slick-current+.slick-slide+.slick-slide+.slick-slide 195 { 196 @include mobileView() { 197 transform: scale(1.2); 198 transform-origin: bottom right; 199 } 200 @include desktopView() { 201 flex: 1.2; 202 } 203 transition: 0.3s cubic-bezier(0.165, 0.84, 0.44, 1) 0s; 204 img { 205 width: 100%; 206 } 207 .mv_thumb_progress { 208 display: block; 209 animation: progress 4.5s linear forwards; 210 } 211 .mv_thumb_lead .lead_pcPast { 212 display: none; 213 } 214 .lead_pcCurrent { 215 @include desktopView() { 216 display: block; 217 } 218 } 219 } 220 } 221 222 .beforeChange .slick-slide:not(.slick-current+.slick-slide+.slick-slide ~ .slick-slide){ 223 @include mobileView { 224 visibility: hidden !important; 225 opacity: 0 !important; 226 } 227 } 228 229 230 .mv_button { 231 @include desktopView() { 232 bottom: 24px; 233 left: 24px; 234 } 235 @include mobileView() { 236 bottom: calc(5.3% + 16px); 237 left: calc(5.3% + 16px); 238 } 239 position: absolute; 240 z-index: 100; 241 button { 242 width: 26px; 243 height: 26px; 244 border-radius: 4px; 245 background: rgba(255, 255, 255, 0.20); 246 color: black; 247 border: none; 248 position: relative; 249 padding: 2px 8px 2px; 250 } 251 } 252 253 .mv_toggle_icon { 254 &::before, 255 &::after { 256 position: absolute; 257 top: 0; 258 display: block; 259 width: 3px; 260 height: 10px; 261 content: ''; 262 background: #ffffff; 263 } 264 &::before { 265 left: 0; 266 } 267 &::after { 268 right: 0; 269 } 270 width: 10px; 271 height: 10px; 272 display: block; 273 position: relative; 274 } 275} 276 277// 一時停止時 278.js-pause { 279 .mv_slider .slick-slide.slick-current *, 280 .mv_thumb .slick-current .mv_thumb_progress { 281 animation-play-state: paused; 282 } 283 284 .mv_toggle_icon { 285 &::before { 286 display: none; 287 } 288 &::after { 289 width: 0; 290 height: 0; 291 border-width: 5px 0 5px 9px; 292 border-style: solid; 293 border-color: transparent transparent transparent #ffffff; 294 background: transparent; 295 } 296 } 297} 298 299@keyframes progress { 300 from { 301 width: 0%; 302 } 303 to { 304 width: 100%; 305 } 306} 307 308@keyframes scale { 309 from { 310 transform: scale(1.03); 311 } 312 to { 313 transform: scale(1); 314 } 315}

投稿2023/12/20 07:19

Lhankor_Mhy

総合スコア37517

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nur_tour

2023/12/20 10:48

詳細にコードまで提供いただきありがとうございます・・・! かなり改善されました。slick-current slick-activeをなんとかすればチラつきも解消できそうです。 自分でも書いてみて試してみようと思います。
nur_tour

2023/12/24 08:30

頂いたコードをもとに改変し無事にバグが解消できました!ありがとうございました…!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問