sharp231
@sharp231

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Vue.jsでスクロールアニメーションとクリック機能を実装するため

解決したいこと

jQueryからVue.jsにコードを書き換えていて
スクロールアニメーションやクリック機能の実装まで行えるようにしたい

package.json
"dependencies": {
    "firebase": "^10.8.0",
    "nuxt": "^3.10.3",
    "vue": "^3.4.19",
    "vue-router": "^4.3.0"
  }

発生している問題・エラー

Vue.js

at _sfc_main.setup (C:\Users\\test-nuxt\app.js:74:23)
at callWithErrorHandling (C:\Users\\test-nuxt\node_modules\@vue\runtime-core\dist\runtime-core.cjs.js:192:19)
at setupStatefulComponent (C:\Users\\test-nuxt\node_modules\@vue\runtime-core\dist\runtime-core.cjs.js:7562:25)
at setupComponent (C:\Users\\test-nuxt\node_modules\@vue\runtime-core\dist\runtime-core.cjs.js:7523:36)
at renderComponentVNode (C:\Users\\test-nuxt\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:620:15)
at Module.ssrRenderComponent (C:\Users\\test-nuxt\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:84:10)
at default (C:\Users\\test-nuxt\node_modules\nuxt\dist\app\components\nuxt-root.js:82:37)
at Module.ssrRenderSuspense (C:\Users\\test-nuxt\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:467:5)
at _sfc_ssrRender (C:\Users\\test-nuxt\node_modules\nuxt\dist\app\components\nuxt-root.js:73:25)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

jQuery.js
function Scroll() {
  let time = 0.4; //時間
  let value = time;
  $(".delayScroll").each(function () {
    let parent = this; //親要素
    let elemPos = $(this).offset().top; //要素の位置
    let scroll = $(window).scrollTop(); //スクロール
    let windowHeight = $(window).height(); // 画面の高さ
    let childs = $(this).children(); //子要素

    //{}はスクロールをしたら動くまたは親要素にクラスplayがない
    if (scroll >= elemPos - windowHeight && !$(parent).hasClass("play")) {
      $(childs).each(function () {
        if (!$(this).hasClass("fadeUp")) {
          //動くのチェック

          $(parent).addClass("play");
          $(this).css("animation-delay", value + "s"); //アニメーションの遅延
          $(this).addClass("fadeUp"); //アニメにクラス名を追加
          value = value + time; // 遅延時間を増やす

          let index = $(childs).index(this);
          if (childs.length - 1 == index) {
            $(parent).removeClass("play");
          }
        }
      });
    } else {
      $(childs).removeClass("fadeUp"); //クラス名を削除
      value = time; //delay初期値の数値に戻す
    }
  });
}
//画面をスクロールしたら動かしたい
$(window).scroll(function () {
  Scroll(); //アニメーション用の関数を呼ぶ
}); //ここまで画面をスクロールをしたら動かしたい
//画面が読み込まれたらすぐに動かしたい
$(window).on("load", function () {
  Scroll(); //アニメーション用の関数を呼ぶ
}); //ここまで画面をスクロールをしたらすぐに動かしたい

$(function () {
  // #で始まるリンクをクリックした場合
  $('a[href^="#"]').click(function () {
    // スクロールの速度
    let speed = 500;
    // スクロールタイプ
    let type = "swing";
    // href属性の取得
    let href = $(this).attr("href");
    // 移動先の取得(hrefが#indexならトップ$(html)に、)
    let target = $(href == "#index" ? "html" : href);
    // 移動先のポジション取得
    let position = target.offset().top;
    // animateでスムーススクロール
    $("body,html").animate({ scrollTop: position }, speed, type);
    return false;
  });
});

// let links = document.querySelectorAll(".links");

//display links onclick on hamburger
// hamburger.addEventListener("click", () => {
//   navLinks.classList.toggle("hide");
//   hamburger.classList.toggle("lines-rotate");
// });

// for (let i = 0; i < links.length; i++) {
//   links[i].addEventListener("click", () => {
//     navLinks.classList.toggle("hide");
//   });
// }

該当するソースコード

Vue.js
<script setup>
import {onMounted} from 'vue';
new Vue({
  el: "#app",
  data: {
    time: 0.4,
    value: 0.4,
  },

  const :scrollAnimetion = () => {
      const parent = document.querySelector(".delayScroll");
      const elePos = parent.offsetTop;
      const scroll = window.scrollY;
      const windowHeight = window.innerHeight;
      const childs = parent.children;

      if (
        scroll > elePos - windowHeight &&
        !parent.classList.contains("play")
      ) {
        Array.from(childs).forEach((child) => {
          if (!child.classList.contains("fadeUp")) {
            parent.classList.add("play");
            child.style.animationDelay = this.value + "s";
            child.classList.add("fadeUp");
            value.value += time.value;

            const index = Array.from(childs).indexOf(child);
            if (childs.length - 1 === index) {
              parent.classList.remove("play");
            }
          }
        });
      } else {
        Array.from(childs).forEach((child) => {
          child.classList.remove("fadeUp");
        });
        value.value = time.value;
      }
    },
    const :scrollTarget = (target) => {
      const speed = 500;
      const type = "swing";
      const position = target === "#index" ? 0 : document.querySelector(target).offsetTop;
      $("body,html").animate({ scrollTop: position }, speed, type);
    },

  const :time = ref(0.4),
  const :value = ref(0.4),

  // onMounted(() => {
  //   scrollAnimetion();
  //   window.addEventListener("scroll", scrollAnimetion),

});
</script>

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

