プロが教える店舗&オフィスのセキュリティ対策術

HTMLで数点詰まってしまった所がございましたので、ご教示いただける方がいらっしゃいましたら、よろしくお願いします。

【やりたいこと】
1. 「ここは1行目です。」というテキストと画像にリンクが貼ってあります。
そのどちらかにマウスを重ねた際、下記の3つを同時に変更したいのですが可能でしょうか?
1-1. 画像を変更する。
1-2. 「ここは1行目です。」の文字色を変更する。
1-3. 「ここは1行目です。」のtdの背景色を変更する。
今の所、1-1, 1-2はそれぞれの上にマウスを重ねると動作します。
1-3は上にマウスを重ねると文字の後ろのみ(tdの後ろではありません)背景が変わります。
ただしどれも連動はしていません。

2. 1-3の関連となりますが、現在、画像とテキストにリンクを貼っていますが、そうではなく列(またはテーブル)自体にリンクを貼る(リンクを1つにまとめる)ことは可能でしょうか?
tableやtrにリンクを貼っても動作しなかったのですが、何か代替案があればご教示いただければと思います。


【ソースコード】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>title</title>
<style type="text/css">
<!--
.text_link a {
display: block;
}
.text_link a:hover {
color:#33FF66;
background-color:#CCFFFF;
}
-->
</style>
<script type="text/JavaScript">
<!--
function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
//-->
</script>
</head>
<body onload="MM_preloadImages('images/5.jpg')">
<table border="0" cellspacing="0" cellpadding="0" width="300">
<tr>
<td width="1" valign="middle"><a href="index1.html" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image3','','images/5.jpg',1)"><img src="images/1.jpg" name="Image3" width="80" height="60" border="0" id="Image3" /></a></td>
<td valign="middle" class="text_link"><a href="index1.html">ここは1行目です。</a></td>
</tr>
</table>
</body>
</html>


【使用ファイル】
index.html(上記ソース)
images/1.jpg(任意の画像)
images/5.jpg(任意の画像)

どこか一箇所でもご教示いただけるようでしたら、ご教示いただければと思います。
以上、よろしくお願いします。

A 回答 (12件中11~12件)

単純に「回り込み」を指定すれば良いのでは?



<img src="" alt="" title="" width="" height="" style="float:#;" />文字列・・・・<br style="clear:#;" />
#には以下の値を代入。
inherit…継承
none…指定無し
left…左を解除
right…右を解除
both…両側を解除

この回答への補足

回答2の「この回答へのお礼」の続きとなります。

