Bulle / info-bulle jQuery Popup [fermé]

99

J'essaie de créer une "bulle" qui peut apparaître lorsque l' onmouseoverévénement est déclenché et qui restera ouverte tant que la souris est sur l'élément qui a lancé l' onmouseoverévénement OU si la souris est déplacée dans la bulle. Ma bulle devra avoir toutes les manières de HTML et de style, y compris les hyperliens, les images, etc.

J'ai essentiellement accompli cela en écrivant environ 200 lignes de JavaScript laid, mais j'aimerais vraiment trouver un plugin jQuery ou une autre façon de nettoyer un peu cela.

jakejgordon
la source
1
@bluefeet Hors sujet? Sérieusement? Le gars a posé une question sur la façon de raccourcir ses 200 lignes de code en utilisant JQuery, et il a été utilisé près d'un quart de million de fois (vient de résoudre mon problème) et vous le marquez hors sujet? Qu'en est-il de cela invite des réponses plus opiniâtres que toute autre question?
Chris Sharp
@ChrisSharp Avez-vous lu la raison pour laquelle il a été fermé? Il demande spécifiquement "un bon plugin jQuery pour faire des bulles fantaisistes". Les questions demandant des recommandations sont hors sujet, mais si vous pensez que cela pourrait être réécrit pour en faire un sujet, n'hésitez pas à suggérer une modification pour la mettre en forme.
Taryn

Réponses:

158

Qtip est le meilleur que j'ai vu. C'est sous licence MIT, magnifique, a toute la configuration dont vous avez besoin.

Mon option légère préférée est ivre . Aussi sous licence MIT. Il a inspiré le plugin d'info-bulle de Bootstrap .

Koobz
la source
6
De loin le meilleur. Une ligne de code par rapport à toutes les autres solutions énormes que d'autres ont proposées. J'espère que cette réponse sera votée.
Peter Walke
2
Qtip a des problèmes de compatibilité avec jQuery 1.4+. Une solution simple en une ligne au plug-in qTip le corrige cependant. Voir ici: craigsworks.com/projects/forums/…
tchaymore
4
J'ai regardé Qtip aujourd'hui et même si cela fonctionne, il y a quelques inconvénients: n'a pas été mis à jour depuis un certain temps, est manquant ou n'a pas documenté des choses évidentes (vous voulez créer un texte d'info-bulle avec une fonction qui est appelée lorsque le conseil est affiché) et est un téléchargement lourd (en partie parce qu'il semble inclure beaucoup de choses comme le style des coins arrondis). J'espère que ce n'est pas considéré comme négatif - j'essaie simplement de gagner du temps à quelqu'un d'autre. Cela vaut vraiment la peine d'être considéré, mais il y a des inconvénients.
Cymen
4
@Cymen, je ne peux pas parler de la façon dont les choses se passaient vers septembre 10, mais rien de ce que vous dites n'est plus vrai. Il est: actif, bien documenté et permet des tailles de téléchargement très personnalisables à la jQuery UI.
Kirk Woll
52

Cela peut également être fait facilement avec l'événement mouseover. Je l'ai fait et cela ne prend pas du tout 200 lignes. Commencez par déclencher l'événement, puis utilisez une fonction qui créera l'info-bulle.

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

Ensuite, vous créez une fonction qui positionne l'info-bulle avec la position de décalage de l'élément DOM qui a déclenché l'événement mouseover, c'est faisable avec css.

function positionTooltip(event){
    var tPosX = event.pageX - 10;
    var tPosY = event.pageY - 100;
    $('div.tooltip').css({'position': 'absolute', 'top': tPosY, 'left': tPosX});
};
deeenes
la source
1
Simple et utile, pas besoin de plugin XX ko quand on peut l'écrire facilement. PS: position: il manque absolu :)
kheraud
1
Vous souhaitez probablement ajouter des unités "px" à vos entiers. 'top': tPosY + 'px'etc.
Robusto
1
$ ('span.klickme') - c'est mauvais :)
formatc
J'aime votre approche. Un moyen très simple de se passer d'une bibliothèque externe
AMIC MING
12

Bien que qTip (la réponse acceptée) soit bonne, j'ai commencé à l'utiliser et il manquait certaines fonctionnalités dont j'avais besoin.

