• ベストアンサー

画像のロールオーバー

画像のロールオーバーで下記のスクリプトを教えてもらいました。 画像aをマウスオーバーで画像a2に変わる クリックでオーバーした状態を保持(画像a2のまま) さらに、画像bをマウスオーバーで画像b2に変わり クリックでオーバーした状態を保持(画像b2のまま) そのクリック時、画像a2が画像aに変わる 実装できたのですが。 下記のソース2つテーブルが1つのhtml上にあり a~fまでg~iまで画像が分かれていて a~fをクリックし画像が変わった後 g~iをクリックするとa~fの画像が変わらないようにしたいのです。 二つのテーブルの画像を別々に考えたいのですが、できますでしょうか? よろしくお願いします。 <html> <head> <style type="text/css"> <!-- img.group {width: 111px; height:50px;} --> </style> <script type="text/javascript"><!-- var img=['a.jpg,a2.jpg','b.jpg,b2.jpg','c.jpg,c2.jpg','d.jpg,d2.jpg','e.jpg,e2.jpg','f.jpg,f2.jpg','g.jpg,g2.jpg','h.jpg,h2.jpg','i.jpg,i2.jpg']; var elm=[]; var o_idx=-1; window.onload=function(){ var e=document.getElementsByTagName('IMG'); for (var i=0,j=0; i<e.length; i++) if (e[i].className=='group1') elm[j++]=e[i]; for (i=0; i<elm.length; i++){ elm[i].onmouseover=change(i,1); elm[i].onmouseout=change(i,0); elm[i].onclick=change(i,2); } } function change(idx,n){ return function(){ if (n > 1){ if (o_idx > -1) elm[o_idx].src=img[o_idx].split(',')[0]; elm[idx].src=img[idx].split(',')[1]; o_idx=idx; } else { if (idx != o_idx) elm[idx].src=img[idx].split(',')[n]; } };} // --></script> </head> <body> <table width="676" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="111"><img src="a.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="b.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="c.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="d.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="e.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="f.jpg" width="111" height="50" border="0" class="group1"></td> </tr> </table> <br> <table width="333" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="111"><img src="g.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="h.jpg" width="111" height="50" border="0" class="group1"></td> <td width="2"></td> <td width="111"><img src="i.jpg" width="111" height="50" border="0" class="group1"></td> </tr> </table> </body> </html>

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

