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

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

ただいまの
回答率

88.91%

アクティブに合わせたスクロール連動

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 203

hati3693

score 23

gallerifficを使ってサムネイル付きギャラリーを作成していますが
メイン画像の矢印で次の画像に移っていくとサムネがスクロール連動していないのでアクティブなサムネが隠れてしまいます
アクティブになったサムネに合わせて自動でスクロールするのは可能でしょうか
検索するとスクロールに合わせて〇〇~というのしか出てきませんでした
イメージ説明

<div class="detail_img_inner">
    <div id="gallery" class="content">
        <div id="nav" class="controls"></div>
        <div class="slideshow-container">
            <div id="loading" class="loader"></div>
            <div id="slideshow" class="slideshow"></div>
        </div>
    </div>
    <div id="thumbs" class="navigation">
        <ul class="thumbs noscript scrollbar scrollbar-primary">
            <li>
                <a class="thumb" href="img/1.jpg"><img src="img/1.jpg" alt="" />1</a>
            </li>
            <li>
                <a class="thumb" href="img/2.jpg"><img src="img/2.jpg" alt="" />2</a>
            </li>
            <li>
                <a class="thumb" href="img/3.jpg"><img src="img/3.jpg" alt="" />3</a>
            </li>
        </ul>
    </div>
    <div style="clear: both;"></div>
</div>
.detail_img_inner {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: reverse;
      -ms-flex-flow: row-reverse;
          flex-flow: row-reverse;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
}

#gallery.content {
  display: none;
  float: right;
  width: 550px;
  width: 60%;
  height: auto;
  display: block;
  float: none;
  position: relative;
}

div.slideshow-container {
  position: relative;
  clear: both;
  height: auto;
}

div.slideshow img {
  vertical-align: middle;
  border: none;
  width: auto;
}

#loading.loader {
  position: absolute;
  top: 0;
  left: 0;
  background-image: url(loader.gif);
  background-repeat: no-repeat;
  background-position: center;
  width: 100%;
  height: auto;
}

ul.thumbs img {
  border: none;
  display: block;
  margin: 0 auto 2px auto;
}

div.nav-controls {
  float: none;
}

div.slideshow a.advance-link {
  display: block;
  width: 550px;
  height: auto;
  text-align: center;
  line-height: normal;
  width: auto;
}

#thumbs.navigation {
  float: none;
  width: 38%;
  margin-right: .5%;
  background: #f7f3ef;
  position: relative;
  text-align: center;
  padding: 1%;
  overflow: hidden;
}

ul.thumbs li.selected a.thumb {
  background: #ffffff;
  -webkit-box-shadow: 0 0 0 3px #f3cd64 inset;
          box-shadow: 0 0 0 3px #f3cd64 inset;
  border: 1px solid #f3cd64;
}

ul.thumbs {
  clear: both;
  width: 100%;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
      -ms-flex-flow: row wrap;
          flex-flow: row wrap;
  -webkit-box-pack: start;
      -ms-flex-pack: start;
          justify-content: flex-start;
  position: relative;
  height: 100%;
  overflow-y: scroll;
}

.scrollbar-primary::-webkit-scrollbar {
  width: 12px;
  background-color: #fff;
  border-radius: 5px;
}

.scrollbar-primary::-webkit-scrollbar-thumb {
  border-radius: 10px;
  background-color: #f3cd64;
}

ul.thumbs li {
  float: left;
  padding: 0;
  margin: 4px 3px 4px 3px;
  list-style: none;
  width: calc(34% - 6px - 1%);
}

div.navigation div.top, div.navigation div.bottom {
  height: 25px;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  margin: 25px 0 12px 0;
}

div.pagination a, div.pagination span.current, div.pagination span.ellipsis {
  display: block;
  margin-right: 2px;
  padding: 4px 7px 2px 7px;
  border: 1px solid #ccc;
  height: 31px;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
      -ms-flex-align: center;
          align-items: center;
  float: none;
}

.pagination_wrap {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
      -ms-flex-pack: center;
          justify-content: center;
  height: 50px;
}

div.controls {
  margin-top: 0;
  height: 0;
}

.nav-controls a:nth-child(1) {
  position: absolute;
  top: 50%;
  left: 2%;
  width: 60px;
  background: #a9927b;
  height: 60px;
  z-index: 2;
  -webkit-transform: translateY(-50%);
          transform: translateY(-50%);
  border-radius: 1em;
  -webkit-transition: .5s;
  transition: .5s;
  opacity: .8;
}

.nav-controls a:nth-child(1)::before {
  content: "";
  width: 100%;
  height: 100%;
  display: block;
  top: 0;
  left: 0;
  background-image: url(left.svg);
  background-repeat: no-repeat;
  -webkit-transform: rotate(180deg);
          transform: rotate(180deg);
  position: absolute;
  background-size: 45%;
  background-position: center,center;
}

.nav-controls a:nth-child(2) {
  position: absolute;
  top: 50%;
  right: 2%;
  width: 60px;
  background: #a9927b;
  height: 60px;
  z-index: 2;
  -webkit-transform: translateY(-50%);
          transform: translateY(-50%);
  border-radius: 1em;
  -webkit-transition: .5s;
  transition: .5s;
  opacity: .8;
}

.nav-controls a:nth-child(2)::before {
  content: "";
  width: 100%;
  height: 100%;
  display: block;
  top: 0;
  left: 0;
  background-image: url(left.svg);
  background-repeat: no-repeat;
  position: absolute;
  background-size: 45%;
  background-position: center,center;
}

