Search code examples
javascripthtmlcssdom-eventstooltip

How to make this tooltip like this with pure javascript


I need to use JS no JQuery plugins to make a simple tooltip like on the image below.

Click on ? image should open this tooltip and click again on the same image to close it. I think that it's simple for someone with good JS knowledge but I can't do it anyway :(

This is something that I have tried I know it's not too much but I am simply stuck.
How to display it like on the image, how to hide it when it's open and how to add that little triangle in the corner?

myfiddle

<img id="info" src="http://www.craiglotter.co.za/wp-content/uploads/2009/12/craig_question_mark_icon1.png"/>
<div id="ttip">bla bla</div>

document.getElementById('info').addEventListener('click', function(){
    // how to check if it's visible so I can close tooltip
    document.getElementById('ttip').style.display="block";    
});

#info{margin-left:100px;margin-top:50px;}
#ttip
{
    width: 280px;
z-index: 15001;
top: 0px;
left: 0px;
display: none;
    border-color: #666;
background-color: #fff;
color: #666;
    position: relative;
border: 1px solid #666;
padding: 15px 9px 5px 9px;
text-align: left;
word-wrap: break-word;
overflow: hidden;
}

enter image description here


Solution

  • Clean up the css and this will basically do it:

    <script>
        function doTip(e){
              var elem = e.toElement;
              if(elem.getAttribute('data-tip-on')  === 'false') {
    
                elem.setAttribute('data-tip-on', 'true');
                var rect = elem.getBoundingClientRect();          
                var tipId = Math.random().toString(36).substring(7);
                elem.setAttribute('data-tip-id', tipId);
                var tip = document.createElement("div");
                tip.setAttribute('id', tipId);
                tip.innerHTML = elem.getAttribute('data-tip');
                tip.style.top = rect.bottom+ 10 + 'px';
                tip.style.left = (rect.left-200) + 'px';
                tip.setAttribute('class','tip-box');
                document.body.appendChild(tip);
    
              } else {
    
                elem.setAttribute('data-tip-on', 'false');
                var tip = document.getElementById(elem.getAttribute('data-tip-id'));
                tip.parentNode.removeChild(tip);
    
    
              }
        }
        function enableTips(){
            var elems = document.getElementsByClassName('quick-tip');
            for(var i = 0; i < elems.length; i++) { 
                elems[0].addEventListener("click", doTip, false);
    
            }
        }
        window.onload = function(){
            enableTips();
        }
    </script>
    <style>
        .quick-tip {
            background: black;
            color: #fff;
            padding: 5px;
            cursor: pointer;
            height: 15px;
            width: 15px;
            text-align: center;
            font-weight: 900;
            margin-left: 350px;
    
        }
        .tip-box {
        /* change dimensions to be whatever the background image is */
            height: 50px;
            width: 200px;
            background: grey;
            border: 1px solid black; 
            position: absolute;
        }
    </style>
    
    
    <div class="quick-tip" data-tip="THIS IS THE TIP! change elements 'data-tip' to change." data-tip-on="false">?</div>
    
    <script>enableTips(); //might be required for jsfiddle, especially with reloads.</script>
    

    Edit: fixed formatting and a bug. jsfiddle: http://jsfiddle.net/u93a3/