JavaScript 画像動画の切替 詳細の表示 イベントハンドラ
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,174
実現したいこと
1,画像をクリックすると埋め込まれた動画に切り替わる。
2,画像と動画にmouseover mouseoutすると詳細文が表示される。
3,管理がしやすい、きれいなcoding(記事の増減時など)
試したこと
function を以下三つ用意し、各イベントハンドラと対応させました。
show(詳細文を表示する)→onmouseover
hide(詳細文を非表示にする)→onmouseout
change(画像と動画を切替える)→onclick
切替え操作はcssをdisplay:none;⇄block;にて書き換えることによって行っています。
一応、1,2,の機能を実現できたのですが、思いついた機能を付け加えただけのcodingになっております。
それゆえ記事を増やす場合に必要な記述が多くなっているのが現状です。
皆様には、3の”管理がしやすい、きれいなcoding”についてアドバイスをいただければ幸いです。(添付したcodeと全く異なる構造でも嬉しいです)
どうぞよろしくお願いします。
該当のソースコード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>test</title>
<style>
.item {
width: 25%;
float: left;
padding-bottom: 5%;
}
.item-box {
height: 200px;
width: 200px;
margin: auto;
background-color: #11D8B3;
border-radius: 5px;
}
#movie1,
#movie2{
display: none;
}
.articles > div {
display: none;
font-size: 40px;
margin: auto;
float: left;
}
</style>
</head>
<body>
<!--画像と動画-->
<div class="item">
<div class="item-box">
<div id="img1" onclick="change(1)"><img onmouseover="show(1)" onmouseout="hide(1)" src="img.jpeg" alt="img dog" width="200" height="200" alt=""></div>
<iframe id="movie1" onmouseover="show(1)" onmouseout="hide(1)" width="200" height="200" src="https://www.youtube.com/embed/j5PLngd2WN0" allowfullscreen></iframe>
</div>
</div>
<div class="item">
<div class="item-box">
<div id="img2" onclick="change(2)"><img onmouseover="show(2)" onmouseout="hide(2)" src="img.jpeg" alt="img cat" width="200" height="200" alt=""></div>
<iframe id="movie2" onmouseover="show(2)" onmouseout="hide(2)" width="200" height="200" src="https://www.youtube.com/embed/obTj1qvotdc" allowfullscreen></iframe>
</div>
</div>
<div class="articles">
<!--ここから詳細文-->
<div id="article1">The term "domestic dog" is generally used for both domesticated and feral varieties. The English word dog comes from Middle English dogge, from Old English docga, a "powerful dog breed".
</div>
<div id="article2">ネコ(猫)は、狭義にはネコ目(食肉目)- ネコ亜目- ネコ科- ネコ亜科- ネコ属- ヤマネコ種- イエネコ亜種に分類される小型哺乳類であるイエネコ(家猫、学名:Felis silvestris catus)の通称である。
</div>
</div>
<script type="text/javascript">
function show(num) {
document.getElementById("article" + num).style.display = "block";
return false;
}
function hide(num) {
document.getElementById("article" + num).style.display = "none";
return false;
}
function change(num) {
document.getElementById("img" + num).style.display = "none";
document.getElementById("movie" + num).style.display = "block";
return false;
};
</script>
</body>
</html>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
「『class="item-box"』の要素以下は構成要素とその出現順が固定」というルールを決められれば各イベントをjavascriptで付け足していく、という方法がとれるかも。
function show(num) {
return function(){
document.getElementById("article" + num).style.display = "block";
return false;
};
}
function hide(num) {
return function(){
document.getElementById("article" + num).style.display = "none";
return false;
};
}
function change(num) {
return function(){
document.getElementById("img" + num).style.display = "none";
document.getElementById("movie" + num).style.display = "block";
return false;
};
};
window.onload=function(){
var itemboxes = document.getElementsByClassName('item-box');
for(var i = 0; i < itemboxes.length; i++){
var num = i + 1;
var node;
// div
node = itemboxes[i].getElementsByTagName('div')[0];
node.onclick=change(num);
// img
node = itemboxes[i].getElementsByTagName('img')[0];
node.onmouseover=show(num);
node.onmouseout=hide(num);
// iframe
node = itemboxes[i].getElementsByTagName('iframe')[0];
node.onmouseover=show(num);
node.onmouseout=hide(num);
}
};
スクリプトをこんな具合にしておけばhtml部は
<!--画像と動画-->
<div class="item">
<div class="item-box">
<div id="img1"><img src="img.jpeg" alt="img dog" width="200" height="200" alt=""></div>
<iframe id="movie1" width="200" height="200" src="https://www.youtube.com/embed/j5PLngd2WN0" allowfullscreen></iframe>
</div>
</div>
<div class="item">
<div class="item-box">
<div id="img2"><img src="img.jpeg" alt="img cat" width="200" height="200" alt=""></div>
<iframe id="movie2" width="200" height="200" src="https://www.youtube.com/embed/obTj1qvotdc" allowfullscreen></iframe>
</div>
</div>
<div class="articles">
<!--ここから詳細文-->
<div id="article1">The term "domestic dog" is generally used for both domesticated and feral varieties. The English word dog comes from Middle English dogge, from Old English docga, a "powerful dog breed".
</div>
<div id="article2">ネコ(猫)は、狭義にはネコ目(食肉目)- ネコ亜目- ネコ科- ネコ亜科- ネコ属- ヤマネコ種- イエネコ亜種に分類される小型哺乳類であるイエネコ(家猫、学名:Felis silvestris catus)の通称である。
</div>
</div>
という具合に「on~」の記述を大幅に削減できますね。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/18 15:33
onloadとfor文の組み合わせ方、大変勉強になりました。
ありがとうございます!