Всплывающие подсказки на jQuery

Всплывающие подсказки на jQuery

Возможно, некоторые из вас были на сайте программы «Кода» и видели там вот такой интересный эффект:

Так вот, в этом уроке мы посмотрим, как сделать такую же всплывающую подсказку средствами jQuery.

Для начала, давайте посмотрим, что должно получиться в итоге. Понравилось? Тогда идем дальше.

HTML разметка

Код пузыря и объекта, при наведении курсора на который будет появляться подсказка.

<div class="bubbleInfo">
<div id="download" class="trigger">Наведи на меня курсор</div>
<table style="opacity: 0; top: -50px; left: -33px; display: none;" id="dpop" class="popup">
<tbody><tr>
<td id="topleft" class="corner"></td>
<td class="top"></td>
<td id="topright" class="corner"></td>
</tr>

<tr>
<td class="left"></td>
<td>Вот здесь пишем текст</td>
<td class="right"></td>
</tr>

<tr>
<td class="corner" id="bottomleft"></td>
<td class="bottom"><img alt="popup tail" src="files/bubble-tail2.png" height="29" width="30" /></td>
<td id="bottomright" class="corner"></td>
</tr>
</tbody></table>
</div>

CSS

Теперь прописываем стили всем элементам, при этом делаем так, чтобы при отключенных скриптах ничего не плыло:

.bubbleInfo {
position: relative;
top: 150px;
left: 100px;
width: 500px;
}
.trigger {
position: absolute;
}

.popup {
position: absolute;
display: none;
z-index: 50;
border-collapse: collapse;
font-size: .8em;
}

.popup td.corner {
height: 15px;
width: 19px;
}

.popup td#topleft {
background-image: url(files/bubble-1.png);
}

.popup td.top {
background-image: url(files/bubble-2.png);
}

.popup td#topright {
background-image: url(files/bubble-3.png);
}

.popup td.left {
background-image: url(files/bubble-4.png);
}

.popup td.right {
background-image: url(files/bubble-5.png);
}

.popup td#bottomleft {
background-image: url(files/bubble-6.png);
}

.popup td.bottom {
background-image: url(files/bubble-7.png);
text-align: center;
}

.popup td.bottom img {
display: block;
margin: 0 auto;
}

.popup td#bottomright {
background-image: url(files/bubble-8.png);
}

jQuery

Теперь сам код, который реализовывает эту прикольную анимацию.

$(function () {
$('.bubbleInfo').each(function () {
var distance = 10;
var time = 250;
var hideDelay = 500;

var hideDelayTimer = null;

var beingShown = false;
var shown = false;
var trigger = $('.trigger', this);
var info = $('.popup', this).css('opacity', 0);


$([trigger.get(0), info.get(0)]).mouseover(function () {
if (hideDelayTimer) clearTimeout(hideDelayTimer);
if (beingShown || shown) {
return;
} else {
beingShown = true;

info.css({
top: -40,
left: -33,
display: 'block'
}).animate({
top: '-=' + distance + 'px',
opacity: 1
}, time, 'swing', function() {
beingShown = false;
shown = true;
});
}

return false;
}).mouseout(function () {
if (hideDelayTimer) clearTimeout(hideDelayTimer);
hideDelayTimer = setTimeout(function () {
hideDelayTimer = null;
info.animate({
top: '-=' + distance + 'px',
opacity: 0
}, time, 'swing', function () {
shown = false;
info.css('display', 'none');
});

}, hideDelay);

return false;
});
});
});

Конец

И вот, что получиться, если собрать все воедино. Надеюсь, урок вам понравился ;-)

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 61