他にも問題がありますので改善するために調べています

よろしくお願いします

0

1Answer

エラー箇所のコードはないのですか?
/app.vue:10:2 ってありますけれども。

0Like

Comments

  1. @sharp231

    Questioner

    ありがとうございます
    改善しました

  2. 一度、問題ない状態の初期状態を作って、それをバージョン管理の起点にしてソースを足していったらどうなります?どこでエラーになりますか?

  3. @sharp231

    Questioner

    vue.js
    <script setup>
    import { onMounted,onUnmounted, ref } from 'vue';
    
    const time = ref(0.4);
    const value = ref(0.4);
    let parent = null;
    let childs = [];
    
    const scrollAnimation = () => {
      const elePos = parent.offsetTop;
      const scroll = window.scrollY;
      const windowHeight = window.innerHeight;
    
      if (scroll > elePos - windowHeight && !parent.classList.contains("play")) {
        childs.forEach((child) => {
          if (!child.classList.contains("fadeUp")) {
            parent.classList.add("play");
            child.style.animationDelay = `${value.value}s`;
            child.classList.add("fadeUp");
            value.value += time.value;
            if (childs.indexOf(child) === childs.length - 1) {
              parent.classList.remove("play");
            }
          }
        });
      } else {
        childs.forEach((child) => {
          child.classList.remove("fadeUp");
        });
        value.value = time.value;
      }
    };
    onMounted(() => {
      parent = document.querySelector('.delayScroll');
      childs = Array.from(parent.children);
      scrollAnimation();
      window.addEventListener('scroll', scrollAnimation);
    });
    
    // const scrollTarget = (target) => {
    //   const element =
    //     target === "#index" ? document.body : document.querySelector(target);
    //   element.scrollIntoView({ behavior: "smooth" });
    // };
    
    
    // onUnmounted(() => {
    //   window.removeEventListener('scroll', scrollAnimation);
    // });
    </script>
    

    onMountedの動作確認は取れました
    エラーが起きずにアニメーションが動作します
    scrollTargetからがエラーがおきます

  4. 多分、それは回答のコメントの中で書くよりは質問に加筆していった方がいいと思いますよ……できるなら playground(実行環境) もあった方が回答する側もわかりやすいとも思いますので

    vue sfc playgournd だと アドレスにソースも含まれていますので、修正する度、URLは変わりますが、登録しなくても気軽に利用できるのでおすすめしておきます。

  5. @sharp231

    Questioner

    バージョン管理の起点にしてソースを足していったらどうなります?

    これをどういうことでしょうか

    vue sfc playgourndを利用して投稿すればよいでしょうか
    よろしくお願いします

  6. エラーが起こらない状態を用意して、それをバージョン管理の起点にしてってニュアンスですが、エラーが起こらない状態に戻せる環境が必要くらいのニュアンスでもいいです。

    vue sfc playground でその環境を転記して、一緒に 質問に そのリンクもつければ 回答したい人が環境を用意できる旨です。

  7. @sharp231

    Questioner

    エラーが起こらない状態を用意して、それをバージョン管理の起点にしてってニュアンスですが、エラーが起こらない状態に戻せる環境が必要くらいのニュアンスでもいいです。

    上記の内容の意味合いでいいでしょうか

    アドバイスの通りに対応しましたがどういったことをすればよいでしょうか

  8. とりあえずそちらの実行している環境を vue sfc playground で再現してリンクを貼っていただけると 推測だけじゃなくて実際に動作を確認して問題点を出せると思うのですが、どうでしょうか?(まずは playground 側に記述してその結果として生成されたURLをリンクとして質問に貼っていただけないとこちらは見れないので

  9. @sharp231

    Questioner

    わかりました
    nuxt.jsとVue SFC Playgroundで反映の違いが出ていますので
    どうしようかなと対処を考えています

    画像ファイルを追加する方法はご存知でしょうか
    調べていますが、全然わかりません
    もしご存知でしたらご教授願います

    ひとまず、質問にVue SFC Playgroundリンクを追加します
    よろしくお願いします

  10. 例えば、画像を意味する div にしてしまってもいいのでは?必要なのは高さを幅だとは思うので やりたいこに支障がないのであれば下記みたいなのでもいいと思いますがいかがでしょうか?

    <div style="height:100px;width:300px;background-color:red"></div>
    

    本当に画像の必要があるのであれば データ URL というも手です。

  11. @sharp231

    Questioner

    リンクを追加しました

    アニメーションを動作を確認するために画像が必要です
    ないとVue.jsの動作がわからないです

  12. @sharp231
    ほしいのは画像ではなくて、スペーサーと理解したため、次の様なスタイルを入れればいけるのでは……?

    <style>
    #mainvisual > *{
      height:800px;
      width: 100vw;
      background: repeating-linear-gradient(#c2a8cc, #c2a8cc 20px, #fff 20px, #fff 40px);
    }
    </style>
    

  13. @sharp231

    Questioner

    少し違います
    スクロールすると画像がフェードインする動作ができるようにしたいですね

    nuxt.jsとVue SFC Playgroundで反映の違いが出ていてnuxt.jsの環境が不十分なのかなと思っています

  14. であるなら data URL 作って src に設定したらいいのでは……?

  15. @sharp231

    Questioner

    上の画像はアニメーションが動きますが下の画像はアニメーションされません

    ここがエラーの部分かなと

Your answer might help someone💌