Tooltip

<div class="sample-area" data-tooltip-area>
    <h3>Mouse Over Me</h3>
    <div class="tooltip" data-tooltip aria-expanded="false" tabindex="0">This is a tooltip.<br>Move your mouse.</div>
</div>
<div class="sample-area" data-tooltip-area>
    {% if sampleMode == true %}
        <h3>Mouse Over Me</h3>
    {% endif %}
    <div class="tooltip" data-tooltip aria-expanded="false" tabindex="0">{{content}}</div>
</div>
{
  "sampleMode": true,
  "content": "This is a tooltip.<br>Move your mouse."
}
  • Content:
    // Sample area styles here are for presentational purposes only to
    // highlight tooltips functional area. In practice, you should 
    // be setting your own styles here; the only requirement being that
    // your container div be set with a data-tooltip-area attribute
    .sample-area {
        position: relative;
        display: flex;
        align-items: center;
        justify-content: center;
        margin-top: 100px;
        border: 4px dashed color(neutral, light);
        width: 100%;
        height: 100px;
    
        h3 {
            pointer-events: none;
        }
    }
    
    .tooltip {
        @include font-size(14);
    
        position: fixed;
        display: block;
        border-radius: 5px;
        border: 1px solid color(neutral, lighter);
        padding: 10px 15px;
        background-color: color(neutral, lightest);
        pointer-events: none;
        opacity: 0;
        transform: translateX(10px) translateY(-50%);
        transition:
            .2s visibility ease-in-out,
            .2s opacity ease-in-out;
    
        &::before,
        &::after {
            position: absolute;
            top: 50%;
            display: block;
            border-right: 0;
            transform: translateY(-50%) rotate(45deg);
            content: '';
        }
    
        &::before {
            left: -6px;
            width: 10px;
            height: 10px;
            background-color: inherit;
        }
    
        &::after {
            z-index: -1;
            left: -8px;
            width: 12px;
            height: 12px;
            background-color: color(neutral, lighter);
        }
    
        &[aria-expanded='true'],
        &:focus {
            opacity: 1;
        }
    
        &:focus {
            position: absolute;
        }
    }
    
  • URL: /components/raw/tooltip/_tooltip.scss
  • Filesystem Path: components/tooltip/_tooltip.scss
  • Size: 1.5 KB
  • Content:
    const wraps = document.querySelectorAll('[data-tooltip-area]');
    const tooltips = document.querySelectorAll('[data-tooltip]');
    
    // Mouse variables updated whenever the mouse move
    let mouseX = 0;
    let mouseY = 0;
    
    for (let i = 0; i < wraps.length; i++) {
      const tooltip = wraps[i].querySelector('[data-tooltip]');
    
      tooltips[i].addEventListener('focus', () => {
        tooltip.setAttribute('aria-expanded', 'true');
        tooltip.setAttribute('style', `top: 0px; left: 0px`);
      });
    
      tooltips[i].addEventListener('focusout', () => {
        tooltip.setAttribute('aria-expanded', 'false');
      });
    
      wraps[i].addEventListener('mouseenter', () => {
        tooltip.setAttribute('aria-expanded', 'true');
      });
    
      wraps[i].addEventListener('mouseleave', () => {
        tooltip.setAttribute('aria-expanded', 'false');
      });
    
      wraps[i].addEventListener('mousemove', (e) => {
        mouseX = e.clientX;
        mouseY = e.clientY;
    
        tooltip.setAttribute('style', `top: ${mouseY}px; left: ${mouseX}px`);
      }, false);
    }
  • URL: /components/raw/tooltip/tooltip.js
  • Filesystem Path: components/tooltip/tooltip.js
  • Size: 991 Bytes

Usage

A Tooltip is a small information box that appears on hover and provides further information about the respective section.

This tooltip comes with two configuration attributes. The data-tooltip-area attribute should be added to the outer container of the tooltip to track where the tooltip will trigger and move. The data-tooltip attribute should be added to the tooltip content.

Labelling Expectations

  • If the tooltip is visible, it should have aria-expanded set to true. If the tooltip is not visible, aria-expanded is set to false.
  • Each tooltip should have the attribute tabindex="0".

Focus Expectations

  • Tooltips should have a visible keyboard focus state

Keyboard Expectations

  • Tab = Activate tooltip