1 year ago

#67550

test-img

TinyTiger

How do I close this mobile jQuery tooltip when the trigger text is clicked?

I have a nice mobile-friendly jQuery tooltip taken from here and tweaked slightly to my needs.

It works great on mobile because the tooltip displays when tapped and disapears again after tapping the tooltip popup or anywhere else on the page.

The only time it doesn't disapear on mobile is if you re-tap the text that triggered the tooltip. I would like to change it so when the trigger text is re-tapped it disapears.

The tooltip works for both desktop and mobile, so to experience the mobile interactions I am talking about you will need to put your browser into mobile inspection mode. Otherwise you will just be seeing the hover functionality, which is different to what I describe above.

//Mobile friendly tooltips
jQuery(function() {
  var targets = jQuery('[rel~=tooltip]'),
    target = false,
    tooltip = false,
    title = false;

  targets.bind('mouseenter', function() {
    target = jQuery(this);
    tip = target.attr('title');
    tooltip = jQuery('<div id="tooltip"></div>');

    if (!tip || tip == '')
      return false;

    target.removeAttr('title');
    tooltip.css('opacity', 0)
      .html(tip)
      .appendTo('body');

    var init_tooltip = function() {
      if (jQuery(window).width() < tooltip.outerWidth() * 1.5)
        tooltip.css('max-width', jQuery(window).width() / 2);
      else
        tooltip.css('max-width', 340);

      var pos_left = target.offset().left + (target.outerWidth() / 2) - (tooltip.outerWidth() / 2),
        pos_top = target.offset().top - tooltip.outerHeight() - 20;

      if (pos_left < 0) {
        pos_left = target.offset().left + target.outerWidth() / 2 - 20;
        tooltip.addClass('left');
      } else
        tooltip.removeClass('left');

      if (pos_left + tooltip.outerWidth() > jQuery(window).width()) {
        pos_left = target.offset().left - tooltip.outerWidth() + target.outerWidth() / 2 + 20;
        tooltip.addClass('right');
      } else
        tooltip.removeClass('right');

      if (pos_top < 0) {
        var pos_top = target.offset().top + target.outerHeight();
        tooltip.addClass('top');
      } else
        tooltip.removeClass('top');

      tooltip.css({
          left: pos_left,
          top: pos_top
        })
        .animate({
          top: '+=10',
          opacity: 1
        }, 50);
    };

    init_tooltip();
    jQuery(window).resize(init_tooltip);

    var remove_tooltip = function() {
      tooltip.animate({
        top: '-=10',
        opacity: 0
      }, 50, function() {
        jQuery(this).remove();
      });

      target.attr('title', tip);
    };

    target.bind('mouseleave', remove_tooltip);
    tooltip.bind('click', remove_tooltip);
  });
});
.click-me {
  width: 100px;
  height: 100px;
  background-color: grey;
  padding: 10px;
  color: #fff;
}

#tooltip {
  text-align: left;
  color: #fff;
  background: #222;
  position: absolute;
  z-index: 100;
  padding: 1.5em 2em;
  font-size: 0.9em;
  border-radius: 6px;
}

#tooltip:after
/* triangle decoration */

{
  width: 0;
  height: 0;
  border-left: 10px solid transparent;
  border-right: 10px solid transparent;
  border-top: 10px solid #222;
  content: '';
  position: absolute;
  left: 50%;
  bottom: -10px;
  margin-left: -10px;
}

#tooltip.top:after {
  border-top-color: transparent;
  border-bottom: 10px solid #222;
  top: -20px;
  bottom: auto;
}

#tooltip.left:after {
  left: 10px;
  margin: 0;
}

#tooltip.right:after {
  right: 10px;
  left: auto;
  margin: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="click-me" rel="tooltip" title="Enter your tip here">On mobile, click me to display tooltip and click again to disapear.</div>

javascript

jquery

tooltip

0 Answers

Your Answer

Accepted video resources