Warm tooltips are instant

In a toolbar only the first tooltip waits; neighbours open instantly.

Emil Kowalski@emilkowalski
Tooltips should have a delay before appearing to prevent accidental activation. Once a tooltip is open, hovering over other tooltips should open them with no delay and no animation. This feels faster without defeating the purpose of the initial delay.
7 Practical Animation TipsRead article ↗

From improve-animations; Radix calls it skipDelayDuration.

Sweep a toolbar

Rest on the first icon, then slide across. Or press Sweep.

Every tooltip waitsBad
delay + 150ms fade, every time0/80ms
Only the first waitsGood
[data-instant] { transition-duration: 0ms }0/80ms
.tooltip {
  opacity: 0;
  transform: scale(0.97);
  transform-origin: 50% 100%;
  transition: opacity 100ms var(--ease-out), transform 100ms var(--ease-out);
}
.tooltip.open { opacity: 1; transform: none; transition-duration: 150ms; }
.tooltip[data-instant] { transition-duration: 0ms; }

The warm window

Set the gap and window, then run it.

Delay 500ms, then warmCold
skipDelayDuration
function onEnter(trigger) {
  if (performance.now() < warmUntil) return open(trigger, { instant: true });
  timer = setTimeout(() => open(trigger, { instant: false }), DELAY);
}

function onLeave() {
  clearTimeout(timer);
  if (isOpen()) warmUntil = performance.now() + WARM_WINDOW;
  close();
}

What it costs a day

Labels read per pass, and passes per day.

Every tooltip waitsWarm after the first
Per pass3.9s650ms
Per day2m 36s26s
Saved per day02m 10s

Why it matters, pros and cons

Why it matters

The delay filters a passing cursor. Once one opens, intent is shown.

Pros

  • Scanning costs one delay, not eight.
  • Still ignores accidental hovers.
  • Built into Radix as skipDelayDuration.

Cons

  • A long window makes labels sticky.
  • Scope it per group, or unrelated toolbars warm up.
  • Touch has no hover; visible labels help there.