クリッカブルマップにロールオーバー(Javascript)を付けようと思うのですが、
どうも目指していることが上手くいきません。
まずは、下記サイトをご覧ください。
http://www.webdlab.com/template/clickable2/
これはソースコードが乗っているサイトです。
この通りに書けば、通常のロールオーバーはできるのですが、
私の目的はあと+α必要になります。
[内容]
1. オンマウス時にロールオーバー
2. クリック後も、ロールオーバー状態
3. 他のイメージにオンマウスしても、さっきクリックしたイメージがロールオーバー状態
4.他のイメージをクリックして、はじめてロールオーバー画像が切り替わる。
以上です。
ちなみに現状(上記サイト)は.onmouseover、.onmouseout、.onclickの3つすべてロールオーバー後のイメージを指定すれば[内容]の1と2まではクリアなのですが、3以降がNGです。
そもそもクリッカブルのロールオーバーでは不可能なのでしょうか。
どなたがご教授よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
#1、#2です。
>他のロールオーバーが元に戻るという動作です。
#2の例では、hoverと同じ状態で表示するのにするのにclass="clicked"をセットしているだけです。
スクリプトはクリックの時の処理だけ行なっていますので、上記のクラスをセットするときに他の要素のクラスをリセットしておくという、とてもよくあるパターンでよいのでは?
var t = evt.target || evt.srcElement;
if(t.nodeName!="A") return;
var e, i=0, a = t.parentNode.parentNode.getElementsByTagName("a");
while(e = a[i++]) e.className = e.className.replace(" clicked", "");
t.className = t.className + " clicked";
CSSを変えることで、hoverの状態とclickedの状態を異なったものにすることも可能です。
>リンクをクリックをすると、同ページ内にコンテンツを表示させようとしています
多分、そちらもスクリプトで行なうのではないかと想像しますが、条件分岐や要素の把握などで共通部分が多いと思いますので、同時に処理をしてしまうのがよろしいかと思います。
(↑のコードに1~2行付け加えればすむのではないかと想像します)
>考えを整理するとこうも奇麗でコンパクトなコード
考え方を整理したわけではありません。(何をお考えなのか不明でしたので)
私が勝手に条件を仮定してみただけですので、質問者様の思う条件とは違っている可能性があります。
長期に渡りお付き合い頂いてありがとうございました。
目指している事の第一段階はfujillin様のご教授により、
完成させることができました。
残りのスクリプトに関しては自力でやってみます。
ありがとうございました。
とても感謝しております。
No.4
- 回答日時:
#3です。
見落としてました。
>ご迷惑でなければJavascriptを覚えた経緯などを教えていただければと思います。
>(使用した参考書など。)
ネットの拾い読みで覚えました。
実際にはjavascriptを利用することがないので、なんとなく興味本位から「へ~、こんなことができるんだ」というのが出発点。
ここでの質問と他の方の回答を見るのもとても参考になります。
参考書は読んでいません。サイ本のシリーズが良いらしいということもなんとなくここの情報で覚えましたので、そのうちいつか読んでみるかもしれません。
学びたいという気持ちが最も大事であって、
使用する資料や参考書はたいした問題ではないということですね。
この質問レスはきっと、私以外にも多くの人に役立つ内容だと思います。
ありがとうございました。
では失礼いたします。
No.2
- 回答日時:
#1です。
不明確と書いたのは理由がわからないのではなく、「矛盾していたり処理がどうなるのかわからない」という意味です。
一番些細な質問にだけはお答えいただきましたが、残りは不明のままなのでどうしたいのかわからないままです。
>つまり、最初のロールオーバーイメージを保ちつつ、
>それ以外のロールオーバー機能も動作させ、
もとのご質問文では、2度目からのロールオーバーはないはずなので、ますます混乱します。
>次のリンクをクリックした際に、先ほどの動作が
>次のリンクにも受け継がれる仕組み
No1でも書きましたが、通常はリンクでページ遷移するはずなので、表示中のページは消えるはずです。
>クリッカブルの数が多ければ多いほど、膨大な量の画像が必要になります。
>それを思うと、とても大変ですね
参考サイトの方法は比較的プリミティブな方法なので組合せが多くなれば大変ですね。
結局、何をやりたいのかはわからないままですが、クリック対象部分が矩形であるならばという仮定のもとにエスパー的に想像して…
クリッカブルマップを使わないで、普通のロールオーバーを用いる方法もあるのではという参考例
(やりたいことが不明なので、なんとも言えないけれど、方法はいろいろあるという意味です)
やりたいことを整理して考えてみれば、もっと簡単な方法が見つかるかもしれませんので、一度整理して考えてみることをおすすめします。
(ロールオーバーはCSSで、click処理はスクリプトで行なっています)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja">
<head><title>sample</title>
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<style type="text/css">
#target{
width:500px;
height:300px;
background-image:url(A.jpg); /* マップの画像 */
position:relative;
}
#target ul{
list-style:none;
position:absolute;
bottom:0;
right:0;
}
#target li{
margin:8px;
}
#target li a{
display:block;
width:80px;
padding:5px;
color:#000;
text-align:center;
text-decoration:none;
background-color:#fff;
border:1px solid #aaa;
}
#target li a:hover, #target li a.clicked{
color:#f00;
font-weight:bold;
background-color:#ffa;
border-color:#f00;
}
</style>
<script type="text/javascript">
<!--
function test(evt){
var t = evt.target || evt.srcElement, c = t.className;
if(t.nodeName!="A") return;
if(!c && !c.match(/\bclicked\b/)) t.className = c + " clicked";
}
//-->
</script>
</head>
<body>
<div id="target" onclick="test(event);return false;">
<ul>
<li><a href="#">Area1</a></li>
<li><a href="#">Area2</a></li>
<li><a href="#">Area3</a></li>
</ul>
</div>
</body>
</html>
この回答への補足
ご教授ありがとうございます。
上手く説明できない私ではありますが、
上記コードは私の目指している動作に果てしなく近いです。
>>No1でも書きましたが、通常はリンクでページ遷移するはずなので、表示中のページは消えるはずです。
この点に関してですが、
リンクをクリックをすると、ページ遷移でコンテンツを表示させるのではなく、
同ページ内にコンテンツを表示させようとしています。(フレーム?でしょうか)
ですので、選択したリンクはロールオーバー状態にしておきたかったのです。
http://www.openspc2.org/reibun/javascript/frame/ …
※大分違いますが、同ページ内に表示させるという意味ではこんな感じでしょうか。
更に果てしなく近いという部分に関して、
目指しているもう一つの動作は、他のリンクをクリックすると、他のロールオーバーが元に戻るという動作です。
また、考えを整理するとこうも奇麗でコンパクトなコードが書けるのですね、
とても勉強になります。
私自身、「よくわかるゼロからはじめる」シリーズの参考書などを買って勉強しようと思います。
数回に渡りご教授を頂き、ありがとうございました。
ちなみに、
ご迷惑でなければJavascriptを覚えた経緯などを教えていただければと思います。
(使用した参考書など。)
No.1
- 回答日時:
基本的に可能だと思いますが、質問者様の目的の内容が不明確なのでわかりかねます。
・通常、クリックするとリンク先へ遷移すると思いますが、常にリンクは
キャンセルということでしょうか?それとも、遷移までの間だけ画像が
変わっていればよいということ?
・ページ遷移が起こると3.以降の内容は意味を持ちませんが?
・マウスオン時1.に従えば画像変更、3.に従えば画像は変えない。
(↑)どこか矛盾していませんか?
・些細なことですが、1.で画像変更後、そのままマウスアウトすると
どうなるのか不明。
てなところでよくわからないけれど、単純化して『クリックしたらば画像を変更。リンクは常にキャンセルする。』という機能でよいのでは?
そうであれば、参考サイトのonmouseoverをonclickに変えればほとんど実現できるかと思います。
初期表示の画像が特別で、最初のロールオーバーだけは実現したいのなら、それだけ特別処理としてmouseoverを一回だけ実行するようにしてあげればよさそう。
具体的にはフラグでも設けておいて、実行したらフラグをセット。フラグがセットされていたら実行しないようにするとか。
でも、この初期画像って二度と表示されることがないので、わざわざ特別処理を作らなくても良さそうにも思えますが…
どうでも良いことですが、「ロールオーバー」ってクリックを伴わない動作に使うのではないのかなぁ…
この回答への補足
アドバイスありがとうございます。
>>・些細なことですが、1.で画像変更後、そのままマウスアウトするとどうなるのか不明。
mouseoverの場合は、mouseoutすればロールオーバー前の画像に戻るのがBestです。
また、onclickした場合は、mouseoutしても、他のリンクにmouseoverしても画像はロールオーバーのままがBestです。
ですが、他のリンクにマウスをあわせると、きちんとロールオーバーしてほしいです。
つまり、最初のロールオーバーイメージを保ちつつ、それ以外のロールオーバー機能も動作させ、
尚且つ、次のリンクをクリックした際に、先ほどの動作が次のリンクにも受け継がれる仕組みを目指しています。
目的が不透明だったということで、
もう少し詳しく内容を記したいと思います。
3と4の必要性ですが、
クリックした祭、同ページの下部にコンテンツを表示させます。
そして、マップ上の他のリンクをクリックするごとに、コンテンツ内容を変更させます。
よって、マップ上のクリックされたイメージは、他のリンクをクリックするまではロールオーバー状態を保ちたいというわけです。
※他の質問サイトのアドバイスには
-----------------------------------------
大まかな回答で申し訳ないですが、「onmouseover」で画像を切り替える時に、条件を追加してみては?
現在選択中(onclickした個所)の名前を変数に入れておいて、もし、変数に名前が入っていれば、onmouseoverとonmouseoutを機能させない。(画像を差し替えない)
また、変数に名前が入っていなければ、通常通りonmouseoverとonmouseoutを機能させる。
-----------------------------------------
とありました、
これにのっとって色々ググってみましたが、
素人であるわたしには具体的な追加方法がわかりませんでした。
お力添えよろしくお願いいたします。
※他の質問サイトのアドバイスには
-----------------------------------------
大まかな回答で申し訳ないですが、「onmouseover」で画像を切り替える時に、条件を追加してみては?
現在選択中(onclickした個所)の名前を変数に入れておいて、もし、変数に名前が入っていれば、onmouseoverとonmouseoutを機能させない。(画像を差し替えない)
また、変数に名前が入っていなければ、通常通りonmouseoverとonmouseoutを機能させる。
-----------------------------------------
とありました、
これにのっとって色々ググってみましたが、
素人であるわたしには具体的な追加方法がわかりませんでした。
これに関しては、質問元のアドバイザー様のHELPにより解決いたしました。
残すところ問題は1つです。
1つのクリッカブルをクリックした時のロールオーバー状態は維持できたものの、
他のクリッカブルにマウスを合わせた祭の、ロールオーバーができません。
つまり、最初以降はクリックしないとロールオーバー状態になりなくなってしまったわけです。
これを回避するためには、1つの動作にもう一つ条件と画像を追加する形になるのだと思います。
もう一つの画像とは、複数箇所ロールオーバー状態になっている画像のことです。
しかしそうなると、クリッカブルの数が多ければ多いほど、膨大な量の画像が必要になります。
それを思うと、とても大変ですね。
しかし、具体的な書き方がわかりません。
お手数をお掛けしますが、お力添えよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 債券・証券 年末に来る証券会社からのNISAロールオーバー申込みについて 4 2022/11/12 08:01
- 日本株 NISA口座から特定口座への移管 2 2022/09/13 22:27
- 株式市場・株価 来年の新NISAまで待った方がいいの? 4 2023/03/09 07:58
- 不動産投資・投資信託 NISAのロールオーバーについて 1 2022/11/24 13:37
- その他(資産運用・投資) NISAについて教えて頂きたいです。 一般NISAは期間が5年となっていますが、その5年になると翌年 4 2023/01/26 22:12
- 債券・証券 外貨建てMMFの質問です 1 2023/08/05 11:28
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- その他(資産運用・投資) 新NISAがある今、現行積み立てNISAを始める意義 4 2022/12/29 14:37
- その他(資産運用・投資) 新NISAについて教えてください 2 2023/05/17 12:57
- 先物取引 日本国債先物のCFD取引について 1 2023/08/04 18:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Gifアニメ、最後のコマに行った...
-
iframe内のリンク文字のマウス...
-
重なった画像にクリックイベン...
-
lightbox2をiframeから外に表示...
-
画像の重なりの順序を代える方...
-
image.onload = .. の後に imag...
-
画像ランダム表示、しかしダブ...
-
ページ読込中に表示が崩れるの...
-
HTMLで条件分岐はできますか?
-
スワップイメージが上手く動作...
-
jQuery bxSlider 画像に変更
-
ターゲットを_blankにするには。
-
MAX関数を使ってからLEFT JOIN...
-
embed要素のsrc属性の値を変更...
-
javascriptテキストBOX色を元に...
-
複数のバナーをリロードする度...
-
onmouseoverの表示切り替えが上...
-
onclickで画面が固まる・・・ら...
-
チェックボックスに入っている...
-
JavaScriptで変更した属性の元...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javascript で共通の処理をどこ...
-
Javascriptで指定した日付と時...
-
textareaに画像を表示したい
-
Gifアニメ、最後のコマに行った...
-
1枚の画像をクリックして複数の...
-
画像ランダム表示、しかしダブ...
-
スライダーを実装した場合、ペ...
-
1枚の画像をクリックすると複数...
-
HTMLで条件分岐はできますか?
-
JavaScript スライドの画像にリ...
-
オンマウスで、画像切り替え+...
-
画像の重なりの順序を代える方...
-
JavaScriptとチェックボックス...
-
透過pngの透明部分以外をクリッ...
-
画像をドラッグ&ドロップで移...
-
各フォルダから1枚ずつ画像をラ...
-
jQueryで特定のURLの時のみ表示
-
bxsliderにて読み込み後に内容...
-
prettyphotoの画像表示について
-
WEBページ立ち上げ時に1回のみ...
おすすめ情報