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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

650閲覧

Reactで動いていたアニメーションが動かなくなってしまった。

daibutusan

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/05/22 06:08

編集2022/05/22 06:09

javascript

1 2 3 4import React from 'react' 5 6const Animation = () => { 7 8 const targetElement = document.querySelectorAll(".animationTarget"); 9 10 document.addEventListener("scroll", function(){ 11 for(let i = 0;i < targetElement.length;i++){ 12 const getElementDistance = targetElement[i].getBoundingClientRect().top + (targetElement[i].clientHeight * 0.6); 13 14 if(window.innerHeight > getElementDistance ){ 15 targetElement[i].classList.add("show"); 16 } 17 18 }}) 19 20 return ( 21 <div> 22 K.U 23 </div> 24 ) 25} 26 27export default Animation;

スクロールされるたびにWindowの高さと、<li>要素の高さを比較してshowクラスを付与し、cssでshowクラスに対し動きを設定しています。

コードとファイル https://github.com/K-U22/cat-cute2
github pages https://k-u22.github.io/cat-cute2/

プログラミングを初めて4か月程度でhtml、css、Javascript、Reactは3日程度で理解が浅いです。
YOUTUBEでjavascriptを使ってアニメーションを作る解説動画があったので、動画ではReactは使ってなかったようなのですが、それを参考にReactを使ってコードを書いていきました。
Animation.jsのコンポーネントで

const targetElement = document.querySelectorAll(".animationTarget")

とし(.animationTargetはArticle.jsコンポーネントのクラスネーム)、一時は要素を取得できていたようなのですが、色々やっていくうちに<li>タグのアニメーションが全く動かなくなってしまいました。
console.log(targetElement)としてコンソールを確認してみると、どうやら要素が取得できていないようです。
かなりの時間調べてみたのですが、一向に解決できる気配がないので質問しました。
知識が浅いのでどの部分を提示すればいいかわからないのでgithubのコードとgithub pagesのurlを貼って置きました。
質問の内容が適切ではなかったら申し訳ないです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/05/22 06:51

React で実 DOM を直接いじるのが間違ってます。アニメーションの前に、まず React の動作原理を理解すべきかと。
daibutusan

2022/05/22 07:17

コメントありがとうございます。Reactは勉強中で、仮想DOMで必要なところだけ再描画して高速化しているとは理解したつもりですが、このような動きを作りたいのならReactでするべきではないということでしょうか?一時は正常に動いていたのですが。
hoshi-takanori

2022/05/22 07:39

React でやるなら querySelector ではなく useRef あたりを使う必要があるはず。関数コンポーネントが呼ばれるタイミングでは実 DOM は未構築かも知れなくて querySelector が成功する保証はないし、そもそも副作用があるコードを関数コンポーネントに直接書くのは良くないです。
daibutusan

2022/05/22 10:48

もう一度色々見直してみました。また基礎から勉強しなおしてみます!ありがとうございました。
guest

回答2

0

ありがとうございました!useRefに関しては改めて学習します!
scrollしたらstateを更新させてレンダリングを促し、そのたびにuseEffectの中の処理をさせることで思い通りの動きになりました。
おそらく3点のコードだと思いますが、改めて勉強します。

javascript

1import './App.css'; 2import React, { useEffect,useState } from 'react'; 3import Article from './conponents/Article'; 4 5 6function App() { 7 8 9const targetElement = document.querySelectorAll(".animationTarget"); 10 11const[num,setnum] = useState(0); 12 13useEffect( () =>{ 14 15document.addEventListener("scroll", function(){ 16for(let i = 0;i < targetElement.length;i++){ 17const getElementDistance = targetElement[i].getBoundingClientRect().top + (targetElement[i].clientHeight * 0.6); 18 19if(window.innerHeight > getElementDistance ){ 20targetElement[i].classList.add("show"); 21} 22 23 24}})}); 25 26const numAdd = () => { 27setnum(prevState => prevState + 1); 28} 29 30document.addEventListener("scroll", function(){ 31numAdd(); 32}); 33 34return ( 35<> 36<Article /> 37 38</> 39); 40} 41 42export default App;

投稿2022/05/22 10:46

daibutusan

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

とりあえず同様のことをするために読んでおくべき
公式ドキュメントのページを貼っておきます

useEffect
useRef

投稿2022/05/22 07:39

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daibutusan

2022/05/22 10:44

ありがとうございました!useRefに関しては改めて学習します! scrollしたらstateを更新させてレンダリングを促し、そのたびにuseEffectの中の処理をさせることで思い通りの動きになりました。 おそらく3点のコードだと思いますが、改めて勉強します。 ```javascript import './App.css'; import React, { useEffect,useState } from 'react'; import Article from './conponents/Article'; function App() { const targetElement = document.querySelectorAll(".animationTarget"); const[num,setnum] = useState(0); useEffect( () =>{ document.addEventListener("scroll", function(){ for(let i = 0;i < targetElement.length;i++){ const getElementDistance = targetElement[i].getBoundingClientRect().top + (targetElement[i].clientHeight * 0.6); if(window.innerHeight > getElementDistance ){ targetElement[i].classList.add("show"); } }})}); const numAdd = () => { setnum(prevState => prevState + 1); } document.addEventListener("scroll", function(){ numAdd(); }); return ( <> <Article /> </> ); } export default App; ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問