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

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

ただいまの
回答率

89.10%

jqueryを使ってページ内遷移させる(animate)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,815

SatokoKugo

score 17

 前提・実現したいこと

ここのサイトを参考。
「解約・退会手続きナビゲーション」のボタンを押すと下にスクロールされるのを真似したいです。

 試したこと

もともと入れているスムーススクロールのコードです。

/*ページ内リンクのスムーススクロール*/
$(function(){
    // #で始まるリンクをクリックしたら実行されます
    $('a[href^="#"]').click(function(){
        // スクロールの速度
        var speed = 800; // ミリ秒で記述
        // アンカーの値取得
        var href= $(this).attr("href");
        // 移動先を取得
        var target = $(href == "#" || href == "" ? 'html' : href);
        // 移動先を数値で取得
        var position = target.offset().top;
        // スムーススクロール
        $("html, body").animate({scrollTop:position}, speed, "swing");
        return false;
    });
});
// ラジオボタン2段階で表示
document.addEventListener('change',function(e){
      var t=e.target;
      if(t.name=="move"){
        Array.prototype.forEach.call(document.querySelectorAll('.second,.third'),function(x){
          if(x.id==t.value){
            x.style.display="block";
            Array.prototype.forEach.call(x.querySelectorAll('[type=radio]'),function(y){
              y.checked=false;
            });
          }else{
            x.style.display="none";
          }
        });
      }
      if(t.name=="grade"){
        Array.prototype.forEach.call(document.querySelectorAll('.third'),function(x){
          x.style.display=(x.id==t.value)?"block":"none";
        });
      }
    });
<div class="radio_button_box">
<label><input type="radio" name="move" value="radio_button_1" id="radio_button_1">aaaa</label><br />
<label><input type="radio" name="move" value="radio_button_2" id="radio_button_2">bbbb</label>
</div>


<div class="second" id="radio_button_1">
<div class="radio_button_box">
<label><input type="radio" name="grade" value="e">あああ</label><br />
<label><input type="radio" name="grade" value="b-2">いいい</label>
</div>
</div>
/* ラジオボタン */
[name=status_x] {
    display: none;
}
[name=status_x]+div {
    display: none;
}
[name=status_x]:checked+div {
    display: block;
}
.second , .third{
    display: none;
}

/* ラジオボタン用ボックス */
.radio_button_box {
    border: solid 1px #6091d3;
    padding: 10px 15px;
    margin: 5px 0;
}
.second .arrow_down ,
.third .arrow_down {
    margin: 20px 0;
}

/* わく */
.border-box-container2 {
    border: solid 1px #cccccc;
    margin-top: 10px;
    padding: 0 20px 10px;
    border-radius: 5px;
    background-color: #f8f8f8;
}

htmlはdivで囲っています。classもidも入っています。
簡単なコードで教えて頂ければと思います。

 追記

説明が不十分ですみません。
上のdivにあるボタンを押すと2つめのdivが表示されるようになっています。
そこで、2つめのdivが表示された際にスクロールして真ん中にくる(上に書いた参考の通り)をやりたいです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+2

これは、動かないですね。
なぜなら、javascriptで指定しているのは、
aタグに対して、スムーススクロールを効かせるイベントをつけているので。

ですが、質問者さんがやろうとしていることは、radioボタンの変化で、スムーススクロールをきかせたいってことですよね?

js部分を下記に変えましょう。
既に書いてるスムーススクロールの記述は消してください。

$(function(){
// ラジオボタン2段階で表示
document.addEventListener('change',function(e){
  var t=e.target;
  if(t.name=="move"){
    Array.prototype.forEach.call(document.querySelectorAll('.second,.third'),function(x){
      if(x.id==t.value){
        x.style.display="block";
        Array.prototype.forEach.call(x.querySelectorAll('[type=radio]'),function(y){
          y.checked=false;
        });

        // ここでスムーススクロールを実行
        var speed = 800; // ミリ秒で記述
        // アンカーの値取得
        // 移動先を数値で取得
        var position = $(x).offset().top;
        // スムーススクロール
        $("html, body").animate({scrollTop:position}, speed, "swing");
      }else{
        x.style.display="none";
      }
    });
  }
  if(t.name=="grade"){
    Array.prototype.forEach.call(document.querySelectorAll('.third'),function(x){
      x.style.display=(x.id==t.value)?"block":"none";
      // ここでスムーススクロールを実行
      if (x.id==t.value) {
          var speed = 800; // ミリ秒で記述
        // アンカーの値取得
        // 移動先を数値で取得
        var position = $(x).offset().top;
        // スムーススクロール
        $("html, body").animate({scrollTop:position}, speed, "swing");
      }

    });
  }
});

});

これ普通に動くと思いますが。

質問者さんは、やってみたが動かなかった、ってことでよろしいですか? 動かなかったのであれば、 htmlコードの記載も含めないと、答えようがないと思います。

私は、下記のコードで動きました。

<!DOCTYPE html>
<html lang="jp">
<head>
<meta charset="utf-8">
<title></title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>

</head>
<body>

<p><a href="#radio_button_1">↓スクロールさせたい↓</a></p>

<div class="second" id="radio_button_1" style="margin-top: 1000px;">
<div class="radio_button_box">
<label><input type="radio" name="grade" value="e">あああ</label><br />
<label><input type="radio" name="grade" value="b-2">いいい</label>
</div>
</div>


<script>
/*ページ内リンクのスムーススクロール*/
$(function(){
    // #で始まるリンクをクリックしたら実行されます
    $('a[href^="#"]').click(function(){
        // スクロールの速度
        var speed = 800; // ミリ秒で記述
        // アンカーの値取得
        var href= $(this).attr("href");
        // 移動先を取得
        var target = $(href == "#" || href == "" ? 'html' : href);
        // 移動先を数値で取得
        var position = target.offset().top;
        // スムーススクロール
        $("html, body").animate({scrollTop:position}, speed, "swing");
        return false;
    });
});

</script>
</body>
</html>

もしかして、当該コード6行目に入れています、jQueryを読み込んでいない、とかありませんでしょうか? このコードは、jQueryを使っているので、 読み込まなければ、動きません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/13 16:24

    jQueryは読み込んでいます。htmlに対して特に記述を入れてないせいかと思うのですが
    どのように記述したらいいのか分からず質問させて頂きました。

    キャンセル

  • 2018/03/13 16:26

    SatokoKugoさん>
    なるほど・・・。
    HTML全体と、
    読み込んでいる、CSS、JavaScriptも記載していただけないでしょうか?

    キャンセル

  • 2018/03/13 17:28

    追記させて頂きました!

    キャンセル

  • 2018/03/13 18:23

    自分でも色々やってみて出来た後に見させて頂きました。
    記載どおりのjsで上手くいきましたので高評価ですが、押させて頂きました。
    ありがとうございます。

    キャンセル

check解決した方法

+1

// スクロール
$(document).on("click", "[id^='radio_button_']", function() {
    //押されたボタンのIDから番号を取得します。
    var button_id = $(this).attr('id').replace('radio_button_', '');
    //移動する先のDIVの位置を取得します。
    var position = $('#radio_button_' + button_id).offset().top;
    //animateを使用して移動します。
    $("html, body").animate({scrollTop:position}, 500, "linear");
    });


これを追加したところ上手くいきました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/13 18:23

    スマートに書けていて、素晴らしいと思います。
    お疲れ様でした。

    キャンセル

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

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