前提・実現したいこと
スムーズスクロールが入っているサイトに、
スライダーを入れたいのですが、
スムーズスクロールが邪魔して、インジケーターと
ページャーの機能がうまく動きません。
該当のソースコード
html
1<div class="slideshow"> 2 <div class="slide_frame"> 3 <div class="slideshow-slides"> 4<div class="slide" id="slide-1"><img src="http://placeimg.com/640/480/people"></div> 5<div class="slide" id="slide-2"><img src="http://placeimg.com/640/480/any"></div> 6<div class="slide" id="slide-3"><img src="http://placeimg.com/640/480/arch"></div> 7<div class="slide" id="slide-4"><img src="http://placeimg.com/640/480/nature"></div> 8<div class="slide" id="slide-5"><img src="http://placeimg.com/640/480/tech"></div> 9 10 </div> 11 <div class="slideshow-nav"> 12 <a href="#" class="prev"></a> 13 <a href="#" class="next"></a> 14 </div> 15 </div> 16 <div class="slideshow-indicator"> 17 </div> 18</div> 19
js
1$(function(){ 2 $('a[href^="#"]').click(function() { 3 var scrollSpeed = 400; 4 var href= $(this).attr("href"); 5 var target = $(href === "#" || href === "" ? 'html' : href); 6 var position = target.offset().top; 7 8 $('body,html').animate({scrollTop:position}, scrollSpeed, 'swing'); 9 return false; 10 }); 11}); 12 13$(function () { 14 15 /* 16 * Slideshow 17 */ 18 // slideshow クラスを持った要素ごとに処理を実行 19 $('.slideshow').each(function () { 20 21 var $container = $(this), // a 22 $slideGroup = $container.find('.slideshow-slides'), // b 23 $slides = $slideGroup.find('.slide'), // c 24 $nav = $container.find('.slideshow-nav'), // d 25 $indicator = $container.find('.slideshow-indicator'), // e 26 27 slideCount = $slides.length, // スライドの点数 28 indicatorHTML = '', // インジケーターのコンテンツ 29 currentIndex = 0, // 現在のスライドのインデックス 30 duration = 500, // 次のスライドへのアニメーションの所要時間 31 interval = 5500, // 自動で次のスライドに移るまでの時間 32 timer; // タイマーの入れ物 33 console.log($nav); 34 // 各スライドの位置を決定し、 35 // 対応するインジケーターのアンカーを生成 36 $slides.each(function (i) { 37 $(this).css({ left: 100 * i + '%' }); 38 indicatorHTML += '<a href="#">' +'</a>'; 39 }); 40 // インジケーターにコンテンツを挿入 41 $indicator.html(indicatorHTML); 42 // 任意のスライドを表示する関数 43 function goToSlide (index) { 44 if(currentIndex === $slides.length - 1){ 45 // 現在地が最後のコンテンツだった場合 46 47 // 最初のコンテンツをコンテナの一番後ろまで移動 48 $slides.filter(':first-child').css('left', 100 * slideCount + '%'); 49 // 一番最後のコンテンツの次のエリアにスライド 50 $slideGroup.stop(false, true).animate({left: -100 * slideCount + '%'}, duration, 51 // アニメーションコールバック関数 52 function () { 53 // 移動した最初のコンテンツを元の場所に戻す 54 $slides.filter(':first-child').css('left', 0); 55 // スライドしていったコンテナ自体も元の場所に戻す 56 $slideGroup.css('left', 0); 57 } 58 ); 59 60 }else{ 61 // スライドグループをターゲットの位置に合わせて移動 62 $slideGroup.stop(false, true).animate({ left: - 100 * index + '%' }, duration); 63 } 64 // 現在のスライドのインデックスを上書き 65 currentIndex = index; 66 // ナビゲーションとインジケーターの状態を更新 67 updateNav(); 68 69 } 70 71 72 function backToSlide (index) { 73 if(currentIndex === 0){ 74 // 現在地が最後のコンテンツだった場合 75 76 // 最後のコンテンツをコンテナの一番後ろまで移動 77 $slides.filter(':last-child').css('left', -100 + '%'); 78 // 一番最後のコンテンツの次のエリアにスライド 79 $slideGroup.stop(false, true).animate({left: 100 + '%'}, duration, 80 // アニメーションコールバック関数 81 function () { 82 // 移動した最初のコンテンツを元の場所に戻す 83 $slides.filter(':last-child').css('left', 100 * (slideCount - 1) + '%'); 84 // スライドしていったコンテナ自体も元の場所に戻す 85 $slideGroup.css('left', -100 * (slideCount - 1) + '%'); 86 } 87 ); 88 89 }else{ 90 // スライドグループをターゲットの位置に合わせて移動 91 $slideGroup.stop(false, true).animate({ left: - 100 * index + '%' }, duration); 92 } 93 // 現在のスライドのインデックスを上書き 94 currentIndex = index; 95 // ナビゲーションとインジケーターの状態を更新 96 updateNav(); 97 98 } 99 100 101 102 // スライドの状態に応じてナビゲーションとインジケーターを更新する関数 103 function updateNav () { 104 var $navPrev = $nav.find('.prev'), // Prev (戻る) リンク 105 $navNext = $nav.find('.next'); // Next (進む) リンク 106 // もし最初のスライドなら Prev ナビゲーションを無効に 107 // もし最後のスライドなら Next ナビゲーションを無効に 108 // 現在のスライドのインジケーターを無効に 109 $indicator.find('a').removeClass('active') 110 .eq(currentIndex).addClass('active'); 111 } 112 113 // タイマーを開始する関数 114 function startTimer () { 115 // 変数 interval で設定した時間が経過するごとに処理を実行 116 timer = setInterval(function () { 117 // 現在のスライドのインデックスに応じて次に表示するスライドの決定 118 // もし最後のスライドなら最初のスライドへ 119 var nextIndex = (currentIndex + 1) % slideCount; 120 goToSlide(nextIndex); 121 }, interval); 122 } 123 124 // タイマーを停止る関数 125 function stopTimer () { 126 clearInterval(timer); 127 } 128 129 130 // インベントの登録 131 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 132 133 // ナビゲーションのリンクがクリックされたら該当するスライドを表示 134 $nav.on('click', 'a', function (event) { 135 event.preventDefault(); 136 if ($(this).hasClass('prev')) { 137 if(currentIndex === 0){ 138 backToSlide(currentIndex + slideCount - 1); 139 }else{ 140 backToSlide(currentIndex - 1); 141 } 142 } else { 143 if(currentIndex === slideCount - 1){ 144 goToSlide(currentIndex - slideCount+1); 145 }else{ 146 goToSlide(currentIndex + 1); 147 } 148 } 149 }); 150 151 // インジケーターのリンクがクリックされたら該当するスライドを表示 152 $indicator.on('click', 'a', function (event) { 153 event.preventDefault(); 154 if (!$(this).hasClass('active')) { 155 goToSlide($(this).index()); 156 } 157 }); 158 159 // マウスが乗ったらタイマーを停止、はずれたら開始 160 $container.on({ 161 mouseenter: stopTimer, 162 mouseleave: startTimer 163 }); 164 165 166 // スライドショーの開始 167 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 168 169 // 最初のスライドを表示 170 goToSlide(currentIndex); 171 172 // タイマーをスタート 173 startTimer(); 174 175 }); 176 }); 177 178
試したこと
スムーズスクロールの記述を消せばうまくいきますが、
スライダー以外に関しては、スムーズスクロールは入れたいため、
スライダー内のリンクのみ、スムーズスクロールが効かなくなるようにしたいです。
イベント内に、
event.preventDefault();
上記記述も入れてみましたが、うまくいきませんでした。
以下、テストになります。
https://codepen.io/satoru1993/pen/LYPzQWK?editors=1010
何卒お知恵を貸していただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。