2009-03-09 19 views
97

Próbuję zrobić "bąbelek", który może się wyskoczyć po uruchomieniu zdarzenia onmouseover i pozostanie otwarty, dopóki mysz znajdzie się nad elementem, który rzucił zdarzenie onmouseover LUB jeśli mysz jest przeniósł się do bańki. Moja bańka będzie musiała mieć wszystkie sposoby HTML i stylizacji, w tym hiperłącza, obrazy itp.jQuery Popup Bubble/Tooltip

Zasadniczo osiągnąłem to, pisząc około 200 linii brzydkiego JavaScript, ale naprawdę chciałbym znaleźć wtyczkę jQuery lub inną sposób na trochę tego posprzątać.

+1

@bluefeet Off topic? Poważnie? Facet zadał pytanie o to, jak skrócić jego 200 wierszy kodu za pomocą JQuery, i został użyty prawie ćwierć miliona razy (tylko rozwiązał mój problem) i oznaczyłeś go tematem? Co w takim razie zachęca do odpowiedzi bardziej upowszechnionych niż jakiekolwiek inne pytanie? –

+0

@ChrisSharp Czy znasz przyczynę, dla której został zamknięty? Konkretnie prosi o "dobrą wtyczkę jQuery do robienia fantazyjnych baniek". Pytania z prośbą o rekomendacje są nie na temat, ale jeśli uważasz, że można to przepisać, by zrobić to na temat, możesz zasugerować edycję, aby uzyskać kształt. – Taryn

Odpowiedz

155

Qtip is the best one I've seen. Ma licencję MIT, jest piękna, ma wszystkie potrzebne konfiguracje.

Moja ulubiona lekka opcja to tipsy. Również licencjonowany MIT. Zainspirowało to Bootstrap's tooltip plugin.

+6

Zdecydowanie najlepsze. Jedna linia kodu w porównaniu z innymi wielkimi rozwiązaniami, które zaoferowały inne. Mam nadzieję, że ta odpowiedź zostanie poddana pod głosowanie. –

+2

Qtip ma problemy ze zgodnością z jQuery 1.4+. Prosta jednolinijkowa poprawka do wtyczki qTip naprawia to jednak. Zobacz tutaj: http://craigsworks.com/projects/forums/thread-solved-qtip-1-0-0rc3-does-not-work-with-latest-jquery-release – tchaymore

+4

Spojrzałem na Qtip dzisiaj i podczas gdy to robi praca ma kilka wadliwych stron: nie była od jakiegoś czasu aktualizowana, brakuje jej lub nie udokumentowała pewnych oczywistych rzeczy (chcesz zbudować tekst wskazówki z funkcją, która jest wywoływana, gdy wyświetlana jest wskazówka) i jest spory (częściowo dlatego, że wydaje się zawierać wiele rzeczy, takich jak stylizacja zaokrąglonych narożników). Mam nadzieję, że nie jest to postrzegane jako coś negatywnego - po prostu próbując kogoś uratować. Zdecydowanie warte rozważenia, ale są pewne wady. – Cymen

3

Wygląda na to, że nie chcesz myszy nad wydarzeniami: chcesz wywołać funkcję hover() jQuery.

To, czego się chce, to "bogata" podpowiedź, w takim przypadku proponuję jQuery tooltip. Za pomocą opcji bodyHandler możesz umieścić dowolny kod HTML.

+0

Hej, dzięki za super szybką odpowiedź! Właśnie przejrzałem dokumentację i nie jestem pewien, czy istnieje opcja, aby "etykieta narzędziowa" pozostała w ustalonej pozycji, aby można było na nią kliknąć i kliknąć łącze. Czy używałeś tego wcześniej? W międzyczasie pobierzę i zacznę grać – jakejgordon

50

Można to łatwo zrobić również za pomocą zdarzenia mouseover. Zrobiłem to i nie zajmuje to w ogóle 200 linii. Zacznij od wyzwalania zdarzenia, a następnie użyj funkcji, która utworzy etykietkę narzędzia.

$('span.clickme').mouseover(function(event) { 
    createTooltip(event);    
}).mouseout(function(){ 
    // create a hidefunction on the callback if you want 
    //hideTooltip(); 
}); 

function createTooltip(event){   
    $('<div class="tooltip">test</div>').appendTo('body'); 
    positionTooltip(event);   
}; 

Następnie należy utworzyć funkcję, że stanowisko podpowiedź z przesunięciem położenia elementu DOM, który wywołał zdarzenie mouseover, jest to wykonalne z css.

function positionTooltip(event){ 
    var tPosX = event.pageX - 10; 
    var tPosY = event.pageY - 100; 
    $('div.tooltip').css({'position': 'absolute', 'top': tPosY, 'left': tPosX}); 
}; 
+1

Proste i użyteczne, nie ma potrzeby wtyczki XX ko, kiedy można je łatwo napisać. PS: position: absolute is missing :) – iwalktheline

+1

Prawdopodobnie chcesz dodać jednostki "px" do swoich liczb całkowitych. ''top': tPosY + 'px'' i tak dalej. – Robusto

+1

$ ("span.klickme") - to jest złe :) – formatc

4

OK, po niektórych pracach jestem w stanie uzyskać "bańkę", która pojawia się i znika we właściwym czasie. Jest wiele stylizacji, które muszą się wydarzyć, ale jest to w zasadzie kod, którego użyłem.

