- 締切済み
img 上の任意の座標範囲の色を変えたい
img タグで読み込んだ画像上に、map/area 属性を付加した以下のような HTMLがあります。coords で指定された座標範囲に対して透明度30% 程度の オーバーレイを掛けたいと考えています。 CSSとJavascriptでこのような効果を与えることは可能でしょうか。 <map name="map"> <area shape="rect" coords="0,0,100,100" href="url1"> </map> <img SRC="gif" BORDER=0 usemap="#map" height=100 width=200> 本当は、画像そのものに色をつけてしまうべきなのですが、 表示するたびにオーバーレイする座標が変わってしまうため、 画像を再作成する負荷を減らすためにCSS とJavascriptで対応したいです。 よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- ai10
- ベストアンサー率27% (3/11)
あ…オーバーレイでしたね…。 まぁ、要は、あらかじめオーバーレイした画像を作って gazou40.gifとして保存すればOKなわけで…。
- ai10
- ベストアンサー率27% (3/11)
ごめん、 **** css **** div.main {... } を .main { ... } のように、divをなくしたってください。
- ai10
- ベストアンサー率27% (3/11)
まず、mapタグのname属性は廃止予定なのでidも一緒に書いておくこと。 透明度は一定ならば、 だいたいのブラウザで表示できるようなものは作れるでしょう。 しかし、透明度が一定でない(表示するたびに変わるなど)場合は IEはフィルタを利用して可能、 Gekko1.8(?)以上なら可能、 その他のブラウザでは無理だと思う。 --------------------------------------------------------- 透明度が決まっている場合の案として、 まず、画像を3つ作成しておく。 透明度を40%と決めておく。 [1] 透明の1x1サイズのgif (toumei.gif) [2] 元画像 (gazou.gif) [3] 透明度40%の画像 (gazou40.gif) 申し訳ないが、動作確認は一切していないです。 **** css **** div.main { position : relative; width : 100px; height : 200px; } .absolute { position : absolute; left : 0px; top : 0px; } .hidden { width : 0px; height : 0px; overflow : hidden; } **** html **** <div class='main'> <img src='gazou.gif' width='100' height='200' class='main absolute> <div class='absolute hidden'> <img src='gazou40.gif' width='100' height='200' class='absolute'> </div> <img src='toumei.gif' width='100' height='200' class='absolute' border='0' usemap='#map'> <map id='map' name="map"> <area shape="rect" coords="0,0,0,0" href="url1"> </map> </div> **** javascript **** // 以下の関数は、firefoxなど用 function getChildNode( parentNode, idx ) { var obj = parentNode.childNodes[idx]; while( obj.nodeType==3 ) obj.nextSibling; return obj; } function getNextNode( node ) { var obj = node.nextSibling; while( obj.nodeType==3 ) obj.nextSibling; return obj; } function getPrevNode ( node ) { var obj = node.previousSibling; while( obj.nodeType==3 ) obj.previousSibling; return obj; } // エリア(x,y,width,height)の部分を透明にする。 function setTransparentArea ( x, y, width, height ) { var map, area, div, img; map = document.getElementById( 'map' ); area = getChildNode( map, 0 ); area.setAttribute( 'coords', ''+x+','+y+','+width+','+height ); div = getPrevNode( getPrevNode( map ) ); div.style.left = x + 'px'; div.style.top = y + 'px'; div.style.width = width + 'px'; div.style.height = height + 'px'; img = getChildNode( div, 0 ); img.style.left = (-x) + 'px'; img.style.top = (-y) + 'px'; map = area = div = img = x = y = width = height = null; } // たとえば onload 時なら window.onload = function () { setTransparentArea( 0, 0, 100, 100 ); } とか。 できれば、window.onload じゃなく //@cc_on window./*@if (@_jscript) attachEvent( 'on'+ @else@*/ addEventListener( /*@end@*/ 'load', function () { setTransparentArea( 0, 0, 100, 100 ); }, false ); としよう。window.onload の部分が長くなっただけだ。
お礼
回答をいただいてから時間がたってしまい、すみません。 書いてもらった回答を元にいろいろ試行錯誤しました。 area タグのcoords 属性から「画像上のどこのエリアの色を変えるべきか」 判断できるため、これをプログラムで計算して、divタグのCSSインライン に書き込みしました。 最終的には、Javascriptではなくサーバサイドのプログラミングに なってしまいました。この方法はHTMLファイルを動的作成するだけなので、 画像を再作成するよりはコストが少ないかなぁ、と思いました。 ありがとうございます。
お礼
画像上に、別画像をオーバレイできるとは、知りませんでした。 透過アイコンなどを重ねて、元の画像上にいろいろ情報を 付加することができそうです。現在いろいろ試行しています。 ありがとうございます。