Принцип работы всплывающей подсказки

Статью будет интересно прочитать как новичкам в работе с JavaScript, так и более или менее продвинутым в этом вопросе людям. Ее цель - ознакомление читателя с принципом работы JavaScript-подсказки. В конце статьи есть краткое описание всех объектов, событий и свойств, используемых в скрипте.

В начале ознакомления с HTML создается впечатление, что в нем всего достаточно, а где-то есть даже что-то лишнее. Но по мере накопления знаний и опыта начинают возникать вопросы, ответов на которые в учебниках нет. Один из таких вопросов звучит примерно так: "а как бы украсить всплывающую подсказку?".

Иногда возникают такие ситуации, что без всплывающей подсказки никак не обойтись, а стандартные alt и title не вписываются в дизайн сайта. Как раз в таких ситуациях спасают подсказки, написанные на JavaScript.

Итак, как реализуется такая подсказка?

Для на чала необходимо понять, что такое JavaScript-подсказка. А это всего навсего блок html-кода, который двигается за курсором мыши средствами JavaScript. Один из вариантов организации такого блока - использование тега <div>. Например:
<div id="myalt" style="visibility:hidden; position:absolute; left:0; top:0; border-style:solid; border-color:'#000000'; border-width:1px; width:400px; height:10px; background-color:'#f5f5f5'; padding:3px; z-Index:3"></div>

Параметр visibility установлен в hidden, т.к. изначально подсказка должна быть скрыта. Ширина этого блока 400 пикселей, а высота меняется в зависимости от содержимого и не меньше 10 пикселей. Также для визуального отделения подсказки от основного содержимого она обрамлена черной рамкой толщиной 1 пиксель.

Теперь нужно заставить подсказку появляться при наведении мыши на что-либо. Для примера она будет появляться и исчезать над картинкой:
<img src="ej.jpg" onmouseover="movePic('Это ёж. Что он делает в лесу?.. Да он и сам этого не знает!')" onmouseout="hidePic()">

То есть при наведении мыши на картинку будет вызвана функция movePic() со строковым параметром - текстом подсказки, - которая отобразит div-блок рядом с указателем мыши, а при удалении - hidePic(), которая спрячет его обратно.

Далее следует скрипт появления и скрытия подсказки. Спрятать намного проще, чем отобразить, поэтому сначала hidePic():
function hidePic(){ 
//если чуть-чуть порыться в памяти или поднять глаза вверх, то можно понять, что myalt - имя блока. 
myalt.style.visibility="hidden";//передача параметру visibility значения hidden, блок становится невидим 
myalt.innerHTML="";//очищение содежимого блока 
myalt.style.top=0; 
myalt.style.left=0;//отправка блока в верхний левый угол экрана 
} 

//Теперь пришло время movePic(): 
function movePic(word){ 
myalt.innerHTML=word;//отправка в подсказку строки 
myalt.style.left=window.event.clientX+5; 
myalt.style.top=window.event.clientY+5;//блок находится на 5 пикселей правее и ниже курсора мыши 
myalt.style.visibility="visible";//блок становится видимым 
}

Этот вариант уже работает, но у него есть недостки:
- если документ прокручивающийся (как это обычно и бывает), то корректно подсказка будет работать только в верхрем положении экрана, так как clientX и clientY возвращают лишь относительные координаты мышки.
- если объект, над которым всплывает подсказка, расположен ближе к правому краю окна, то она вылезет за края экрана и страничка растянется.
- аналогично с нижним краем.

Теперь пора исправлять недоделки. На самом деле все вышеперечисленные недостатки решаются очень легко:
- достаточно определить высоту прокрученной части документа
- проводится проверка на положение курсора относительно правого края.
- аналогично с нижним краем.
function movePic(word){ 
myalt.innerHTML=word; 
_x=window.event.clientX; 
_y=window.event.clientY;//сохранение координат курсора мыши в переменные 
_dx=5;//смещение подскаки вправо и влево относительно координат мыши 
//Определение, помещается ли подсказка между курсором и краями экрана 
left=false;right=false; 
if(_dx+_x+myalt.clientWidth>document.body.clientWidth){_x=document.body.clientWidth-myalt.clientWidth-_dx;left=true;} 
if(_dx+_y+myalt.clientHeight>document.body.clientHeight){_y=document.body.clientHeight-myalt.clientHeight-_dx;right=true;} 
//если объект в нижнем правом углу, подсказка всплывает над курсором 
if(left&&right)_y=document.body.clientHeight-myalt.clientHeight-_dx*4; 
//помещение подсказки в найденные коородинаты 
myalt.style.left=_x; 
myalt.style.top=_y+document.body.scrollTop;//смещение подскази в зависимости от высоты прокрученной части документа 
myalt.style.visibility="visible";
}

Обычно делают подсказку, двигающуюся за курсором мыши. Достигается это следующим образом. Во-первых функцию нужно вызывать не onmouseover, а onmousemove, и во-вторых, строка, передаваемая в функцию movePic(), должна отправляться в тело подсказки только один раз (иначе могут возникнуть разного рода блики и прочее, особенно если в подсказке будет картинка). Ниже следует целиком код документа.
<html> 
<head> 
<title>стрипт всплывающей подсказки</title> 
<script> 
var hide=true;//глобальная переменная, отвечающая будет ли строка передана в подсказку 
function movePic(word){ 
_x=window.event.clientX; 
_y=window.event.clientY; 
_dx=5 
left=false;right=false; 
if(_dx+_x+myalt.clientWidth>document.body.clientWidth){_x=document.body.clientWidth-myalt.clientWidth-_dx;left=true;} 
if(_dx+_y+myalt.clientHeight>document.body.clientHeight){_y=document.body.clientHeight-myalt.clientHeight-_dx;right=true;} 
if(left&&right)_y=document.body.clientHeight-myalt.clientHeight-_dx*4; 
myalt.style.left=_x; 
myalt.style.top=_y+document.body.scrollTop; 
if(hide){ 
myalt.innerHTML=word; 
myalt.style.visibility="visible"; 
hide=false; 
} 
} 
function hidePic(){ 
myalt.style.visibility="hidden"; 
myalt.innerHTML=""; 
myalt.style.top=0; 
myalt.style.left=0; 
hide=true; 
} 
</script> 
<head> 
<body> 
<div id="myalt" style="visibility:hidden; position:absolute; left:0; top:0; border-style:solid; border-color:'#000000'; border-width:1px; width:400px; height:10px; background-color:'#f5f5f5'; padding:3px;z-Index:3"></div> 
<img src="ej.jpg" width="100px" height="80px" onmousemove="movePic('Это ёж. Что он делает в лесу?.. Да он и сам этого не знает!')" onmouseout="hidePic()"> 
</body> 
</html>


Справка:
window - объект, окно браузера;
window.event - объект, информация о событиях;
document - объект, веб-страница;
document.body - объект, тело веб-страницы;
style - объект, доступ к стилям объекта;
clientX, clientY - read-only свойства event, координаты мыши относительно рабочей области браузера;
innerHTML - read/write свойство, возвращает/устанавливает html-код между тегами объекта;
clientWidth, clientHeight - readn-only свойства, возвращают реальные ширину и высоту объекта соответственно;
scrollTop - read/write свойство, возвращает/устанавливает высоту прокрученной части объекта;
onmouseout - событие, происходящее при наведение курсора мыши над объектом;
onmousemove - событие, происходящее при движении курсора мыши над объектом;
onmouseout - событие, происодящее в момент убирания курсора мыши с объекта.
Добавлено: 11 Сентября 2013 03:53:21 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...