右を指す単純な矢印記号をレンダリングするこの HTML があります。
<!DOCTYPE html>
<html>
<head>
<style>
div { width: 0px; height: 0px; border-left: 20px solid black; border-top: 20px solid transparent; border-bottom: 20px solid transparent; border-right: 20px solid transparent; position: absolute; left: 35px; top: 53px; cursor: pointer; }
</style>
<body>
<div></div>
</body>
</html>
ホバーすると、カーソルがポインタに変わります。しかし、それは実際には正方形div
であるため、 の周囲内で矢印のすぐ外側にいる場合でも、カーソルはポインターに変わりますdiv
。
そこで、マウスがその矢印の上にあるときにのみカーソルがポインターに変わるように、このJavascriptの追加を書きました。この目的のために、Firebug から三角形の 3 つの頂点の座標を計算しました ( (35,53)
、(55,73)
、(35,93)
上から時計回り)。次に、問題の点がこれらの 3 つの頂点によって形成される三角形の内側にあるかどうかを確認します。これは、各エッジの点と反対側の頂点がそのエッジの同じ側にあるかどうかを確認することによって行います (もしそうであれば、その点の座標を と に代入して得られた値の積x
はy
、ポジティブ)。
<!DOCTYPE html>
<html>
<head>
<style>
div { width: 0px; height: 0px; border-left: 20px solid black; border-top: 20px solid transparent; border-bottom: 20px solid transparent; border-right: 20px solid transparent; position: absolute; left: 35px; top: 53px; }
.hoverclass { cursor: pointer; }
</style>
<script src="jquery.js">
</script>
<script>
$(document).ready(function(){
$("div").click(function(e) { alert(e.pageX + " " + e.pageY); });
function l1(x,y) { return y - x - 18; }
function l2(x,y) { return x+y-128; }
function l3(x,y) { return x-35; }
$("div").hover(function(e) {
var x = e.pageX;
var y = e.pageY;
if (l1(x,y)*l1(35,93) >= 0 && l1(x,y)*l1(35,93) >= 0 && l1(x,y)*l1(35,93) >= 0 ) {
$(this).addClass('hoverclass');
}
else { $(this).removeClass('hoverclass'); }
},
function() {
$(this).removeClass('hoverclass');
});
});
</script>
<body>
<div></div>
</body>
</html>
ただし、結果は予測できません。カーソルが三角形の内側だけでポインターを変えることもあれば、(以前と同じように) 外側も変えることもあれば、まったく動かないこともあります。hover
これはおそらく、スクリプトが一時的にハングしている可能性がある、時間外に機能する機能によるものだと思われます。これを達成する他の方法はありますか?