JQuery Popup Bubble / Tooltip [fechado]

99

Estou tentando fazer uma "bolha" que pode onmouseoveraparecer quando o evento é disparado e permanecer aberta enquanto o mouse estiver sobre o item que lançou o onmouseoverevento OU se o mouse for movido para dentro da bolha. Minha bolha precisará ter todos os tipos de HTML e estilo, incluindo hiperlinks, imagens etc.

Eu basicamente fiz isso escrevendo cerca de 200 linhas de JavaScript feio, mas eu realmente gostaria de encontrar um plugin jQuery ou alguma outra maneira de limpar isso um pouco.

Jakejgordon
fonte
1
@bluefeet Off topic? Seriamente? O cara fez uma pergunta sobre como encurtar suas 200 linhas de código usando JQuery, e ele foi usado quase um quarto de milhão de vezes (acabou de resolver meu problema) e você o desmarcou? O que dizer disso convida a respostas mais opinativas do que qualquer outra pergunta?
Chris Sharp
@ChrisSharp Você leu o motivo pelo qual foi fechado? Ele pede especificamente "um bom plugin jQuery para fazer bolhas extravagantes". Perguntas que pedem recomendações estão fora do tópico, mas se você acha que isso poderia ser reescrito para torná-lo dentro do tópico, sinta-se à vontade para sugerir uma edição para colocá-lo em forma.
Taryn

Respostas:

158

Qtip é o melhor que já vi. É licenciado pelo MIT, lindo, tem toda a configuração que você precisa.

Minha opção leve favorita é embriagada . Também licenciado pelo MIT. Ele inspirou o plugin de dicas do Bootstrap .

Koobz
fonte
6
De longe o melhor. Uma linha de código versus todas as outras grandes soluções que outros ofereceram. Espero que esta resposta seja votada.
Peter Walke
2
Qtip tem problemas de compatibilidade com jQuery 1.4+. No entanto, a correção simples de uma linha para o plug-in qTip corrige isso. Veja aqui: craigsworks.com/projects/forums/…
tchaymore
4
Eu olhei para o Qtip hoje e enquanto ele funciona, existem alguns lados negativos: não foi atualizado por um tempo, está faltando ou não documentou algumas coisas óbvias (deseja construir um texto de dica de ferramenta com uma função que é chamada quando a dica é exibido) e é um download pesado (em parte porque parece incluir muitas coisas, como estilo de cantos arredondados). Esperançosamente não visto como negativo - apenas tentando salvar alguém algum tempo. Definitivamente, vale a pena considerar, mas existem algumas desvantagens.
Cymen de
4
@Cymen, eu não posso falar sobre como as coisas eram por volta de setembro de '10, mas nada do que você diz é mais verdade. É: ativo, bem documentado e permite tamanhos de download muito personalizáveis ​​à la jQuery UI.
Kirk Woll
52

Isso também pode ser feito facilmente com o evento mouseover. Já fiz isso e não são necessárias 200 linhas. Comece acionando o evento e, em seguida, use uma função que criará a dica de ferramenta.

$('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);        
};

Em seguida, você cria uma função que posiciona a dica de ferramenta com a posição de deslocamento do elemento DOM que acionou o evento mouseover, isso pode ser feito com css.

function positionTooltip(event){
    var tPosX = event.pageX - 10;
    var tPosY = event.pageY - 100;
    $('div.tooltip').css({'position': 'absolute', 'top': tPosY, 'left': tPosX});
};
Deeenes
fonte
1
Simples e útil, não há necessidade de um plugin XX ko quando você pode escrevê-lo facilmente. PS: posição: falta o absoluto :)
kheraud 01 de
1
Você provavelmente deseja adicionar unidades "px" aos seus inteiros. 'top': tPosY + 'px'e assim por diante.
Robusto
1
$ ('span.klickme') - isso é ruim :)
formatc
Eu gosto da sua abordagem. Maneira muito fácil de fazer sem usar qualquer biblioteca externa
AMIC MING
12

Embora qTip (a resposta aceita) seja bom, comecei a usá-lo e faltavam alguns recursos de que precisava.