【ソースコード】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>title</title>
<style type="text/css">
<!--
.middle {
vertical-align:middle;
}
a.hoge {
display: block;
}
a.hoge:hover {
color:#3f6;
background-color:#cff;
}
.text_link a {
display: block;
}
.text_link a:hover {
color:#33FF66;
background-color:#CCFFFF;
}
-->
</style>
<script type="text/JavaScript">
<!--
function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_swapImage() { //v3.0
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
//-->
</script>
</head>
<body onload="MM_preloadImages('images/5.jpg','images/3.jpg','images/6.jpg')">
<table border="0" cellspacing="0" cellpadding="0" width="300">
<tr>
<td class="text_link"><a href="index3.html" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image4','','images/6.jpg',1)"><img src="images/4.jpg" name="Image4" width="100" height="70" border="0" id="Image4" style="float:left" />CSSとfloatを使用したバージョン<br style="clear:both" /></a></td>
</tr>
</table>
<br />
<table border="0" cellspacing="0" cellpadding="0" width="300">
<tr>
<td class="text_link"><a href="index.html" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image2','','images/3.jpg',1)"><img src="images/2.jpg" name="Image2" width="80" height="60" border="0" id="Image2" class="middle" />CSSを使用したバージョンです。長い文字になると・・・</a></td>
</tr>
</table>
<br />
<table border="0" cellspacing="0" cellpadding="0" width="300">
<tr>
<td width="1" valign="middle" class="text_link"><a href="index1.html" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image3','','images/5.jpg',1)"><img src="images/1.jpg" name="Image3" width="80" height="60" border="0" id="Image3" /></a></td>
<td valign="middle" class="text_link"><a href="index1.html">tableレイアウトバージョンです。長い文字になると・・・</a></td>
</tr>
</table>
</body>
</html>


【使用ファイル】
index.html(上記ソース)
images/1.jpg(任意の画像)
images/2.jpg(任意の画像)
images/3.jpg(任意の画像)
images/4.jpg(任意の画像)
images/5.jpg(任意の画像)
images/6.jpg(任意の画像)

以上、よろしくお願いします。

補足日時:2008/07/06 15:23
    • good
    • 0
この回答へのお礼

ありがとうございます。
教えていただいたfloatを試してみた所、回答1の補足のテキストが複数行ある場合に、2行目が画像の下に回りこんでしまう現象が解決いたしました。

しかし他の問題が出てしまいました。
1. 文字が上揃えになってしまいました。
2. マウスを重ねると文字の上の背景しか変わらなくなりました。

http://okwave.jp/qa1171659.htmlの書き込みを見ると、floatを使用すると、vertical-align:middle;が無効化されているように読み取れましたが、これを解決する方法はあるのでしょうか?

※なお文字数制限の関係上、続きは「この回答への補足」に投稿させていただきます。

お礼日時:2008/07/06 15:22

> tableやtrにリンクを貼っても動作しなかったのですが、



リンク<a>はインライン要素ですので、「tableやtrに」に適用する事はできません。
サンプルの様に、

<tr>
<td><a href="index1.html"><img></a></td>
<td><a href="index1.html">テキスト</a></td>
</tr>

という構造のままだとご希望をかなえるにはJavaScriptを追加修正するのが手っ取り早いかと思いますが、どうしてもこういう構造(画像とテキストをセルに分けて横並びにする)でなければいけませんか?仮に:

<tr>
<td><a href="index1.html"><img>テキスト</a></td>
</tr>

という構造で良いのであれば問題はCSSで一気解決するのですが。下記は大雑把な一例です。<img>に対するロールオーバーのJavaScriptはそのまま流用するとします。
※ただし<td>のpaddingが0の場合に限ります。
【CSS】
a.hoge {
display: block;
}
a.hoge:hover {
color:#3f6;
background-color:#cff;
}
【HTML】
<tr>
<td><a href="index1.html" (省略) class="hoge"><img (省略)>テキスト</a></td>
</tr>

a.hogeで<a (省略) class="hoge">をブロック要素化しているので、リンクの領域が<td>のセル内全体となり、<td>のどこにマウスを置いても前景色(テキストリンクの色)と背景色(テキストリンクの背景色だが表示上はセル全体となる)が同時に切り替わります。CSSを工夫すればその他のスタイルの微調整(例えば画像とテキストの間の余白・位置など)も可能です。

どうしても現在の様に<tr><td><a><img></a></td><td><a>テキスト</a></td></tr>という構造を保たねばならないのであれば、<tr>に対して疑似要素":hover"を適用する方法もありますが、残念ながらIE6では疑似要素":hover"が<a>に対してしか適用されないのでそれをどうにかする為にはやはりJavaScriptの併用が必要となります。

この回答への補足

ありがとうございます。
リンクがtableやtrに適用出来ない件、了解いたしました。

それと現在の構造を維持する必要はありません。
そして教えていただいた記述を元にCSSで組み直したところ、今回質問させていただいた内容はすべて解決いたしました。

しかし他の問題が出てしまいました。
テキストが複数行の場合、2行目が画像の下に回りこんでしまいます。
テーブルレイアウトの場合は、td内で改行されていたのですが。

http://oshiete1.goo.ne.jp/qa2016072.htmlの書き込みを見ると、複数行のテキストを動作させるのは難しいように読み取れましたが、これを解決する方法はあるのでしょうか?


【ソースコード】
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>title</title>
<style type="text/css">
<!--
.middle {
vertical-align:middle;
}
a.hoge {
display: block;
}
a.hoge:hover {
color:#3f6;
background-color:#cff;
}
.text_link a {
display: block;
}
.text_link a:hover {
color:#33FF66;
background-color:#CCFFFF;
}
-->
</style>
<script type="text/JavaScript">
<!--
function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
//-->
</script>
</head>
<body onload="MM_preloadImages('images/5.jpg','images/3.jpg')">
<table border="0" cellspacing="0" cellpadding="0" width="300">
<tr>
<td class="text_link"><a href="index.html" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image2','','images/3.jpg',1)"><img src="images/2.jpg" name="Image2" width="80" height="60" border="0" id="Image2" class="middle" />CSSを使用したバージョンです。長い文字になると・・・</a></td>
</tr>
</table>
<br />
<table border="0" cellspacing="0" cellpadding="0" width="300">
<tr>
<td width="1" valign="middle" class="text_link"><a href="index1.html" onmouseout="MM_swapImgRestore()" onmouseover="MM_swapImage('Image3','','images/5.jpg',1)"><img src="images/1.jpg" name="Image3" width="80" height="60" border="0" id="Image3" /></a></td>
<td valign="middle" class="text_link"><a href="index1.html">tableレイアウトバージョンです。長い文字になると・・・</a></td>
</tr>
</table>
</body>
</html>


【使用ファイル】
index.html(上記ソース)
images/1.jpg(任意の画像)
images/2.jpg(任意の画像)
images/3.jpg(任意の画像)
images/5.jpg(任意の画像)

以上、よろしくお願いします。

※なお文字数制限の関係上、「この回答へのお礼」ではなく、「この回答への補足」に投稿させていただきました。

補足日時:2008/07/06 13:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!