Teddy
Под IE 6.0 работает с багами и лагами.
#
Teddy
Вадим
Зачетная подсказка, обязательно найдется для нее место :-)
Иван
Отличный эффект всплывания, очень ужобно при чистке страницы от большого кол-ва текста.
Grin
Teddy, баги от того, что 6-ой ослик не понимает прозрачности в png - но это довольно просто исправляется
#
Grin
Vencedor
Спасибо за статью. Кстати, поправьте: "и вот, что получиТСЯ ...".
#
Vencedor
Сергей
Да, с грамматическими ошибками надо бороться ;) Давно искал что-то подобное. Нашел в другом месте подборку отличную. Это как то не очень понравилось.
#
Сергей
krevedko
Простите - не потеме, только начал jQuery юзать как задать очередность выполнения функций например меняем позицию дива1 top:0 -> top:100 после того как див1 получил позицию top:100 мы берем див2 и делаем с ним чтонибудь, смысл в том чтобы все работало в определенном порядке, сначало делаем это, а когда это завершилось делаем другое с другим объектом
#
krevedko
eSender
Насколько я знаю jQuery и так все делает только в том порядке в каком указали, а не все сразу.
#
eSender
Vencedor
Grin, png-то пофиксится, но вот когда на прозрачный png еще и opacity устанавливаешь, то получается, извините, какашка. Откройте страницу в IE7 и убедитесь.
#
Vencedor
ahat
а как сделать предзагрузку исспользуемых изображений?
#
ahat
  Евгений
Всё это конечно круто и даже хочется попробовать, но прошу автора пожалуйста выкложить исходники с изображениями(bubble-1.png,2,3 и т.д.).
Я считаю так будет удобнее,по применению на практике данного примера.
#
Евгений
  Евгений
Надеюсь на понимание.
#
Евгений
Bambino
Прикольно. А что насчет 6-го "осла"? Баг пофиксен? Если уже брать код, так пусть он будет багфри.
Anon11
Спасибо, хорошая статья. Обязательно попробую.
Ice
Отличный скрипт
#
Ice
MM
Сделайте такую на prototype+scriptaculous, а то нехочется еще и jQuery на сайт вешать.
#
MM
Сергей
Я правильно понимаю, что во всех IE полупрозрачные области PNG не отрабатывают, как должно, с opacity?
#
Сергей
Pulsar
Autoresize simple Popup Bubble

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="bubble.css" type="text/css" rel="stylesheet"/>
<script language="javascript" type="text/javascript" src="jquery.js"></script>
<script language="javascript" type="text/javascript" src="bubble.js"></script>
</head>
<body>
<br/><br/>
<div class="bubbleInfo">
<div class="bubble" title="Text 1">Set cursor</div>
</div>
<br/><br/><br/><br/>
<div class="bubbleInfo">
<div class="bubble" title="Text 2">Set cursor</div>
</div>
</body>
</html>

bubble.js

$(function () {

var i = 0;
var z=1;
do{
title = $('.bubble:eq('+i+')').attr('title');
if(!title){
z=0;
} else {
$('.bubble:eq('+i+')').after('<table style="opacity: 0; top: -50px; left: -33px; display: none;" id="dpop" class="popup"><tbody><tr><td id="topleft" class="corner"></td><td class="top"></td><td id="topright" class="corner"></td></tr><tr><td class="left"></td><td>'+title+'</td><td class="right"></td></tr><tr><td class="corner" id="bottomleft"></td><td class="bottom"><img src="bubble/bubble-tail.png" height="25px" width="30px" /></td><td id="bottomright" class="corner"></td></tr></tbody></table>');
$('.bubble:eq('+i+')').removeAttr('title');
}
i++;
}while(z>0)

$('.bubbleInfo').each(function () {
var distance = 10;
var time = 250;
var hideDelay = 500;

var hideDelayTimer = null;

var beingShown = false;
var shown = false;
var trigger = $('.bubble', this);
var info = $('.popup', this).css('opacity', 0);


$([trigger.get(0), info.get(0)]).mouseover(function () {
if (hideDelayTimer) clearTimeout(hideDelayTimer);
if (beingShown || shown) {
// don't trigger the animation again
return;
} else {
// reset position of info box
beingShown = true;

info.css({
top: -40,
left: 10,
display: 'block'
}).animate({
top: '-=' + distance + 'px',
opacity: 1
}, time, 'swing', function() {
beingShown = false;
shown = true;
});
}

return false;
}).mouseout(function () {
if (hideDelayTimer) clearTimeout(hideDelayTimer);
hideDelayTimer = setTimeout(function () {
hideDelayTimer = null;
info.animate({
top: '-=' + distance + 'px',
opacity: 0
}, time, 'swing', function () {
shown = false;
info.css('display', 'none');
});
}, hideDelay);
return false;
});
});
});