前回は動作内容が不明だったので、推測で作りましたが… 画像のペアが「c.jpg,c2.jpg」のように2がつくものがペアだという規則性があるなら、わざわざ最初に定義する必要はありませんね。 (ローカルで動かすとsrcがフルパスでfile://localhost~みたいな場合、正しく解釈しないブラウザがありますが、サーバにUPすれば動作すると思います。) ついでですが、同じスタイルのものはまとめて定義しておいたほうが、HTMLが見やすくなるし、後の修正も楽になるのでは? <html> <head> <style type="text/css"> <!-- table {border:0; border-collapse: collapse; padding:0;} tr, td {margin:0; padding:0;} .group1, .group2 {width:111px; height:50px; border:0; margin:0 1px;} --> </style> <script type="text/javascript"> <!-- var elm=[]; var o_idx=[]; var img=[]; window.onload=function(){ var e=document.getElementsByTagName('IMG'); for (var i=0,j=0; i<e.length; i++){ if (e[i].className && e[i].className.substr(0,5)=='group'){ var num=e[i].className.substr(5); if (num=='') num='none'; if (!isNaN(num)) {o_idx[parseInt(num)]=-1; img[j]=e[i].src; elm[j++]=e[i];} };} for (i=0; i<elm.length; i++){ elm[i].onmouseover=change(i,1); elm[i].onmouseout=change(i,0); elm[i].onclick=change(i,2); } } function change(idx,n){ return function(){ var num=parseInt(elm[idx].className.substr(5)); var m1=img[idx].replace(/\.[A-Z0-9]{2,4}$/i,'2') + RegExp.lastMatch; if (n > 1){ if (o_idx[num] > -1) elm[o_idx[num]].src=img[o_idx[num]]; elm[idx].src=m1; o_idx[num]=idx; } else { if (idx != o_idx[num]) elm[idx].src=n?m1:img[idx]; } };} // --> </script> </head> <body> <table><tr> <td><img src="a.jpg" class="group1"></td> <td><img src="b.jpg" class="group1"></td> <td><img src="c.jpg" class="group1"></td> <td><img src="d.jpg" class="group1"></td> <td><img src="e.jpg" class="group1"></td> <td><img src="f.jpg" class="group1"></td> </tr></table> <br> <table><tr> <td><img src="g.jpg" class="group2"></td> <td><img src="h.jpg" class="group2"></td> <td><img src="i.jpg" class="group2"></td> </tr></table> </body> </html>

testid
質問者

お礼

がんばってこのように作ったんですが 一応動作しました。ただ、ソースが汚いですよね? ありがとうございました。参考にさせていただきます。 <style type="text/css"> <!-- img.group {width: 111px; height:50px;} --> <!-- img.grape {width: 111px; height:50px;} --> </style> var img=['ここに画像をいっぱい並べる']; var elm=[]; var o_idx=-1; var img2=['ここに画像をいっぱい並べる']; var elm2=[]; var o_idx2=-1; window.onload=function(){ var e=document.getElementsByTagName('IMG'); for (var i=0,j=0,k=0; i<e.length; i++) { if (e[i].className=='group1'){ elm[j++] =e[i];} else if (e[i].className=='grape1'){ elm2[k++]=e[i];} } for (i=0; i<elm.length; i++){ elm[i].onmouseover=change(i,1); elm[i].onmouseout=change(i,0); elm[i].onclick=change(i,2); } for (j=0; j<elm2.length; j++){ elm2[j].onmouseover=change2(j,1); elm2[j].onmouseout=change2(j,0); elm2[j].onclick=change2(j,2); } } function change(idx,n){ return function(){ if (n > 1){ if (o_idx > -1){elm[o_idx].src=img[o_idx].split(',')[0];} elm[idx].src=img[idx].split(',')[1]; o_idx=idx; }else{ if (idx != o_idx){elm[idx].src=img[idx].split(',')[n];} } } } function change2(idx2,n2){ //alert(elm.length);//警告文を出す()の中身を出力()内には""を使用しない return function(){ if (n2 > 1){ if (o_idx2 > -1){elm2[o_idx2].src=img2[o_idx2].split(',')[0];} elm2[idx2].src=img2[idx2].split(',')[1]; o_idx2=idx2; }else{ if (idx2 != o_idx2){ elm2[idx2].src=img2[idx2].split(',')[n2];} } } }

その他の回答 (2)

noname#84373
noname#84373
回答No.2

以下はゴミでした .imglist { list-style-type:none; margin:0px; padding:0px;} .imglist li { display:inline; margin:0px; padding:0px;line-height:normal;} .imglist li img { margin:0px; padding:0px; filter:'Alpha(opacity=100)'; opacity:1; } 削除してください。

noname#84373
noname#84373
回答No.1

まったく毛色がちがいますが・・。どうでしょう? <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>サンプル</title> <style> #ps0 { background-color:#200; } #ps1 { background-color:#002; } .imglist { list-style-type:none; margin:0px; padding:0px;} .imglist li { display:inline; margin:0px; padding:0px;line-height:normal;} .imglist li img { margin:0px; padding:0px; filter:'Alpha(opacity=100)'; opacity:1; } </style> <body> <br> <div id="ps0">  <img src="./img/0.gif" width="111" height="50" alt="p0" class="hov">  <img src="./img/1.gif" width="111" height="50" alt="p1" class="hov">  <img src="./img/2.gif" width="111" height="50" alt="p2" class="hov">  <img src="./img/3.gif" width="111" height="50" alt="p3" class="hov">  <img src="./img/4.gif" width="111" height="50" alt="p4" class="hov">  <img src="./img/5.gif" width="111" height="50" alt="p5" class="hov"> </div> <div id="ps1">  <img src="./img/0.gif" width="111" height="50" alt="q0" class="hov">  <img src="./img/1.gif" width="111" height="50" alt="q1" class="hov">  <img src="./img/2.gif" width="111" height="50" alt="q2" class="hov">  <img src="./img/3.gif" width="111" height="50" alt="q3" class="hov">  <img src="./img/4.gif" width="111" height="50" alt="q4" class="hov">  <img src="./img/5.gif" width="111" height="50" alt="q5" class="hov"> </div> <script type="text/javascript"> //@cc_on; //全角空白は半角にでも /*@if(1)attachEvent('on'+ @else@*/addEventListener(/*@end@*/'load', function(){  var rr0 = new RegExp('\\b'+'hov'+'\\b');  var mm0;  document./*@if(1)attachEvent('on'+ @else@*/addEventListener(/*@end@*/'mouseover', function (evt) {   var o = evt./*@if(@_jscript) srcElement @else@*/ target /*@end@*/;   if (mm0) { setOpacity.call(mm0.style, 100); m = null; }   if (o.className && o.className.match(rr0)) {mm0 = o; setOpacity.call(mm0.style, 60);}  }, false);  function setOpacity(opacity) {   /*@if (@_jscript)    this.filter = 'Alpha(opacity=' + opacity + ')';   @else@*/    this.opacity = opacity / 100;   /*@end@*/  }  function MemoryClicker() {   this.init.apply(this,arguments);  }    MemoryClicker.prototype.init = function(groupId, tagname, bgcol, alpha) {   var n = document.createElement('div');   var s = n.style;      this.gParent = document.getElementById(groupId);   this.tagname = tagname.toUpperCase();   this.memory = null;      setOpacity.call(s, alpha);   s.backgroundColor = bgcol;   s.position = 'absolute';   s.display = 'none';   this.screen = document.body.appendChild(n);   document./*@if(1)attachEvent('on'+ @else@*/addEventListener(/*@end@*/'click',    (function (cb_){ return function(evt){ cb_.checker(evt);};})(this), false);  };    MemoryClicker.prototype.checker = function (evt) {   var o = evt./*@if(@_jscript) srcElement @else@*/ target /*@end@*/;   var p = (function(o, p){ return o ? o == p ? o: arguments.callee(o.parentNode,p): null;})(o, this.gParent);   if(!p) return;   if (this.memory) { this.screen.style.display = 'none'; this.memory = null; }   if (o.tagName != this.tagname) return;   with(this.screen.style) {    top = getOffsetPosition(o,'Top') + 'px';    left = getOffsetPosition(o,'Left') + 'px';    width = o.offsetWidth + 'px';    height = o.offsetHeight + 'px';    display = 'block';   }   return this.memory = o;   function getOffsetPosition(element, par){    var ret = 0;    while (element) { ret += element['offset'+par]|0; element = element.offsetParent; }    return ret;   }  };    new MemoryClicker('ps0', 'img', 'red', 20);  new MemoryClicker('ps1', 'img', 'blue', 20); }, false); </script>

testid
質問者

お礼

ありがとうございました! なんとか自力でできました。 でもソースが汚かったり、もっと整理できたりできるみたいでした>< 回答ありがとうございます。

関連するQ&A