<script type="text/javascript"> 
    //--indicates the mouse is currently over a div 
    var onDiv = false; 
    //--indicates the mouse is currently over a link 
    var onLink = false; 
    //--indicates that the bubble currently exists 
    var bubbleExists = false; 
    //--this is the ID of the timeout that will close the window if the user mouseouts the link 
    var timeoutID; 

    function addBubbleMouseovers(mouseoverClass) { 
     $("."+mouseoverClass).mouseover(function(event) { 
      if (onDiv || onLink) { 
       return false; 
      } 

      onLink = true; 

      showBubble.call(this, event); 
     }); 

     $("." + mouseoverClass).mouseout(function() { 
      onLink = false; 
      timeoutID = setTimeout(hideBubble, 150); 
     }); 
    } 

    function hideBubble() { 
     clearTimeout(timeoutID); 
     //--if the mouse isn't on the div then hide the bubble 
     if (bubbleExists && !onDiv) { 
      $("#bubbleID").remove(); 

      bubbleExists = false; 
     } 
    } 

    function showBubble(event) { 
     if (bubbleExists) { 
      hideBubble(); 
     } 

     var tPosX = event.pageX + 15; 
     var tPosY = event.pageY - 60; 
     $('<div ID="bubbleID" style="top:' + tPosY + '; left:' + tPosX + '; position: absolute; display: inline; border: 2px; width: 200px; height: 150px; background-color: Red;">TESTING!!!!!!!!!!!!</div>').mouseover(keepBubbleOpen).mouseout(letBubbleClose).appendTo('body'); 

     bubbleExists = true; 
    } 

    function keepBubbleOpen() { 
     onDiv = true; 
    } 

    function letBubbleClose() { 
     onDiv = false; 

     hideBubble(); 
    } 


    //--TESTING!!!!! 
    $("document").ready(function() { 
     addBubbleMouseovers("temp1"); 
    }); 
</script> 

Oto urywek html że idzie z nim:

<a href="" class="temp1">Mouseover this for a terribly ugly red bubble!</a> 
1

AUTORESIZE prosty 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); 
} 
4

mam zaprogramowany użytecznych jQuery Plugin do tworzenia łatwo inteligentnych bubble pop-upów tylko linii kodu w jQuery!

Co możesz zrobić: - dołączaj wyskakujące okienka do dowolnego elementu DOM! - zdarzenia mouseover/mouseout zarządzane automatycznie! - ustaw własne zdarzenia pop-upów! - twórz inteligentne zacienione wyskakujące okienka! (w IE też!) - wybierz szablony stylu popup w czasie wykonywania! - wstaw wiadomości HTML wewnątrz wyskakujących okienek! - ustawić wiele opcji jak: odległości, prędkości, opóźnienia, kolory ...

Popup na cienie i pokolorowane szablony są w pełni obsługiwane przez Internet Explorer 6+ , Firefox, Opera 9+, Safari

można pobrać ze źródeł http://plugins.jquery.com/project/jqBubblePopup

2

Próbuję zrobić „bańki”, które mogą popup, gdy zdarzenie onmouseover jest zwolniony i pozostanie otwarta tak długo, jak mysz jest nad elementem, który rzucił zdarzenie onmouseover lub jeżeli mysz zostaje przeniesiona do bańki. Moja bańka będą musiały mieć wszystkie sposoby html i stylizacji w tym hiperłączy, obrazów itp

Wszystkie te wydarzenia w pełni zarządzany przez ten plugin ...

http://plugins.jquery.com/project/jqBubblePopup

+0

Ten link nie jest już dobry ... –

11

Mimo że qTip (zaakceptowana odpowiedź) jest dobra, zacząłem go używać i brakowało mu niektórych funkcji, których potrzebowałem.

Natknąłem się na PoshyTip - jest bardzo elastyczny i naprawdę łatwy w użyciu. (I mogłem zrobić, co było mi potrzebne)

2

Nowa wersja 3.0 wtyczki jQuery Bubble Popup obsługuje jQuery v.1.7.2, obecnie najnowszą i stabilną wersję najbardziej znanej biblioteki javascript.

Najciekawszą cechą wersji 3.0 jest to, że można używać razem jQuery & Bubble wtyczki Popup z innymi bibliotekami i JavaScript ram jak script.aculo.us, Mootols lub Prototype ponieważ wtyczka jest całkowicie zamknięty, aby uniknąć problemów ze zgodnością ;

jQuery Bubble Popup został przetestowany i obsługuje wiele znanych i "nieznanych" przeglądarek; patrz dokumentacja dla pełnej listy.

Podobnie jak poprzednie wersje, wtyczka jQuery Bubble Popup nadal jest wydana na licencji MIT; Możesz używać jQuery Bubble Popup w komercyjnych lub osobistych projektach, o ile nagłówek praw autorskich pozostanie nienaruszony.

pobierz najnowszą wersję lub odwiedzić żywo dema i tutoriale na http://www.maxvergelli.com/jquery-bubble-popup/

1

Możesz użyć qTip do tego; Jednak trzeba trochę napisać, aby uruchomić go na zdarzenie mouseover; A jeśli chcesz mieć domyślny znak wodny na swoich polach tekstowych, musisz użyć wtyczki znaku wodnego ...

Uświadomiłem sobie, że prowadzi to do wielu powtarzalnych kodów; Napisałem więc wtyczkę na górze qTip, dzięki czemu naprawdę łatwo jest dołączyć informacyjne wyskakujące okienko do pól formularza. Możesz to sprawdzić tutaj: https://bitbucket.org/gautamtandon/jquery.attachinfo

Mam nadzieję, że to pomoże.