Je suis ensuite tombé sur PoshyTip - il est très flexible et vraiment facile à utiliser. (Et je pourrais faire ce dont j'avais besoin)

Bozho
la source
4

Ok, après un peu de travail, je suis capable de faire apparaître une "bulle" et de partir à tous les bons moments. Il y a BEAUCOUP de style qui doit encore se produire, mais c'est essentiellement le code que j'ai utilisé.

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

Voici un extrait du code HTML qui va avec:

<a href="" class="temp1">Mouseover this for a terribly ugly red bubble!</a>
jakejgordon
la source
4

J'ai programmé un plugin jQuery utile pour créer facilement des popups de bulles intelligentes avec seulement une ligne de code dans jQuery!

Ce que vous pouvez faire: - attachez des popups à n'importe quel élément DOM! - événements mouseover / mouseout gérés automatiquement! - définir des événements contextuels personnalisés! - créez des popups intelligents! (dans IE aussi!) - choisissez les modèles de style de popup au moment de l'exécution! - insérez des messages HTML dans des popups! - définir de nombreuses options telles que: distances, vitesse, délais, couleurs…

Les ombres et les modèles colorisés de Popup sont entièrement pris en charge par Internet Explorer 6+, Firefox, Opera 9+, Safari

Vous pouvez télécharger des sources sur http://plugins.jquery.com/project/jqBubblePopup

max
la source
3

Il me semble que vous ne voulez pas que la souris survole les événements: vous voulez l'événement jQuery hover ().

Et ce que vous semblez vouloir, c'est une info-bulle "riche", auquel cas je suggère une info-bulle jQuery . Avec l'option bodyHandler, vous pouvez insérer du HTML arbitraire.

cletus
la source
Hé, merci pour la réponse ultra-rapide! Je viens de parcourir la documentation et je ne suis pas sûr qu'il y ait une option pour que "l'info-bulle" reste dans une position fixe afin que vous puissiez déplacer votre souris dessus et cliquer sur un lien. Avez-vous déjà utilisé cela? En attendant, je vais télécharger et commencer à jouer
jakejgordon
2

J'essaie de créer une "bulle" qui peut apparaître lorsque l'événement onmouseover est déclenché et restera ouverte tant que la souris est sur l'élément qui a lancé l'événement onmouseover OU si la souris est déplacée dans la bulle. Ma bulle devra avoir toutes les manières de html et de style, y compris les hyperliens, les images, etc.

Tous ces événements entièrement gérés par ce plugin ...

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

max
la source
Ce lien n'est plus bon ...
Prescott Chartier
2

La nouvelle version 3.0 du plugin jQuery Bubble Popup prend en charge jQuery v.1.7.2, actuellement la dernière version stable de la plus célèbre bibliothèque javascript.

La caractéristique la plus intéressante de la version 3.0 est que vous pouvez utiliser ensemble le plugin jQuery & Bubble Popup avec toutes les autres bibliothèques et frameworks javascript comme Script.aculo.us, Mootols ou Prototype car le plugin est complètement encapsulé pour éviter les problèmes d'incompatibilité;

jQuery Bubble Popup a été testé et prend en charge de nombreux navigateurs connus et «inconnus»; voir la documentation pour la liste complète.

Comme les versions précédentes, le plugin jQuery Bubble Popup continue d'être publié sous la licence MIT; Vous êtes libre d'utiliser jQuery Bubble Popup dans des projets commerciaux ou personnels tant que l'en-tête du droit d'auteur est laissé intact.

téléchargez la dernière version ou visitez des démos et des didacticiels en direct sur http://www.maxvergelli.com/jquery-bubble-popup/

Max
la source
1

Redimensionner automatiquement la bulle contextuelle simple

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
la source
1

Tiptip est également une belle bibliothèque.

un appel
la source
1

Vous pouvez utiliser qTip pour cela; Cependant, vous devrez coder un peu pour le lancer lors d'un événement survolant la souris; Et au cas où vous voudriez un filigrane par défaut sur vos champs de texte, vous devrez utiliser le plugin de filigrane ...

J'ai réalisé que cela conduit à beaucoup de code répétitif; J'ai donc écrit un plugin au-dessus de qTip qui permet d'attacher très facilement une fenêtre contextuelle d'information aux champs de formulaire. Vous pouvez le vérifier ici: https://bitbucket.org/gautamtandon/jquery.attachinfo

J'espère que cela t'aides.

Gautam Tandon
la source