質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

スライダー

GUIのグラフィカルウィジェットのひとつです。インジケーターを動かすことで値を調節可能とします。

JavaScript

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

HTML

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

Q&A

解決済

1回答

677閲覧

スムーズスクロール機能によるスライダーボタンが効かないことについて。

satoru225Simple

総合スコア27

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

スライダー

GUIのグラフィカルウィジェットのひとつです。インジケーターを動かすことで値を調節可能とします。

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2020/05/18 09:24

編集2020/05/18 09:42

前提・実現したいこと

スムーズスクロールが入っているサイトに、
スライダーを入れたいのですが、
スムーズスクロールが邪魔して、インジケーターと
ページャーの機能がうまく動きません。

該当のソースコード

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

何卒お知恵を貸していただけますと幸いです。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました

js

1$(function(){ 2 $('a[href^="#"]').not('.slideshow-nav a').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});

上記のように.not(対象箇所)で制御することができました。

投稿2020/05/18 09:45

編集2020/05/18 11:36
satoru225Simple

総合スコア27

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問