areaタグの位置をoffset()でうまく取得できない

areaタグの位置をjQueryのoffset()で取得しようとしたところ、IEでは取得できたのですが、FirefoxとGoogle Chromeでうまく取得できなかったので、対応方法をメモしておきます。

サンプルコード

うまく取得できなかった場合のコードです。

HTML

<div class="map-box">
	<img src="image.jpg" alt="" width="481" height="360" usemap="#map" />
	<map name="map">
		<area shape="poly" coords="253,131,284,158,318,178,341,251,338,282,327,276,328,291,305,292,296,276,281,279,265,300,248,298,272,279,250,266,236,243,236,203,241,194,228,163,213,151,223,151,251,132" href="#" class="area">
		<area shape="poly" coords="0,325,481,270,481,360,0,360" href="#" class="area">
	</map>
</div>

JavaScript

$(function() {
	$('.area').hover(function() {
		console.log('over', $(this).offset().top);
	}, function() {
		console.log('out');
	});
});

IEではそれぞれのareaのtopの座標(131と270)が取得できましたが、chromeとFirefoxでは0が返ってきました。
areaタグの位置をoffset()で取得するデモページ
 

areaタグのcoordsの値を取得して、そこからtopとleftの値を決めることで対応できそうです。

JavaScript

$(function() {
	$('.area').hover(function() {
		var coords = $(this).attr('coords').split(',');
		console.log('over', coords);

		var thisLeft = coords[0];
		var thisTop = coords[1];
		for (var i = 0; i < coords.length; i++) {
			if(i % 2 == 0) {
				thisLeft = Math.min(thisLeft, coords[i]);
			} else {
				thisTop = Math.min(thisTop, coords[i]);
			}
		}
		console.log('left', thisLeft, 'top', thisTop);
	}, function() {
		console.log('out');
	});
});

対応後のデモページ
ただし、coordsの値はimg上の座標になるので、ページ全体の座標を取得したい場合、imgタグの座標をoffset()で取得してから足す必要があります。
 

【参考サイト】

 

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2024年10月
 12345
6789101112
13141516171819
20212223242526
2728293031