前提・実現したいこと
JavaScriptでスクロールアニメーションを作っています。
(A)スクロールしたらcontentsがふわっと出てくるアニメーションと、
(B)contentsの中の文字が順番に出てくるアニメーションを作りたいのですが、
(A)は一回アニメーションが発生したら終わるのですが、(B)はスクロールをするたびにアニメーションが発生してしまいます。
僕としては(B)も一回だけアニメーションが発生するように実装したいです。
発生している問題・エラーメッセージ
(B)がスクロールするたびにアニメーションが発生してしまう。
該当のソースコード
// こちらが(A)のアニメーションです。
const $contentAnimation = document.querySelectorAll('.js-animation');
document.addEventListener('scroll',()=>{
for (let i = 0; i < $contentAnimation.length; i++){
const $getElementDistance = $contentAnimation[i].getBoundingClientRect().top
+ $contentAnimation[i].clientHeight * .6;
if (window.innerHeight > $getElementDistance){ $contentAnimation[i].classList.add('show') ScrollAnimation(); } }
});
// こちらが(B)のアニメーションです。
const $skillsAnimationElement = document.querySelectorAll('.skillsAnimation');
function ScrollAnimation(){
for (let s = 0; s < $skillsAnimationElement.length; s++){
const targetSkills = $skillsAnimationElement[s],
skillsTexts = targetSkills.textContent,
skillsTextsArray = [];
targetSkills.textContent = ''; for (let j = 0; j < skillsTexts.split('').length; j++){ let s = skillsTexts.split('')[j]; if (s === '' ) { skillsTextsArray.push(''); }else{ skillsTextsArray.push('<span><span style="animation-delay: ' + ((j * .5) + .3) + 's;">' + s + '</span></span>') } } for (let k =0; k < skillsTextsArray.length; k++){ targetSkills.innerHTML += skillsTextsArray[k]; } }
}
試したこと
(B)で作った関数(ScrollAnimation())を(A)のif文の画面の幅の方が大きくなったときに、呼び出しています。
これだとスクロールするたびに(B)が実行されてしまいます。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
他にも$contentAnimationにshowというクラスが追加されたら(B)を実行するというif文も別途作ってみましたが、
それだとアニメーション自体が動かなくなりました。
どなたかこの問題を解決していただけると助かります。
どうかよろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/23 01:10
退会済みユーザー
2021/02/23 15:00 編集
2021/02/24 11:02