Подсказка (tooltip) на javascript
Хочу поделиться тем как я создавал это простенький, но хороший скрипт создания подсказки (tooltip).
Можно было бы сделать подсказку атрибутами alt или title, но они появляются и исчезают как-то вяло. Мне захотелось жизни. Хотелась чтоб подсказка двигалась вместе с мышкой. И вот результат.
Итак:
Для начала подумаем куда деть оформление подсказки. Если хотите можно в отдельный css файл или напрямую в html воткнуть в тэг <style>. Я выбрал первое. Создал css файл в который написал следующее:
#ns_tt{
position: absolute;
border: solid #AAAAAA 1px;
background-color: #DDDDDD;
font-family: Tahoma, sans-serif;
font-size: 11px;
line-height: 16px;
padding: 2px 5px;
overflow: hidden;
margin: 25px 0px 0px 5px;
}
Тем самым оформил текст и саму подсказку. “position: absolute” здесь является директивой позиционирования подсказки. Она не должна зависеть от других элементов. Поэтому не трогайте её. Остальное можно менять по своему усмотрению. Разве что рекоммендую margin меньше не делать иначе подсказка попадёт под курсор и будет подрагивать.
Пойдём далее.
Дальше в вашем html файле подключаем css файл:
<link rel="stylesheet" type="text/css" href="your_css_file.css" />
Создаём js файл.
Вот тут самое интересное.
Создаём переменные отвечающие за левую и верхнюю позицию подсказки:
var l = 0, t = 0
Проверяем браузер. Если это Internet Explorer, то он будет понимать document.all и соответственно у него другие понятия о событиях и значениях которые они возвращают.
var IE = document.all?true:false
При движении мыши запускаем функцию, которую опишем ниже:
document.onmousemove = getMouseXY
Создаём элемент div который у нас будет являться подсказкой:
var ns_tt = document.createElement("div")
А эта функция будет изменять положение подсказки относительно положения курсора мыши:
function getMouseXY(e) {
if (IE) {
l = event.clientX + document.body.scrollLeft
t = event.clientY + document.body.scrollTop
}
else {
l = e.pageX
t = e.pageY
}
ns_tt.style.left = l + "px"
ns_tt.style.top = t + "px"
return true
}
Как вы видели мы проверяли наличие браузера IE. Дело в том что IE во-первых: положение курсора мыши понимает из объекта event в частности его значений clientX и clientY; во-вторых: координаты мыши отсчитываются от левого верхнего угла окна браузера, а когда пользователь использует прокрутку то в IE координата смещается, чего нет в других браузерах.
Следующая функция помещает в body нашу подсказку, вставляет текст переданый в качестве параметра и даёт ей уникальное имя, по которой в последствии мы будем её искать для удаления:
function AddTT(tt_text){
document.body.appendChild(ns_tt)
ns_tt.id = "ns_tt"
ns_tt.innerHTML = tt_text
}
Последняя функция удаляет подсказку:
function RemoveTT() {
document.body.removeChild(document.getElementById("ns_tt"))
}
Теперь подключаем js-файл к html-файлу. В любое место html-файла вставляем код:
<script type="text/javascript" src="ns_tooltip.js"></script>
Ну и то чез чего всё это не будет работать. Нужно выбрать элемент и поместить туда код вызова и удаления подсказки например:
<div onmouseover="AddTT('Вы читаете этот текст,<br /> а сейчас видите <b>подсказку</b>');" onmouseout="RemoveTT();">
Текст, картинка, блок... да любой объект над которым появится подсказка!
</div>
Будьте аккуратны с кавычками в onmouseover.
Для подсказки в CSS можно добавить например фильтр полупрозрачности (Работает везде, кроме IE6.):
filter:alpha(opacity=75);
-moz-opacity:.75;
opacity:.75;
Тестировано в: IE 6, IE 7, Opera 9.02, Firefox 2.0.0.1






]]>laacz]]>Firefox тоже поддерживает document.all коллекцию.
»]]>НикронЫч]]>Тем не менее, Firefox на запрос о document.all возвращает false.
»Здесь именно это и нужно.
]]>НикронЫч]]>Кстати для текущих версий Mozilla Firefox -moz-opacity:.75; можно не писать. Он понимает CSS3 директиву opacity:.75;
А в IE6 прозрачность работать не будет, т.к. фильтры в IE6 считаются ActiveX приложениями и должны устанваливаться как-то вручную.
Правда, Andrew Tch обещал завтра принести скрипт который вроде бы в IE6 делает div прозрачным. Ну посмотрим.
»]]>НикронЫч]]>Обащанного скрипта не будет. Админ имел в виду filter: opacity(alpha=75); Скорей всего у него ActiveX работает. ))
»]]>Skpd]]>thx
Долго мучился с подсказками в ФФ… Оч. помогло
»]]>Миша]]>Добрый день, я вот пытаюсь поставить ваш скриптик. И все вроде бы ничего, но почему-то IE7 неправильно определяет координату Y когда есть скролинг. Т.е. по X tooltip висит правильно, но по Y почему-то сильно сдвинут вверх.
В чем может быть дело?
»]]>Никита Селецкий]]>Я посмотрел в IE7 – всё отображается так же как везде.
»Сильно сдвинут – это на сколько? Вы меняли что либо в скрипте?
Если да, то дайте ссылку или скиньте мне на мыло: nikita[шафка]seleckis[дырка]lv
]]>ql]]>Столкнулся с той же проблемой (неверное позиционирование в IE 6), и вот что имею сказать: скрипт _не работает_ в IE с правильно прописанным DOCTYPE.
Пример на вашем сайте работает постольку поскольку _перед_ DOCTYPE стоит ваша подпись
которая и аннулирует оный DOCTYPE %)
уберите ее, и получите ту самую проблему с неверным позиционированием
»]]>Никита]]>Спасибо за подсказку. Исправлю.
»]]>Seleckis.lv :: журнал Никиты Селецкого » » Всплывающая подсказка v.2]]>[...] Всплывающая подсказка v.2 Вспоминаем мой давний пост про плавающую над объектами подсказку. [...]
»]]>Игорь]]>Супер статья! все понятно и доходчиво объяснено!
»]]>Molder]]>ОГРОМНЫЙ РЕСПЕКТ Nikita Seleckis
Такого беспроблемного подключения плюшки к сайту у меня еще небыло. Все просто супер класс, супер супер.
»]]>Set]]>Спасибо за скриптик и правда так всё легко настраивается и больше всего понравилось то, что очень маленький по размеру и простой.
Кстати может кому будет полезна вот такая доработка, чтобы не указывать в каждом теге события, а просто добавлять свой атрибут tooltip и всё остальное будет работать на автомате:
var toolTipTags = new Array(“div”, “span”);
function setToolTip(){
if(toolTipTags){
for(var j=0; j<toolTipTags.length; j++){
var tags = document.getElementsByTagName(toolTipTags[j]);
if(tags)
for(var i=0; i<tags.length; i++){
var tooltip = tags[i].getAttribute(“tooltip”);
if(tooltip != null && tooltip != “”){
tags[i].onmouseover = function() {AddTT(this.getAttribute(“tooltip”));}
tags[i].onmouseout = function() {RemoveTT();}
}
}
}
}
}
window.onload = function(){
setToolTip();
}
пример Наведи сюда!
»]]>Никита]]>Спасибо за комментарий. Но во-первых атрибут «tooltip» не существует, а во-вторых можно же просто добавить класс «tooltip».
»]]>Номад Кочующий]]>Здравствуйте! Посредством tooltip.js нужно сделать одну функцию, типа “Кто онлайн”. При наведении на имя, чтобы появлялось имя и фото человека. Кто сможет помочь?
»]]>Resettik]]>Реализовал немного по другому, но на основе вашего… Единственное, нет проверки на то что это IE, и соответственно нет поправки на скроллинг, но в моем случае у страницы скроллинга не будет (весь контент умещается в слой 800х600 в центре страницы)
function moveToolTip()
{
var obj = document.getElementById(‘tooltip’);
obj.style.top = window.event.y + ‘px’;
obj.style.left = window.event.x + ‘px’;
}
function deleteToolTip()
{
document.body.removeChild(document.getElementById(‘tooltip’));
}
function addToolTip(obj,text)
{
if(!document.getElementById(‘tooltip’))
{
var toolTip = document.createElement(‘DIV’);
toolTip.className = ‘tooltip’;
toolTip.id = ‘tooltip’;
toolTip.innerHTML = text;
document.body.appendChild(toolTip);
obj.onmousemove = function (){moveToolTip();};
obj.onmouseout = function (){deleteToolTip();};
}
moveToolTip();
}
И затем…
»]]>Resettik]]>И затем прикручивается к элементу вот так:
»]]>Resettik]]>Извиняюсь за много коментариев, не сразу заметил что режется весь HTML =)
В моем варианте не “гадится” document.onmousemove, а только нужного элемента, и также устанавливается удаление подсказки для него внутри скрипта, поэтому не нужно будет загромождать элемент указанием функций в событиях. Нужно будет только указать на вызов addToolTip при движении мыши над объектом. О минусах не задумывался сильно, но вроде пока не нашел.
О минусах вашего задумываюсь только в плане “красивости”, а именно то что, как я понимаю, установив document.onmousemove мы будем “двигать” нашу подсказку, даже если ее нет в документе, и курсор находится необязательно над нужным элементом, что как-то.. нелепо =)
Ну и я против глобальных переменных в любых проявлениях, только если без них никак не обойтись, а у вас как я понял, слой с подсказкой, точнее указатель на него – глобальный. Да и остальные, не имеющие отношения к общему коду переменные, тоже глобальные (t,l).
Из-за того что порезался HTML в прошлых комментариях, попытаюсь еще раз:
div class=”mdiv” onmouseover=”addToolTip(this,’мой текст подсказки’)”
»]]>Никита]]>Resettik, спасибо за комментарии. Да, в программировании нет предела совершенству. Правда я уже этим не занимаюсь.
»]]>Блог mr.rOOse » 14+ Вcплывающих подсказок(Javascript+CSS Tooltips)]]>[...] NS_Tooltip [...]
»]]>Кирилл]]>а как сделать задержку в показе тултипа?
»]]>Никита]]>нужно добавить setTimeout. Почитайте тут http://www.w3schools.com/js/js_timing.asp
»]]>Кирилл]]>Спасибо, но я не знаю js.. Не подскажите куда именно что вписать?) Спасибо!
»]]>Никита]]>Нужно переписать функцию AddTT и добавить функцию CreateTT.
function CreateTT(tt_text){
»document.body.appendChild(ns_tt)
ns_tt.id = “ns_tt”
ns_tt.innerHTML = tt_text
}
function AddTT(tt_text){
setTimeout (“CreateTT(” + tt_text + “)”, 1000); // здесь 1000 это задержка в миллисекундах.
}
]]>Никита]]>Кавычки только замените, а то они тут косые.
»]]>Кирилл]]>вот что получилось, почему-то не работает..
var l = 0, t = 0
var IE = document.all?true:false
document.onmousemove = getMouseXY
var ns_tt = document.createElement(“div”)
function getMouseXY(e) {
if (IE) {
l = event.clientX + document.body.scrollLeft
t = event.clientY + document.body.scrollTop
}
else {
l = e.pageX
t = e.pageY
}
ns_tt.style.left = l + “px”
ns_tt.style.top = t + “px”
return true
}
function AddTT(tt_text)
{
setTimeout (“CreateTT(” + tt_text + “)”, 500);
}
function CreateTT(tt_text)
{
document.body.appendChild(ns_tt)
ns_tt.id = “ns_tt”
ns_tt.innerHTML = tt_text
}
function RemoveTT() {
»document.body.removeChild(document.getElementById(“ns_tt”))
}
]]>Кирилл]]>собственно о чём речь идет – http://megabudka.ru/menu/ тут как в самом описании всё сделано. Очень хорошо и понятно работает. Спасибо кстати большое!
Здесь же я пытался сделать с задержкой http://megabudka.ru/menu/index2.html
»Ссылка на новый файл js http://megabudka.ru/menu/ns_tooltip1.js
Не понимаю)
]]>Никита]]>Да, нужно переписать три функции:
function CreateTT(tt_text){
document.body.appendChild(ns_tt)
ns_tt.id = “ns_tt”
ns_tt.innerHTML = tt_text
clearTimeout(x);
}
function AddTT(tt_text){
x = setTimeout (“CreateTT(‘” + tt_text + “‘)”, 1000);
}
function RemoveTT() {
»if(document.getElementById(“ns_tt”)) {
document.body.removeChild(document.getElementById(“ns_tt”))
}
}
]]>Кирилл]]>Работает! но при этом наблюдается странный глюк. Надписи стали тусоваться в странном порядке. Может появится в любом месте экрана. http://megabudka.ru/menu/index2.html
Но всё равно спасибо огромное!
»