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

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

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

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

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

Q&A

解決済

1回答

2257閲覧

React --- CSSアニメーションの終了を感知して次のイベントを発生させたい

youj_biginner

総合スコア7

JavaScript

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

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

0グッド

2クリップ

投稿2020/05/27 13:46

編集2020/05/27 13:56

回転するCSSアニメーションが終了し次第、モーダルのアニメーションを始動させたいと思っています。しかし、現状のコードでは同時にアニメーションが起こってしまいます。

コード

javascript

1class App extends Component { 2 state = { 3 isOpen: false, 4 isAnimated : false, 5 }; 6 onOpenModal = () => { 7 this.setState({ isAnimated: true }); 8 this.setState({ isOpen: true }); 9 }; 10 11 render() { 12 return( 13 <div className="wrapper"> 14 <div className="container"> 15 <div className="center-align"> 16 <img src={img3} alt="" className={this.state.isAnimated ? "anime-a" : ""} /> 17 </div> 18 <div className="center-align"> 19 <button onClick={this.onOpenModal}>クリック</button> 20 </div> 21 </div> 22 </div> 23 24 ); 25 } 26 27} 28

css

1.anime-a { 2 animation:rotateAnimation 1s; 3} 4 5@keyframes rotateAnimation { 6 0% { 7 transform: rotate(0deg); 8 } 9 100% { 10 transform: rotate(180deg); 11 } 12}

クリックするとonOpenModal関数が動くようになります。その中で、画像の回転アニメーションが起こり、その後にモーダルが開くという形を実装したいです。しかし、これだと同じタイミングでアニメーションが起きてしまいます。回転アニメーション終了のタイミングで次のアニメーションを起こすにはどうすれば良いでしょうか。もっと言うと、アニメーション終了のタイミングでsetState({isOpen: true})にしたいです。良い方法があれば教えてください。

試したこと

###addEventListenerを使ってみました。

javascript

1 onOpenModal = () => { 2 var el = document.querySelector('.anime-a'); 3 this.setState({ isAnimated: true }); 4 el.addEventListener('animationed', function() { 5 this.setState({ open: true }); 6 }); 7 }

これでうまくいくはず!と思ったんですが、

Unhandled Rejection (TypeError): Cannot read property 'addEventListener' of null

というエラーが出てしまいました。おそらくDOMの問題だと思います。この方法ではReactにおいてCSSアニメーションを制御できない。

onAnimationEndを使ってみた

javascript

1 onOpenModal = () => { 2 // this.setState({ isAnimated: true }); 3 this.setState({ open: true }); 4 } 5 6 onImageRotate = () => { 7 this.setState({ isAnimated: true }); 8 } 9 10// 略 11<button onClick={this.onImageRotate} onAnimationEnd={this.onOpenModal}>クリック</button>

しかし、これではなぜかonAnimationEndの方が動かずモーダルが出てきません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは
以下のように、修正してみるといかがでしょうか?

修正前

javascript

1onOpenModal = () => { 2 this.setState({ isAnimated: true }); 3 this.setState({ isOpen: true }); 4};

修正後

以下のように、isOpenを true にする setOpen メソッドを追加して、これを(CSSアニメーションと同じ時間の)1秒待ってから開始するようにします。

javascript

1setOpen = () => this.setState({ isOpen: true }); 2 3onOpenModal = () => { 4 this.setState({ isAnimated: true }); 5 setTimeout(this.setOpen, 1000); 6};

以上、参考になれば幸いです。

投稿2020/05/27 14:09

jun68ykt

総合スコア9058

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

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

youj_biginner

2020/05/27 14:25

ありがとうございます!うまくいきました!!
jun68ykt

2020/05/27 14:26

どういたしまして???? > うまくいきました!! とのことでよかったです ????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問