Rollover Pop Ups

Roll over text, a link, or an image in a div to have it trigger an animated pop up window.

by Colin Soderstrom

HTML

<div class="bubbleInfo">
  <div class="trigger" id="testing"><img src="http://colinsoderstrom.com/images/CSLogo1.gif" width="64" height="76" alt="CS Logo" title="Colin Soderstrom Web Design" align="left" />
    <p>Text, images, or links can be rolled over to cause the popup.</p>
  </div>
  <div class="popup">
    <p>Regular Text</p>
    <br />
    <p><a href="http://www.w3schools.com/" target="_new">Link to w3schools</a></p><br />
    <a href="http://www.facebook.com/ColinSoderstromWebDesign" alt="Colin's Facebook" title="Find me on Facebook" target="_blank"> <img src="http://colinsoderstrom.com/images/facebookicon.gif" width="40" height="40"/></a> </div>
</div>

CSS

.bubbleInfo {
    position: relative;
    left: 100px;
    top: 100px;
    height: 75px;
    width: 200px;
}
.trigger {
    border-radius: 6px 6px 6px 6px;
    height: 75px;
    width: 200px;
}
.trigger p{
    font-family: Tahoma, Geneva, sans-serif;
    margin-left: 75px;
}
.popup {
    position: absolute;
    display: none; /* keeps the popup hidden if no JS available */
    padding: 10px;
    background-color: #FFFFFF;
    border: 1px solid;
    border-radius: 6px 6px 6px 6px;
    box-shadow: 5px 5px 10px #999;
}
.popup p{
    font-family: Tahoma, Geneva, sans-serif;
}
#testing {
    padding: 10px;
    background-color: #9fb7ff;
    position: relative;
}

JavaScript

$(function () {
  $('.bubbleInfo').each(function () {
    // options
    var distance = 10;
    var time = 250;
    var hideDelay = 500;
    var hideDelayTimer = null;
    // tracker
    var beingShown = false;
    var shown = false;
    var trigger = $('.trigger', this);
    var popup = $('.popup', this).css('opacity', 0);

    // set the mouseover and mouseout on both element
    $([trigger.get(0), popup.get(0)]).mouseover(function () {
      // stops the hide event if we move from the trigger to the popup element
      if (hideDelayTimer) clearTimeout(hideDelayTimer);

      // don't trigger the animation again if we're being shown, or already visible
      if (beingShown || shown) {
        return;
      } else {
        beingShown = true;

        // reset position of popup box
        popup.css({
          top: -75,
          left: -75,
          display: 'block' // brings the popup back in to view
        })

        // (we're using chaining on the popup) now animate it's opacity and position
        .animate({
          top: '-=' + distance + 'px',
          opacity: 1
        }, time, 'swing', function() {
          // once the animation is complete, set the tracker variables
          beingShown = false;
          shown = true;
        });
      }
    }).mouseout(function () {
      // reset the timer if we get fired again - avoids double animations
      if (hideDelayTimer) clearTimeout(hideDelayTimer);
      
      // store the timer so that it can be cleared in the mouseover if required
      hideDelayTimer = setTimeout(function () {
        hideDelayTimer = null;
        popup.animate({
          top: '+=' + distance + 'px',
          opacity: 0
        }, time, 'swing', function () {
          // once the animate is complete, set the tracker variables
          shown = false;
          // hide the popup entirely after the effect (opacity alone doesn't do the job)
          popup.css('display', 'none');
        });
      }, hideDelay);
    });
 ...