前提・実現したいこと
殆どコピペに頼っている初心者ですが、よろしくお願いいたします
・画像をクリックするたびに要素の表示・非表示の動作が発生し数秒後もとの状態に戻る
・クリックで表示される画像と文字列がセットになったものは数パターンあり、ランダムに表示される
上記のような遊びのページを作ろうとしています
発生している問題・エラーメッセージ
切り替え用画像が表示されず(非表示マークが出ている)
画像とセットで表示されるようにした文字列も切り替え用画像を表示させるタイミングで消えてしまう
net::ERR_FILE_NOT_FOUND Image (async) (anonymous) @ script.js:49 dispatch @ jquery.min.js:2 v.handle @ jquery.min.js:2
jQuely
$(function() { // 画像をクリックしたら発動 $('div.character').on('click', function() { // 要素の表示・非表示を切り替えてコメントを表示 $('div.text').fadeIn(500); $('div.change').fadeIn(500); $('div.character').fadeOut(500); // 時間経過で要素の表示・非表示をもとに戻してコメントを非表示 $('div.text').delay(4000).fadeOut(500); $('div.change').delay(4000).fadeOut(500); $('div.character').delay(4000).fadeIn(500); // リストアップ var elements = [ ['コメントA', './img/a.png'], ['コメントB', './img/b.png'], ['コメントC', './img/c.png'] ]; // リストの数をチェックしてランダムに取得 var randElm = elements[Math.floor(Math.random() * elements.length)]; var randImg = elements[Math.floor(Math.random() * elements.length)]; // 表示エリアにコメントを挿入 $('div.word').html(randElm[0]); // 表示エリアに切り替え用画像を挿入 var img = document.getElementById('change_image'); img.src = 'randImg[1]'; }); });
HTML
<div class="talk"> <div class="character"><img src="./img/normal.png"></div> <div class="change"><img src="./img/a.png" id="change_image"></div> <div class="text"><div class="wordbox"><div class="word"></div></div></div> </div>
試したこと
// リストの数をチェックしてランダムに取得(の切り替え用画像部分) var randImg = elements[Math.floor(Math.random() * elements.length)]; // 切り替え用画像を表示させる(の全ての記述) var img = document.getElementById('change_image'); img.src = 'randImg[1]';
上記を削除すると、ランダムにはならないものの画像自体は表示される(HTMLで指定しているため)ので
jQuelyの切り替え画像に関する部分の記述に問題があるのかな?と思っているのですが、具体的にどう書き換えればいいのかがわかりません
切り替え用の画像が表示されないが故に挙動がおかしくなっているようなので
単純に画像パスの記述ミスかとも思ったのですが、前述の通りHTMLで指定した画像は表示されるので
そちらは間違っていないように感じます
(一応補足すると、HTMLと同じ階層に画像フォルダをつくり、その中に画像を入れています)
どうかご教示願います
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/19 03:24 編集
回答3件
0
書き直してみました
※スタイルシートの記載が無かったので勝手に設定しています。
変更よろしくお願いします。
アニメーション処理もなされたい様子だったので
参考になるサイトの記述をベースにしています。
jQueryで簡単にできる!アニメーションやスライドショーの作り方
他のアニメーションなどの動きなどに変更されたい場合参考にしやすきかと思います
HTML
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<style type="text/css"> 6body { 7 text-align:center; 8} 9.character img{ 10 width: 370px; 11 margin: auto; 12 height: 370px; 13 display: none; 14} 15.wordbox div{ 16 width: 370px; 17 margin: auto; 18 height: 20px; 19 display: none; 20} 21</style> 22<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 23<script type="text/javascript"> 24$(function() { 25 // 参考にした処理 26 // https://www.sejuku.net/blog/103061 27 // リストアップ 28 var elements = [ 29 ['', 'normal.png'], 30 ['コメントA', 'a.png'], 31 ['コメントB', 'b.png'], 32 ['コメントC', 'c.png'] 33 ]; 34 // 画像とメッセージを追加 35 for(var i = 0; i < elements.length; i ++){ 36 $('div.character').append('<img src="' + elements[i][1] + '">'); 37 $('div.wordbox').append('<div>' + elements[i][0] + '</div>'); 38 } 39 const images = $('.character img'); 40 const messages = $('.wordbox div'); 41 let counter = 0; 42 let index = 0; 43 44 // 始めの画像とメッセージを表示 45 images.eq(index).css('display', 'block'); 46 messages.eq(index).css('display', 'block'); 47 48 // 画像をクリックしたら発動 49 $('div.character').on('click', function() { 50 51 // 画像、メッセージのフェードアウト 52 images.eq(index).css('display', 'none').fadeOut(500); 53 messages.eq(index).css('display', 'none').fadeOut(500); 54 55 // リストの数をチェックしてランダムに取得(1からなので初期表示画像は選ばれない) 56 var counter = Math.floor( Math.random() * (elements.length - 1) ) + 1; 57 index = counter % images.length; 58 59 // 画像、メッセージのフェードイン 60 images.eq(index).fadeIn(500); 61 messages.eq(index).fadeIn(500); 62 63 }); 64}); 65</script> 66</head> 67<body> 68<div class="talk" style="background-color: #f0f0f0; width: 400px; height: 410px;"> 69 <div class="character" style="background-color: #C8C8C8; width: 380px; height: 380px; margin: auto;"> 70 </div> 71 <div class="text"> 72 <div class="wordbox"> 73 </div> 74 </div> 75</div> 76</body> 77</html>
投稿2020/09/19 04:45
総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/19 16:15
2020/09/19 16:25
2020/09/20 07:22 編集
0
ベストアンサー
typoでは?
img.src = 'randImg[1]';
→img.src = randImg[1];
投稿2020/09/19 02:34
総合スコア36960
0
あとで他の処理と比較しやすい様にサンプルがある所から持ってきたのが
逆に判りずらくなったようです。
申し訳ございません。
修正を行いました。
JavaScript(jQuery)に関してはあくまで「判りやすくする為」に修正しているだけですので
基本変わりません。
HTML側は1点修正しています。
▲を表示されている事が判りましたが、そのままだと位置の調整が難しいので
別に<div>タグを用意してその中に表示し位置を決めれるようにしています。
※CSSファイルの指定だけお願いします。
HTML
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="UTF-8"> 5<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 6<script type="text/javascript"> 7$(function() { 8 // 参考にした処理 9 // https://www.sejuku.net/blog/103061 10 // リストアップ 11 var elements = [ 12 ['', './img/normal.png'], 13 ['コメントA', './img/a.png'], 14 ['コメントB', './img/b.png'], 15 ['コメントC', './img/c.png'] 16 ]; 17 // 画像とメッセージを追加 18 for(var i = 0; i < elements.length; i ++){ 19 $('div.character').append('<img src="' + elements[i][1] + '" style="display: none;">'); // 判りやすくする為に修正 20 $('div.wordbox').append('<div style="display: none;">' + elements[i][0] + '</div>'); // 判りやすくする為に修正 21 } 22 const images = $('.character img'); 23 const messages = $('.wordbox div'); 24 let counter = 0; 25 let index = 0; 26 27 // 始めの画像とメッセージを表示 28 images.eq(index).css('display', 'inline'); 29 messages.eq(index).css('display', 'inline'); 30 31 // 画像をクリックしたら発動 32 $('div.character').on('click', function() { 33 34 // 画像、メッセージのフェードアウト 35 images.eq(index).css('display', 'none').fadeOut(500); 36 messages.eq(index).css('display', 'none').fadeOut(500); 37 38 // リストの数をチェックしてランダムに取得(1からなので初期表示画像は選ばれない) 39 var counter = Math.floor( Math.random() * (elements.length - 1) ) + 1; 40 index = counter % images.length; 41 42 // 画像、メッセージのフェードイン 43 images.eq(index).fadeIn(500); 44 messages.eq(index).fadeIn(500); 45 46 }); 47}); 48</script> 49</head> 50<body> 51<div id="contents"> 52 <div class="talk" > 53 <div class="character" > 54 </div> 55 <div class="text"> 56 <div class="triangle"></div><!-- 三角形表示用に追加 --> 57 <div class="wordbox"> 58 </div> 59 </div> 60 </div> 61</div> 62</body> 63</html>
▲を<div>タグに移したため内容に変更がございます。
変更内容はコメントをご覧ください。
CSS
1#contents{ 2 width: 750px; 3 height: 1080px; 4 margin: auto; 5 background-image: url(./img/kabegami.png); 6 text-align:center; 7} 8 9/* 画像表示エリア */ 10.character { 11 z-index: 5; 12} 13 14/* テキスト表示エリア */ 15.text { 16 top: -16px; /* 位置調整(上方向) */ 17 text-align: center; 18 z-index: 10; 19} 20 21.wordbox { 22 position: relative; 23 display: inline-block; 24 padding: 20px; 25 border-radius: 45px; 26 border: 2px solid #000000; 27 width: 200px; /* 文字の内容で幅が変わってしまうので幅を指定して下さい */ 28 height: 24px; /* 文字が無いと高さが変わってしまうので高さを指定して下さい */ 29} 30 31/* 三角表示 */ 32.triangle { 33 position: relative; /* 移動するときの基準が元いた位置から */ 34 top: -8px; /* 位置調整(上方向) */ 35 width: 30px; /* 三角の正確な幅(これが無いと中央寄せできない) */ 36 margin-left: auto; /* 左右中央寄せ */ 37 margin-right: auto; /* 左右中央寄せ */ 38} 39 40/* 三角表示の位置大きさの指定は表示している".triangle"に移動 41こちらからは削除 */ 42.triangle:before { 43 content: ''; 44 position: absolute; 45 display: block; 46 border-right: 15px solid transparent; 47 border-bottom: 15px solid #000000; 48 border-left: 15px solid transparent; 49} 50/* 三角表示の位置大きさの指定は表示している".triangle"に移動 51こちらからは削除 */ 52.triangle:after { 53 content: ''; 54 position: absolute; 55 display: block; 56 border-right: 15px solid transparent; 57 border-bottom: 15px solid #000000; 58 border-left: 15px solid transparent; 59} 60.character img{ 61 margin: auto; /* <img>タグを中央位置にしています。 */ 62} 63.wordbox div{ 64 margin: auto; /* テキストを表示している<div>タグを中央位置にしています。 */ 65}
投稿2020/09/20 13:53
総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/23 13:54
2020/09/23 14:37
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。