22 декабря 2015
13 ноября 2008
61
Всплывающие подсказки на 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;
});
});
});
Конец
И вот, что получиться, если собрать все воедино. Надеюсь, урок вам понравился ;-)
Я считаю так будет удобнее,по применению на практике данного примера.
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);
}
Нет, это возникает только в 6 осле, но там есть фича, которая позволяет избавиться от этой траблы.
а как именно там обходится? путем подложения гифа?
Кстати, кто-нибудь, знает, как эти подсказки реагируют на рядом стоящий select в IE 6?
Да нет, есть фикс специально для шестого осла, который учит его понимать прозрачность, вот только бы найти у себя этот скрипт. Про селект не знаю, лично я сделал так, чтобы подсказка всплывала справа, дабы не мешала остальным ссылкам.
спасибо
возьму на заметку
Помочь?
ну вот у меня проблема в том, что не получается обойти селекты, а они поганцы очень уж в 6м Осле отвратительны (
Попробуйте сделать расстояние больше между ними :) а для Осла перерисуйте селекты через CSS.
это в примере вроде было
.popup {
position: absolute;
display: none;
z-index: 50;
border-collapse: collapse;
font-size: .8em;
}
я не понял зачем тут z-index ,но главное как влево появляющиеся окошко сдвинуть.
Почему-то в их примере ,нельзя было сделать pop Up раздельно для разных дивов.
1. z-index нужен для того, чтобы слой был выше остальных (это вполне понятно в данном случае).
2. Для того, чтобы переместить подсказку влево, попробуйте поиграться с left position, давая ему отрицательное значение.
увы, все несколько сложнее, но проблему решили несколько иным способом )
Остается только порадоваться за Вас ;)
Мне бы хотелось мредложить не мее интересное решение вопроса подсказок!
# AntiBuger
Если Вы про то, как реализовано на моем проекте (например, http://www.idkaznet.kz/hosting/hs), то это примерно выглядит следующим образом:
js-файл:
info.css({
top: 0,
left: 200,
display: 'block'
})
1. Создать в js несколько функций, в Вашем случае 3, с разными значениями top;
2. Менять значение top в св-ве style у дива popup.
Хотя, если честно, мне показалось, что в style значение никак ни на что не влияет.
Ещё один вопрос - есть ли возможность сделать так,что в случае всплывания окна у края экрана,она всплывала в другую сторону?
http://jqueryfordesigners.com/coda-popup-bubbles/
Из за которого я что то долго не мог понять почему у меня криво отображается хотя всё скопировал у вас!
Так вот вам в css ещё дописать надо
* {
margin: 0;
padding: 0;
}
В противном случает всё отображается разряжённо тоесть картинки не стыкуются!
src="files/bubble-tail2.png" и т.п.
Вот HTML код, сори за неправильный выше, забыл тэги вставить.
В IE 6, правда проверял в IE Tester, такая проблема: При открытие страницы, ссылки, на которые нужно наводить, чтобы всплывала подсказка появляются и потом сразу же пропадают. Если уменьшить или увеличить страницу(прозумировать), то эти ссылки появляются и все нормально работает. Причем проблема только с ссылками, если оборачивать, например h3, то все ок. Вот не знаю, глючит ли это IE Tester или действительно такая проблема в IE6.
.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;
}
Помогите, пожалуйста =)
http://jqueryfordesigners.com/coda-popup-bubbles/
РЕАЛИЗОВЫВАЕТ ? вы серьзно? ))