マウスの位置によって表示位置を変えるツールチップをjsとCSSで実装する
目標
- javascript + CSS でツールチップ機能を実装する
- 画面の端の方にマウスが来てもツールチップが隠れないようにする
- 画面の端の方にマウスが来てもツールチップに重ならないようにする
前フリ
考え方
コード
<html> <style> <!--ツールチップの見た目--> span#tooltip{ position: absolute; <!--座標で表示位置を直接コントロールできるようにする--> z-index: 10; <!--他の要素より前に表示されるように--> visibility: hidden; <!--最初は隠しておく--> padding: 0 5px; background-color: #FFF; } <!--ツールチップを表示させる部分の見た目。わかればなんでもいい--> div { background: #abcdef; width:300px; height:300px; } </style> <html> <style> span#tooltip{ position: absolute; z-index: 10; visibility: hidden; padding: 0 5px; background-color: #FFF; } div { background: #abcdef; width:300px; height:300px; } </style> <body> <span id="tooltip">hoge</span> <div onmousemove="move()" onmouseover="over()" onmouseout="out()"></div> <br> <br> <div onmousemove="move()" onmouseover="over()" onmouseout="out()"></div> <script type="text/javascript"> function over() { var tooltip = document.getElementById("tooltip"); tooltip.style.visibility = "visible"; } function out() { var tooltip = document.getElementById("tooltip"); tooltip.style.visibility = "hidden"; } function move(){ var tooltip = document.getElementById("tooltip") //前々回のバージョン:特にマウス位置は考慮しない //var xPos = event.pageX + 10; //var yPos = event.pageY - 10; //前回のバージョン:ツールチップが隠れてしまわないように適切な座標を選択する var xPos = Math.min(event.pageX + 10, window.pageXOffset + window.innerWidth - tooltip.getBoundingClientRect().width - 10); var yPos = Math.min(event.pageY - 20, window.pageYOffset + window.innerHeight - tooltip.getBoundingClientRect().height -20); var xPos = 0; if(event.pageX < window.innerWidth/2) //マウスカーソル位置が画面の左半分側かどうか { xPos = event.pageX + 10; //左半分にいたらカーソル位置の右側にツールチップを表示 } else { xPos = event.pageX - tooltip.getBoundingClientRect().width - 10; //右側にいたらカーソルの右側にツールチップを表示 } var yPos = 0; if(event.pageY < window.innerHeight/2) //マウスカーソル位置が画面の上半分かどうか { yPos = event.pageY + 10 //上半分にいたらカーソル位置の下にツールチップを表示 } else { yPos = event.pageY - tooltip.getBoundingClientRect().height - 10; //下半分にいたらカーソル位置の上にツールチップを表示 } tooltip.style.top = yPos + "px"; tooltip.style.left = xPos + "px"; tooltip.innerHTML = "xPos:" + xPos + "<br/>" + "yPos:" + yPos; } </script> </body> </html>
問題点
ツールチップの内容が、画面サイズに対して一定以上大きい場合、結局ツールチップが隠れたり、重なってしまったりする問題は起きうる
ただ、これ以上はツールチップの位置よりも中身や表示サイズなどを工夫したほうが良さそう