.nav-controls a:nth-child(1):hover, .nav-controls a:nth-child(2):hover {
  background: #a9927b;
  -webkit-transition: .5s;
  transition: .5s;
}

div.pagination a {
  background: #FFF;
}

div.pagination span.current {
  font-weight: bold;
  background-color: #6f6255;
  border-color: #6f6255;
  color: #fff;
}

div.navigation div.bottom {
  margin-top: 10px;
  bottom: 10px;
}

a.thumb {
  padding: 6px 4px 2px 4px;
  display: block;
  border: 1px solid #c3bbb3;
  background: #FFF;
}

div.pagination a, div.pagination span.current, div.pagination span.ellipsis {
  display: block;
  margin-right: 2px;
  padding: 5px 10px 4px 10px;
  border: 1px solid #6f6255;
  height: 31px;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  float: none;
  border-radius: 5em;
  margin: 0 3px;
}

div.pagination a:hover {
  background-color: #f5eadf;
  text-decoration: none;
}

.bottom.pagination a {
  font-size: 1em;
}

div.pagination a {
  background: #FFF;
}

div.slideshow span.image-wrapper {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  border: 1px solid #ceb9a4;
  padding: 5px;
  width: 100%;
}

div.pagination span.current {
  font-weight: bold;
  background-color: #6f6255;
  border-color: #6f6255;
  color: #fff;
}

div.content a, div.navigation a {
  text-decoration: none;
  color: #333;
  font-size: .8em;
  line-height: 18px;
}
@media screen and (max-width: 880px) {
.detail_img_inner {
    display: block;
    height: auto !important;
  }
  #gallery.content {
    width: 100%;
    margin: 0 auto;
  }
  .nav-controls a:nth-child(1) {
    width: 12%;
    left: 2%;
  }
  .nav-controls a:nth-child(2) {
    width: 12%;
    right: 2%;
  }
  #thumbs.navigation {
    float: none;
    width: 100%;
    margin-right: 0;
    background: #f7f3ef;
    position: static;
    text-align: center;
    padding: .5%;
    display: block;
    margin: 2.5em 0 0 0;
  }
  ul.thumbs {
    display: -ms-flexbox;
    display: -webkit-box;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
        -ms-flex-flow: unset;
            flex-flow: unset;
    overflow-x: scroll;
    overflow-y: unset;
  }
  ul.thumbs li {
    width: calc(25% - 10px);
    margin: 4px 4px 10px 6px;
    -webkit-box-flex: 0;
        -ms-flex: 0 0 100px;
            flex: 0 0 100px;
    min-width: 80px;
  }
  ul.thumbs img {
    border: none;
    display: block;
    width: 100px;
  }
  }
var gallery = $('#thumbs').galleriffic({
      delay : 4000,
      defaultTransitionDuration : 500,
      numThumbs:                 50,
      preloadAhead:              50,
      enableTopPager:            false,
      enableBottomPager:         false,
      maxPagesToShow:            7,
      imageContainerSel:         '#slideshow',
      ssControlsContainerSel:    '#controls',
      navControlsContainerSel:   '#nav',
      captionContainerSel:       '#caption',
      loadingContainerSel:       '#loading',
      renderSSControls:          false,
      renderNavControls:         false,
      enableHistory:             false,
      autoStart:                 false,
      syncTransitions:           true
    });
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Lhankor_Mhy

    2020/07/14 10:55

    よく見ると、ダウンロードした examples フォルダにあるサンプルも動作していないようです。環境の問題でしょうか?
    これは、なかなか大変そうですね……

    キャンセル

  • hati3693

    2020/07/14 11:22

    すみません、最初にダウンロードした場所がわからず別のページをご紹介したので、内容が違ったのかもしれません・・。
    https://34.gigafile.nu/0728-cfcdea46b7beb1557942373078fe06bc1
    いらないところを省いたファイルをまとめてお送りいたします。
    最初からこうすればよかったですね、すみません・・
    多分これなら画像通りに動くはずです。
    よろしくお願いします。。

    キャンセル

  • Lhankor_Mhy

    2020/07/14 11:43

    わざわざご準備いただいてすみません。

    キャンセル

回答 1

checkベストアンサー

+1

ご提示のページを拝見したところ、オプションのonSlideChangeがスライドを変更した時のコールバックの様でしたので、これを使うのがいいと思いました。

      onSlideChange: function(prevIndex, nextIndex) {
        this.find("li")[nextIndex].scrollIntoView();
      },

動作確認済みです。

参考:
Element.scrollIntoView() - Web API | MDN


IE11非対応になりますが、.scrollIntoView({behavior: "smooth", block: "nearest", inline: "nearest"})とした方がかっこいいかもしれません。

コメントを受けて追記

下記、IE11で動作確認しました。

      onSlideChange: function(prevIndex, nextIndex) {
        this.children().scrollTop(this.children().scrollTop()+this.find("li:eq("+nextIndex+")").position().top);
      },

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/14 13:19

    ありがとうございます。全ブラウザで動きました!
    IEの対応ぜひともやめたいんですけども…上層部がIEを使ってまして…
    iphoneのsafari以外の一部ブラウザではうまく連動しないのもあったのですが、IEみたいに画像が見れないわけではないので全然大丈夫でした!
    Lhankor_Mhy様、本当にありがとうございます!

    キャンセル

  • 2020/07/14 13:22

    >上層部がIEを使ってまして…

    わかります……

    キャンセル

  • 2020/07/14 13:24

    ほかにも会社で使っている一部サービスがIEでしか動かないとか
    まだまだIE離れができなそうです・・・

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る