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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

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

Q&A

解決済

2回答

1682閲覧

【JavaScript】buttonでアニメーションを何度も切り替えられるようにしたい

srkichi

総合スコア5

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

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

0グッド

0クリップ

投稿2023/07/17 15:35

実現したいこと

  • 1つのボタンを使って、画像のフェードイン、フェードアウトのアニメーションを切り替えられるようにしたい

前提

下図の画像を「ファードアウト」ボタンを押したらフェードアウトさせ
再度ボタンを押したらフェードインするように実装したいです。

イメージ説明

発生している問題・エラーメッセージ

エラーは発生していません。
フェードアウトの状態からボタンを押しても、何も変わらない状態です。

該当のソースコード

CSS

1#wrapper { 2 height: 100vh; 3 display: flex; 4 justify-content: center; 5 align-items: center; 6} 7 8.box { 9 display: flex; 10 flex-direction: column; 11} 12 13#button { 14 width: 200px; 15 height: 60px; 16 background-color: #fdd; 17 border: none; 18 margin: 0 auto 20px; 19 cursor: pointer; 20} 21 22#image { 23 width: 300px; 24 opacity: 1; 25}

HTML

1<div id="wrapper"> 2 <div class="box"> 3 <button id="button" type="submit">フェードアウト</button> 4 <img id="image" src="./images/outsourcing.jpg" alt="サンプル画像"> 5 </div> 6</div><!-- wrapper -->

JavaScript

1 <script> 2 window.addEventListener('DOMContentLoaded', function fadeAnimation(e){ 3 e.preventDefault(); 4 // if判定用 5 let isCrick = false; 6 7 let isButton = document.querySelectorAll('#button')[0] 8 let fadeImage = document.querySelectorAll('#image')[0] 9 isButton.addEventListener('click',()=>{ 10 if(isCrick){ 11 //二重処理防止 12 return false; 13 }else if( isButton.textContent = 'フェードアウト' ){ 14 // ボタンの文字を変える 15 isButton.textContent = 'フェードイン'; 16 // 1クリック時 17 isCrick = true; 18 19 fadeImage.animate( 20 [ 21 //透過度(1:初期状態→0:完全に透過) 22 {opacity: 1}, 23 {opacity: 0} 24 ], 25 { 26 // アニメーション時間 27 duration: 2000, 28 // 最後の状態で停止 29 fill: 'forwards' 30 }) 31 }else{ 32 // ボタンの文字を変える 33 isButton.textContent = 'フェードアウト'; 34 // 1クリック時 35 isCrick = true; 36 37 fadeImage.animate( 38 [ 39 //透過度(1:初期状態→0:完全に透過) 40 {opacity: 0}, 41 {opacity: 1} 42 ], 43 { 44 // アニメーション時間 45 duration: 2000, 46 // 最後の状態で停止 47 fill: 'forwards' 48 }) 49 50 } 51 52 53 } 54 ) 55 }); 56 </script> 57

試したこと

透明度の変更にclasslistを使用してみたりしましたが、animationとは一緒に使えないとわかりました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

共通化のためにリストを作っておくと楽かもしれませんね
個人的な感覚だとボタンのテキストはアニメーション後に変わったほうがよいと思います。

javascript

1<script> 2window.addEventListener('DOMContentLoaded',()=>{ 3 const isButton = document.querySelector('#button'); 4 const fadeImage = document.querySelector('#image'); 5 isButton.addEventListener('click',()=>{ 6 isButton.disabled=true; 7 let status=isButton.dataset.status; 8 status=(isButton.dataset.status=status=="in"?"out":"in"); 9 const list={ 10 "in": {txt:"フェードイン" ,opa_from:1,opa_to:0}, 11 "out":{txt:"フェードアウト",opa_from:0,opa_to:1}, 12 } 13 const option={ duration: 2000,fill: 'forwards'}; 14 const myKeyframe= new KeyframeEffect( 15 fadeImage, 16 [ 17 {opacity:list[status].opa_from}, 18 {opacity:list[status].opa_to} 19 ], 20 option); 21 const myAnime = new Animation(myKeyframe,document.timeline); 22 myAnime.play(); 23 myAnime.addEventListener('finish',()=>{ 24 isButton.textContent = list[status].txt; 25 isButton.disabled=false; 26 }); 27 }); 28}); 29</script> 30<div id="wrapper"> 31<div class="box"> 32<button id="button" type="submit">フェードアウト</button> 33<img id="image" src="./images/outsourcing.jpg" alt="サンプル画像"> 34</div> 35</div>

投稿2023/07/18 00:51

yambejp

総合スコア117665

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

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

srkichi

2023/07/18 14:15

ご回答ありがとうございます。 ご提示いただいたコードを基に、Web Animation APIについて詳しく学習しました。 コードが単純化され、意味が分かれば何をしたいかが理解しやすいです。
guest

0

js

1 }else if( isButton.textContent = 'フェードアウト' ){

これは代入文です。=== に変えましょう。

投稿2023/07/17 23:52

int32_t

総合スコア21927

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

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

srkichi

2023/07/18 14:05

ご指摘ありがとうございます。 おっしゃる通りですね。 「==」と「===」もややこしくなるので 再度演算子について確認しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問