bubble.css

/* Booble */
.bubbleInfo {
position: relative;
width: 500px;
}
.bubble {

}
.popup {
position: absolute;
display: none;
z-index: 50;
border-collapse: collapse;
font-size: .8em;
}
.popup td.corner {
height: 13px;
width: 15px;
}
.popup td#topleft {
background-image: url(bubble/bubble-1.png);
}
.popup td.top {
background-image: url(bubble/bubble-2.png);
}
.popup td#topright {
background-image: url(bubble/bubble-3.png);
}
.popup td.left {
background-image: url(bubble/bubble-4.png);
}
.popup td.right {
background-image: url(bubble/bubble-5.png);
}
.popup td#bottomleft {
background-image: url(bubble/bubble-6.png);
}
.popup td.bottom {
background-image: url(bubble/bubble-7.png);
text-align: center;
}
.popup td.bottom img {
display: block;
margin: 0 auto;
}
.popup td#bottomright {
background-image: url(bubble/bubble-8.png);
}
#
Pulsar
mozg
Красиво подсказочки оформлены.
#
mozg
Одиночка Айс
Большое спасибо за статью! Пытался использовать tooltip, но не получилось из-за того, что на странице уже есть аяксовская функция (возникает конфликт и функция просто не воспринимается), в остальных просто не разобрался. Ваше же решение не просто удачное, но еще и очень легкое. Еще раз большое спасибо, успехов Вам!!!
#
Одиночка Айс
Одиночка Айс
to Сергей

Нет, это возникает только в 6 осле, но там есть фича, которая позволяет избавиться от этой траблы.
#
Одиночка Айс
Maxin
2 Одиночка Айс
а как именно там обходится? путем подложения гифа?

Кстати, кто-нибудь, знает, как эти подсказки реагируют на рядом стоящий select в IE 6?
#
Maxin  
Одиночка Айс
to Maxin
Да нет, есть фикс специально для шестого осла, который учит его понимать прозрачность, вот только бы найти у себя этот скрипт. Про селект не знаю, лично я сделал так, чтобы подсказка всплывала справа, дабы не мешала остальным ссылкам.
Саша
неплохой несложный метод всплывающих окон
спасибо
возьму на заметку
Gunit
вот здесь еще можно подсказки посмотреть правда они за курсором бегают http://prootime.ru/css-hint
#
Gunit
Павел
Неплохо было бы сделать плугином для jquery
Помочь?
Maxin
2Одиночка Айс
ну вот у меня проблема в том, что не получается обойти селекты, а они поганцы очень уж в 6м Осле отвратительны (
#
Maxin
Одиночка Айс
2Maxin

Попробуйте сделать расстояние больше между ними :) а для Осла перерисуйте селекты через CSS.
Владимир
Вроде всё сделал,но не получаеться сдвинуть надпись popUP влево . она у меня появляеться справа. Высоту нашел,как регулировать...
это в примере вроде было

.popup {
position: absolute;
display: none;
z-index: 50;
border-collapse: collapse;
font-size: .8em;
}
я не понял зачем тут z-index ,но главное как влево появляющиеся окошко сдвинуть.
Владимир
Кстати Ваш пример ,лучше американского.
Почему-то в их примере ,нельзя было сделать pop Up раздельно для разных дивов.
Одиночка Айс
to Владимир

1. z-index нужен для того, чтобы слой был выше остальных (это вполне понятно в данном случае).