Então me deparei com o PoshyTip - é muito flexível e muito fácil de usar. (E eu poderia fazer o que fosse necessário)

Bozho
fonte
4

Ok, depois de algum trabalho eu consigo fazer uma "bolha" aparecer e ir embora na hora certa. Ainda há muito estilo que precisa acontecer, mas esse é basicamente o código que usei.

<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>

Aqui está um snippet do html que o acompanha:

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

Eu programei um plugin jQuery útil para criar pop-ups de bolhas facilmente inteligentes com apenas uma linha de código em jQuery!

O que você pode fazer: - anexar pop-ups a qualquer elemento DOM! - eventos de mouseover / mouseout gerenciados automaticamente! - definir eventos de popups personalizados! - crie popups sombreados inteligentes! (no IE também!) - escolha os modelos de estilo do popup em tempo de execução! - insira mensagens HTML dentro de pop-ups! - defina várias opções como: distâncias, velocidade, atrasos, cores ...

As sombras e os modelos coloridos do Popup são totalmente suportados pelo Internet Explorer 6+, Firefox, Opera 9+, Safari

Você pode baixar fontes em http://plugins.jquery.com/project/jqBubblePopup

max
fonte
3

Parece-me que você não quer os eventos do mouse sobre os eventos: você quer o evento hover () do jQuery.

E o que você parece querer é uma dica de ferramenta "rica", caso em que sugiro uma dica de ferramenta jQuery . Com a opção bodyHandler, você pode inserir HTML arbitrário.

cletus
fonte
Ei, obrigado pela resposta super rápida! Acabei de folhear a documentação e não tenho certeza se há uma opção para a "dica de ferramenta" ficar em uma posição fixa para que você possa mover o mouse sobre ela e clicar em um link. Você já usou isso antes? Enquanto isso, vou fazer o download e começar a jogar
jakejgordon,
2

Estou tentando fazer uma "bolha" que pode aparecer quando o evento onmouseover é disparado e permanecerá aberta enquanto o mouse estiver sobre o item que lançou o evento onmouseover OU se o mouse for movido para dentro da bolha. Minha bolha precisará ter todos os tipos de html e estilo, incluindo hiperlinks, imagens, etc.

Todos esses eventos totalmente gerenciados por este plugin ...

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

max
fonte
Este link não é mais válido ...
Prescott Chartier
2

A nova versão 3.0 do plugin jQuery Bubble Popup suporta jQuery v.1.7.2, atualmente a versão mais recente e estável da mais famosa biblioteca javascript.

O recurso mais interessante da versão 3.0 é que você pode usar o plugin jQuery & Bubble Popup junto com qualquer outra biblioteca e frameworks javascript como Script.aculo.us, Mootols ou Prototype porque o plugin é completamente encapsulado para evitar problemas de incompatibilidade;

jQuery Bubble Popup foi testado e suporta muitos navegadores conhecidos e “desconhecidos”; veja a documentação para a lista completa.

Como nas versões anteriores, o plugin jQuery Bubble Popup continua a ser lançado sob a licença MIT; Você é livre para usar o jQuery Bubble Popup em projetos comerciais ou pessoais, desde que o cabeçalho de copyright seja deixado intacto.

baixe a versão mais recente ou visite as demonstrações e tutoriais ao vivo em http://www.maxvergelli.com/jquery-bubble-popup/

Max
fonte
1

Balão pop-up simples de tamanho automático

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
fonte
1

Tiptip também é uma boa biblioteca.

alguma chamada
fonte
1

Você pode usar qTip para isso; No entanto, você teria que codificar um pouco para iniciá-lo no evento mouseover; E caso você queira uma marca d'água padrão em seus campos de texto, você terá que usar o plugin de marca d'água ...

Percebi que isso leva a muitos códigos repetitivos; Então, escrevi um plugin no topo do qTip que torna realmente fácil anexar pop-up informativo aos campos do formulário. Você pode conferir aqui: https://bitbucket.org/gautamtandon/jquery.attachinfo

Espero que isto ajude.

Gautam Tandon
fonte