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

13 ноября 2008, 6:00 Павел Марковнин JavaScript рейтинг +31-

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

Coda Bubble

Так вот, в этом уроке мы посмотрим, как сделать такую же всплывающую подсказку средствами 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;
});
});
});

Конец

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

Рекламное место, которое может стать вашим

Понравилась статья?

Тогда подпишись на обновления через RSS или воспользуйся
другими способами подписки.

Читать в Яндекс.Ленте Добавить в Google Добавить в Netvibes
  •  

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

RSS
  • Аватарка
    13 ноября 2008 в 11:21 Teddy
    Под IE 6.0 работает с багами и лагами.
  • Аватарка
    13 ноября 2008 в 13:33 ]]>Вадим]]>
    Зачетная подсказка, обязательно найдется для нее место :-)
  • Аватарка
    13 ноября 2008 в 17:38 ]]>Иван]]>
    Отличный эффект всплывания, очень ужобно при чистке страницы от большого кол-ва текста.
  • Аватарка
    13 ноября 2008 в 18:57 ]]>Grin]]>
    Teddy, баги от того, что 6-ой ослик не понимает прозрачности в png - но это довольно просто исправляется
  • Аватарка
    14 ноября 2008 в 1:26 Vencedor
    Спасибо за статью. Кстати, поправьте: "и вот, что получиТСЯ ...".
  • Аватарка
    14 ноября 2008 в 14:17 Сергей
    Да, с грамматическими ошибками надо бороться ;) Давно искал что-то подобное. Нашел в другом месте подборку отличную. Это как то не очень понравилось.
  • Аватарка
    15 ноября 2008 в 18:19 krevedko
    Простите - не потеме, только начал jQuery юзать как задать очередность выполнения функций например меняем позицию дива1 top:0 -> top:100 после того как див1 получил позицию top:100 мы берем див2 и делаем с ним чтонибудь, смысл в том чтобы все работало в определенном порядке, сначало делаем это, а когда это завершилось делаем другое с другим объектом
  • Аватарка
    16 ноября 2008 в 22:41 eSender
    Насколько я знаю jQuery и так все делает только в том порядке в каком указали, а не все сразу.
  • Аватарка
    24 ноября 2008 в 4:07 Vencedor
    Grin, png-то пофиксится, но вот когда на прозрачный png еще и opacity устанавливаешь, то получается, извините, какашка. Откройте страницу в IE7 и убедитесь.
  • Аватарка
    18 декабря 2008 в 15:40 ahat
    а как сделать предзагрузку исспользуемых изображений?
  • Аватарка
    19 февраля 2009 в 19:27 Евгений
    Всё это конечно круто и даже хочется попробовать, но прошу автора пожалуйста выкложить исходники с изображениями(bubble-1.png,2,3 и т.д.).
    Я считаю так будет удобнее,по применению на практике данного примера.
  • Аватарка
    19 февраля 2009 в 19:28 Евгений
    Надеюсь на понимание.
  • Аватарка
    16 марта 2009 в 13:24 ]]>Bambino]]>
    Прикольно. А что насчет 6-го "осла"? Баг пофиксен? Если уже брать код, так пусть он будет багфри.
  • Аватарка
    23 марта 2009 в 19:44 ]]>Anon11]]>
    Спасибо, хорошая статья. Обязательно попробую.
  • Аватарка
    24 марта 2009 в 16:32 ]]>Ice]]>
    Отличный скрипт
  • Аватарка
    31 марта 2009 в 12:08 MM
    Сделайте такую на prototype+scriptaculous, а то нехочется еще и jQuery на сайт вешать.
  • Аватарка
    31 мая 2009 в 2:31 Сергей
    Я правильно понимаю, что во всех IE полупрозрачные области PNG не отрабатывают, как должно, с opacity?
  • Аватарка
    30 октября 2009 в 18:32 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);
    }
  • Аватарка
    22 ноября 2009 в 21:02 ]]>mozg]]>
    Красиво подсказочки оформлены.
  • Аватарка
    18 февраля в 17:01 Одиночка Айс
    Большое спасибо за статью! Пытался использовать tooltip, но не получилось из-за того, что на странице уже есть аяксовская функция (возникает конфликт и функция просто не воспринимается), в остальных просто не разобрался. Ваше же решение не просто удачное, но еще и очень легкое. Еще раз большое спасибо, успехов Вам!!!
  • Аватарка
    18 февраля в 17:03 Одиночка Айс
    to Сергей

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

    Кстати, кто-нибудь, знает, как эти подсказки реагируют на рядом стоящий select в IE 6?
  • Аватарка
    16 марта в 13:32 ]]>Одиночка Айс]]>
    to Maxin
    Да нет, есть фикс специально для шестого осла, который учит его понимать прозрачность, вот только бы найти у себя этот скрипт. Про селект не знаю, лично я сделал так, чтобы подсказка всплывала справа, дабы не мешала остальным ссылкам.
  • Аватарка
    17 марта в 5:05 ]]>Саша]]>
    неплохой несложный метод всплывающих окон
    спасибо
    возьму на заметку
  • Аватарка
    14 апреля в 0:40 Gunit
    вот здесь еще можно подсказки посмотреть правда они за курсором бегают http://prootime.ru/css-hint
  • Аватарка
    7 мая в 11:31 ]]>Павел]]>
    Неплохо было бы сделать плугином для jquery
    Помочь?
  • Аватарка
    7 мая в 23:51 Maxin
    2Одиночка Айс
    ну вот у меня проблема в том, что не получается обойти селекты, а они поганцы очень уж в 6м Осле отвратительны (
  • Аватарка
    13 июня в 18:12 ]]>Одиночка Айс]]>
    2Maxin

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

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

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

    2. Для того, чтобы переместить подсказку влево, попробуйте поиграться с left position, давая ему отрицательное значение.
  • Аватарка
    25 июня в 23:45 Maxin
    2 Одиночка Айс
    увы, все несколько сложнее, но проблему решили несколько иным способом )
  • Аватарка
    26 июня в 12:36 ]]>Одиночка Айс]]>
    2 Maxin

    Остается только порадоваться за Вас ;)
  • Аватарка
    26 июня в 12:38 Maxin
    о дааааааа... порадоваться )))
  • Аватарка
    27 июня в 11:01 Владимир
    Положение всплывающего окна редактировалась в ява коде.
  • Эл. почта (используется для Граватарки)
  • Домашняя страница
  • Имя в Твиттере
  • Разрешенные теги Текст сообщения (надо бы заполнить это поле)
  • как выглядит какой тег
    жирный текст <b>жирный текст</b>
    курсивный тект <i>курсивный тект</i>
    зачеркнутый текст <s>зачеркнутый текст</s>
    подчеркнутый текст <u>подчеркнутый текст</u>
    ссылка <a href="адрес">ссылка</a>
    function foo() { ... }
    <pre><code>function foo() { ... } </code></pre>