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

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

ただいまの
回答率

89.09%

jQueryで移動させた要素をもとに戻したい

受付中

回答 1

投稿 編集

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

kenshou

score 8

jQueryのanimateメソッドを利用して、要素を動かそうしております。

やり方としては、指定した要素の位置をoffsetで取得し、スクロールしてその位置まで来たらモノが動き出すということをしております。

試したところ、実際にその位置までスクロールしたときに要素は動くのですが、、
希望としてはその位置を超えてないときはまた元の位置に戻しときたいです。

つまりその位置にスクロールで到達するたびに、アニメーションが実装されるようにしたいのです

<!doctype html>
<html lang="jp">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
     <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP::wght@400;500;700&display=swap" rel="stylesheet">
     <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="common/style.css">


    <title>test</title>
  </head>
  <body>
ここから下に要素があります↓
      <img id="test1" src="common/img/test1.png">
          <img id="test2" src="common/img/test2.png">
           <img id="test3" src="common/img/test3.png">
            <img id="test4" src="common/img/test4.png">

 <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
    <script src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.min.js'></script>
    <script src="common/script.js"></script>

  </body>
</html>

cssコード

#test1{
    position: absolute;
     left: 0;
  right: 0;
  margin: auto;
    top:6.38vw;
    width:30.27vw;
    height:9.93vw;
    z-index:4;
}
#test2{
      position: absolute;
     left: 0;
  right: 0;
  margin: auto;
   top:19.65vw;
   width:59.2vw;
   height:10.77vw;
     z-index:3;
}
#test3{
      position: absolute;
     left: 0;
  right: 0;
  margin: auto;
   top:32.3vw;
   width:57.71vw;
   height:7.4vw;
     z-index:2;
}
#test4{
      position: absolute;
     left: 0;
  right: 1vw;
  margin: auto;
   top:43.54vw;
   width:50.21vw;
   height:6.04vw;
     z-index:1;
}

jsコード

 $(function(){
  function animation(){
     $('#test4').each(function(){
      //ターゲットの位置を取得
      var target = $('#test4').offset().top;
      //スクロール量を取得
      var scroll = $(window).scrollTop();
      //ウィンドウの高さを取得
      var windowHeight = $(window).height();
      //ターゲットまでスクロールするとフェードインする
      if (scroll > target - windowHeight){
        $('#test4').animate({'top':'32.3vw'},1000);
         $('#test2').animate({'top':'32.3vw'},1000);
          setTimeout(function(){
  $('#test1').animate({'top':'32.3vw'},1000);},1000);


      }

     });
  }
  animation();
  $(window).scroll(function (){
    animation();
  });
});

試したこと
1.if文のあとにelse文を書いて、それぞれを、もとのtopの位置に戻すことをしたのですが、動いてくれません。
エラー文は特に出ておりませんでした。

else{
 $('#test4').animate({'top':'43.54vw'},1000);
         $('#test2').animate({'top':'19.65vw'},1000);
}


2.elseにanimateではなくcssを使ったのですがこれもうまくいきませんでした

else{
$('#test4').css('top','43.54vw');
         $('#test2').css('top','19.65vw');
}

if文の中は動作するのですが一回実装されるのみでそのあとはいくらスクロールしても移動後の位置に止まったままです.

どなたかわかる方おりましたら、ご回答宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Lhankor_Mhy

    2020/06/30 14:13

    jQueryが読み込まれていないようです。

    キャンセル

  • Lhankor_Mhy

    2020/06/30 14:26

    #test4が絶対配置されていますので、常に画面内にあると思います。

    なので、
    scroll > target - windowHeight
    が成立しない、ということはないはずです。

    #test4の外側にrelativeにしている要素はありませんか?

    キャンセル

回答 1

0

補足依頼をしたのですが、応答がないようなので、仮定が正しい前提で回答します。


ご提示の「試したこと1」の通りで一応動作するのですが、アニメーションのキューが渋滞しているので、実際に動き出すまでに数十秒かかります。

なので、キューをクリアするようにすれば、まあ、なんとか動きます。

        if (scroll > target - windowHeight){
          $('#test4').stop().animate({'top':'32.3vw'},1000);
           $('#test2').stop().animate({'top':'32.3vw'},1000);
            setTimeout(function(){
    $('#test1').stop().animate({'top':'32.3vw'},1000);},1000);


        }else{
            $('#test4').stop().animate({'top':'43.54vw'},1000);
                    $('#test2').stop().animate({'top':'19.65vw'},1000);
           }

ただ、イベントの拾い方を少し工夫した方がいいと思いますよ。
(もう、見ていないのかもしれないけど)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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