エラー箇所のコードはないのですか?
/app.vue:10:2
ってありますけれども。
Vue.jsでスクロールアニメーションとクリック機能を実装するため
解決したいこと
jQueryからVue.jsにコードを書き換えていて
スクロールアニメーションやクリック機能の実装まで行えるようにしたい
"dependencies": {
"firebase": "^10.8.0",
"nuxt": "^3.10.3",
"vue": "^3.4.19",
"vue-router": "^4.3.0"
}
発生している問題・エラー
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)
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
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");
// });
// }
該当するソースコード
<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>
自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
他にも問題がありますので改善するために調べています
よろしくお願いします
1Answer
Comments
@sharp231
Questionerありがとうございます
改善しました一度、問題ない状態の初期状態を作って、それをバージョン管理の起点にしてソースを足していったらどうなります?どこでエラーになりますか?
@sharp231
Questionervue.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からがエラーがおきます多分、それは回答のコメントの中で書くよりは質問に加筆していった方がいいと思いますよ……できるなら playground(実行環境) もあった方が回答する側もわかりやすいとも思いますので
vue sfc playgournd だと アドレスにソースも含まれていますので、修正する度、URLは変わりますが、登録しなくても気軽に利用できるのでおすすめしておきます。
@sharp231
Questionerバージョン管理の起点にしてソースを足していったらどうなります?
これをどういうことでしょうか
vue sfc playgourndを利用して投稿すればよいでしょうか
よろしくお願いしますエラーが起こらない状態を用意して、それをバージョン管理の起点にしてってニュアンスですが、エラーが起こらない状態に戻せる環境が必要くらいのニュアンスでもいいです。
vue sfc playground でその環境を転記して、一緒に 質問に そのリンクもつければ 回答したい人が環境を用意できる旨です。
@sharp231
Questionerエラーが起こらない状態を用意して、それをバージョン管理の起点にしてってニュアンスですが、エラーが起こらない状態に戻せる環境が必要くらいのニュアンスでもいいです。
上記の内容の意味合いでいいでしょうか
アドバイスの通りに対応しましたがどういったことをすればよいでしょうか
とりあえずそちらの実行している環境を vue sfc playground で再現してリンクを貼っていただけると 推測だけじゃなくて実際に動作を確認して問題点を出せると思うのですが、どうでしょうか?(まずは playground 側に記述してその結果として生成されたURLをリンクとして質問に貼っていただけないとこちらは見れないので
@sharp231
Questionerわかりました
nuxt.jsとVue SFC Playgroundで反映の違いが出ていますので
どうしようかなと対処を考えています画像ファイルを追加する方法はご存知でしょうか
調べていますが、全然わかりません
もしご存知でしたらご教授願いますひとまず、質問にVue SFC Playgroundリンクを追加します
よろしくお願いします例えば、画像を意味する div にしてしまってもいいのでは?必要なのは高さを幅だとは思うので やりたいこに支障がないのであれば下記みたいなのでもいいと思いますがいかがでしょうか?
<div style="height:100px;width:300px;background-color:red"></div>
本当に画像の必要があるのであれば データ URL というも手です。
@sharp231
Questionerリンクを追加しました
アニメーションを動作を確認するために画像が必要です
ないとVue.jsの動作がわからないです@sharp231
ほしいのは画像ではなくて、スペーサーと理解したため、次の様なスタイルを入れればいけるのでは……?<style> #mainvisual > *{ height:800px; width: 100vw; background: repeating-linear-gradient(#c2a8cc, #c2a8cc 20px, #fff 20px, #fff 40px); } </style>
@sharp231
Questioner少し違います
スクロールすると画像がフェードインする動作ができるようにしたいですねnuxt.jsとVue SFC Playgroundで反映の違いが出ていてnuxt.jsの環境が不十分なのかなと思っています
であるなら data URL 作って src に設定したらいいのでは……?
@sharp231
Questioner上の画像はアニメーションが動きますが下の画像はアニメーションされません
ここがエラーの部分かなと