2. Для того, чтобы переместить подсказку влево, попробуйте поиграться с left position, давая ему отрицательное значение.
Maxin
2 Одиночка Айс
увы, все несколько сложнее, но проблему решили несколько иным способом )
#
Maxin
Maxin
о дааааааа... порадоваться )))
#
Maxin
Владимир
Положение всплывающего окна редактировалась в ява коде.
#
Владимир
AntiBuger
Здравствуйте.
Мне бы хотелось мредложить не мее интересное решение вопроса подсказок!
#
AntiBuger
SunChase
можно ли както через цсс управлять параметром top всплывающего окна...или как сделать второй псевдоклас всплывалки(для использования на одной странице) ?
#
SunChase
Одиночка Айс
В смысле поиграть с положением на странице? Смотрите значение top в js.
SunChase
Интересует момент использования такой всплывающей подсказки одновременно в 3х местах,в одном из которых подсказка вылазит снизу.
#
SunChase
Одиночка Айс
Да простит меня автор этого сайта...

Если Вы про то, как реализовано на моем проекте (например, http://www.idkaznet.kz/hosting/hs), то это примерно выглядит следующим образом:

js-файл:
info.css({
top: 0,
left: 200,
display: 'block'
})
SunChase
Я имел ввиду в 3х местах подсказка должна вылазить с разным значением параметра top.В одном месте подсказка вылазит снизу(top:30),во втором сверху(top:-30),в третем вообще справа(top:0).Как показали ковыряния, из js можно переместить параметр left,но если убрать параметр top и прописать его через CSS то если 10 раз навести курсор на одну подсказку , будет видно что каждый раз она появляется всё выше и выше...
#
SunChase
Одиночка Айс
Вариантов несколько:

1. Создать в js несколько функций, в Вашем случае 3, с разными значениями top;
2. Менять значение top в св-ве style у дива popup.

Хотя, если честно, мне показалось, что в style значение никак ни на что не влияет.
SunChase
Первый варинт пока и стоит,но нехотелось бы лишний раз засорять шапку.Второй вариант работает лиш в случае,если я удалю из js эти параметры...но тогда ,как я говорил раньше, начинаются проблемы...

Ещё один вопрос - есть ли возможность сделать так,что в случае всплывания окна у края экрана,она всплывала в другую сторону?
#
SunChase
Одиночка Айс
Честно говоря, вряд ли, в конце концов, js не ООП, чтобы отслеживать все действия пользователя, а даже если это и возможно, то только приличной доработкой кода, в данном же скрипте это невозможно.
SunChase
Понятно.Спасибо за информацию
#
SunChase
Бочка
Автор, хоть бы источник указал:
http://jqueryfordesigners.com/coda-popup-bubbles/
#
Бочка
Nilson
вот только этот код не хочет работать с jQ выше версии, например 1.4.2
#
Nilson
Денис
Откройте свой собственный пример в IE8 и посмотрите что получилось
Марат
Забрал себе. Привинтил к сайту клиента. Допилить пришлось немного. На chrome 7.0.517.44, ie6, opera 11.01, firefox 3.6.13 все отлично. Спасибо.
klubnichka
Должен заметить существенный косяк в вашей статье.
Из за которого я что то долго не мог понять почему у меня криво отображается хотя всё скопировал у вас!
Так вот вам в css ещё дописать надо

* {
margin: 0;
padding: 0;
}

В противном случает всё отображается разряжённо тоесть картинки не стыкуются!
Петя
А где папка с соурсами?
src="files/bubble-tail2.png" и т.п.
#
Петя
Андрей
На самом деле, выложите изображения
#
Андрей
Djeak

<div class="item" style="margin-bottom: 20px;">
<div class="bubbleInfo">
<a target=_blank href="/common/img/uploaded/library/2010/12/fz357_ot_131210.zip" class="trigger grey_links">Федеральный закон от 13 декабря 2010 г. № 357-ФЗ  "О федеральном бюджете на 2011 год и на плановый период 2012 и 2013 годов" 
</a>
<table class="popup library_tooltip">
<tr>
<td class="library_tooltip_first_td"><img src="common/img/bg_fot_tolltip.gif" alt=''></td>
<td class="library_tooltip_first_td"><a href="#">Бюджет</a></td>
<td><a href="#">Бюджетная политика</a></td>
<td class="tolltip_active_a"><a href="#">Основные направления налоговой политики</a></td>
</tr>
</table>
<span class="date" style="color:#989994;font-size:0.85em;">
(14.12.2010)</span>
</div>


<table class="table_clear">
	<tr>
	</tr>
</table>
</div>


Вот HTML код, сори за неправильный выше, забыл тэги вставить.
#
Djeak
Djeak
Заново задам свой вопрос.
В IE 6, правда проверял в IE Tester, такая проблема: При открытие страницы, ссылки, на которые нужно наводить, чтобы всплывала подсказка появляются и потом сразу же пропадают. Если уменьшить или увеличить страницу(прозумировать), то эти ссылки появляются и все нормально работает. Причем проблема только с ссылками, если оборачивать, например h3, то все ок. Вот не знаю, глючит ли это IE Tester или действительно такая проблема в IE6.

<div class="item" style="margin-bottom: 20px;">
<div class="bubbleInfo">
<a target=_blank href="/common/img/uploaded/library/2010/12/fz357_ot_131210.zip" class="trigger grey_links">Федеральный закон от 13 декабря 2010 г. № 357-ФЗ  "О федеральном бюджете на 2011 год и на плановый период 2012 и 2013 годов" 
</a>
<table class="popup library_tooltip">
<tr>
<td class="library_tooltip_first_td"><img src="common/img/bg_fot_tolltip.gif" alt=''></td>
<td class="library_tooltip_first_td"><a href="#">Бюджет</a></td>
<td><a href="#">Бюджетная политика</a></td>
<td class="tolltip_active_a"><a href="#">Основные направления налоговой политики</a></td>
</tr>
</table>
<span class="date" style="color:#989994;font-size:0.85em;">
(14.12.2010)</span>
</div>


<table class="table_clear">
	<tr>
	</tr>
</table>
</div>

.bubbleInfo {
position: relative;
}
.trigger {
cursor: pointer;

}

.popup {
display: none;
position: absolute;
}

table.library_tooltip {
background: #edede3;
border: 1px solid #e3d1b9;
border-top: 1px solid #c9aa92;
width: auto;
}
.body table.library_tooltip td {
line-height: 23px;
background: url(../img/bg_tooltip_li.gif) no-repeat left 7px;
border: 0;
}
.body table.library_tooltip td.library_tooltip_first_td {
background: none;
border: 0;
}

.library_tooltip td a {
text-decoration: none;
font: 11px Trebuchet MS, Arial, sans-serif;
vertical-align: middle;
padding-left: 10px;
padding-right: 10px;
line-height: 23px;
display: block;
}

.library_tooltip td a:hover {
text-decoration: underline;
}

.library_tooltip td.tolltip_active_a a {
color: #5c5c5c;
}

.library_tooltip td img {
vertical-align: middle;
padding: 6px 0 0 5px;
display: block;
}
Помогите, пожалуйста =)
#
Djeak
Sasha
Автр картинки png в студию плиз, а то я рисовать не умею)
#
Sasha
123
здравствуйте в jquery я ноль. По этому прошу помощи. как сделать чтобы под сказочка была эффектом наплыва, по моему fade называется. то есть чтобы просто появлялась и исчезала, без движения вверх.
#
123
sol0mka
Почему бы не оставлять ссылку на первоисточник?)

http://jqueryfordesigners.com/coda-popup-bubbles/
#
sol0mka
Сергей
"Теперь сам код, который реализовывает эту прикольную анимацию."

РЕАЛИЗОВЫВАЕТ ? вы серьзно? ))
Дмитрий
В IE9 не работает. Может кто-нибудь знает как победить проблему или другой похожий кросбраузерный код
#
Дмитрий
Вячеслав
Спасибо за совет, воспользуюсь.
Сергей
Спасибо.Только с вашей помощью смог реализовать идею для своего сайта. Перерыл кучу информации и дельный совет обнаружил здесь.

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler