Blog

The Popover API: Your New Best Friend for Tooltips

Moeiteloos Tooltips Maken met de Popover API en Nieuwe CSS-functies

Ik heb vaak moeite gehad met het maken van tooltips die er niet alleen goed uitzien, maar ook goed werken op verschillende browsers en schermgroottes. In een van mijn recente projecten heb ik uren besteed aan het oplossen van renderfouten en het aanpassen van code om ervoor te zorgen dat de tooltip er perfect uitzag en goed werkte. Toen ontdekte ik de Popover API, wat alles een stuk makkelijker maakte.

De Popover API, ondersteund door alle grote browsers, vereenvoudigt het maken van tooltips. Bovendien bieden nieuwe CSS-functies zoals anchor en @position-try meer controle over de plaatsing en het gedrag van tooltips, waardoor maatwerk mogelijk is en een soepele gebruikerservaring wordt geleverd. Hoe maken deze nieuwe tools het implementeren van tooltips eenvoudiger? Laten we eens een kijkje nemen.

De Uitdagingen van het Maken van Tooltips

Het implementeren van tooltips is ingewikkelder dan het op het eerste gezicht lijkt. Ontwikkelaars moeten verschillende UI-problemen aanpakken, zoals:

  1. De tooltip goed associëren met het element dat deze triggert
  2. Voorkomen dat de tooltip op onhandige plekken verschijnt
  3. Zorgen dat de tooltip niet buiten het viewport komt
  4. Het toevoegen van de noodzakelijke ARIA-attributen voor toegankelijkheid
Screenshots van tooltips die op een verkeerde manier renderen
Voorbeelden van hoe een tooltip er vreemd uit kan zien

De Popover API Begrijpen

De Popover API pakt deze uitdagingen aan door een gestandaardiseerde manier te bieden om popover-inhoud bovenop andere pagina-inhoud weer te geven. Deze API stelt ontwikkelaars in staat om popovers declaratief te beheren met HTML-attributen of programmatisch via JavaScript, wat een aanzienlijke verbetering is ten opzichte van traditionele methoden.

De Popover API is veelzijdig en kan voor verschillende doeleinden worden gebruikt, waaronder:

  1. Tooltips
  2. Complexe gebruikersinteractieve elementen zoals actiemenu's
  3. Aangepaste toastmeldingen

De Popover API Implementeren

Hier is een eenvoudig voorbeeld om te laten zien hoe je kunt beginnen:

<button id="popover-trigger" popovertarget="popover">More information</button>

<div id="popover" popover>
    Why we need this: We'll send order confirmations and important updates to this email address. Make sure to use an address you check regularly.
</div>

Deze code maakt een eenvoudige tooltip die extra informatie weergeeft wanneer deze wordt getriggerd. Het werkt direct, hoewel de styling wat te wensen overlaat.

Een voorbeeld van de Popover API zonder styling
Standaardweergave van de popover in de meeste browsers

Tooltips Positioneren met CSS

Een van de uitdagingen met tooltips is het positioneren ervan ten opzichte van hun trigger-element. Deze berekening houdt rekening met verschillende factoren, zoals:

  1. Aan welke kant van het trigger-element moet de tooltip worden weergegeven?
  2. Waar bevindt het midden van de tooltip zich ten opzichte van het midden van de trigger?
  3. Is er genoeg ruimte om de tooltip weer te geven?

Het implementeren hiervan in JavaScript kan resulteren in een grote hoeveelheid code. Met de Popover API en nieuwe CSS-functies kunnen we echter hetzelfde effect bereiken met veel minder code:

#popover-trigger {
  anchor-name: --popover-trigger;
}

#popover {
  position: absolute;
  max-width: 250px;
  min-width: 200px;
  position-anchor: --popover-trigger;
  inset-area: right;
}
const popover = document.querySelector("[popover]");
const trigger = document.querySelector("[popovertarget]");

trigger.addEventListener("mouseenter", (event) => {
  popover.showPopover();
});

trigger.addEventListener("mouseleave", (event) => {
  popover.hidePopover();
});

Omgaan met Viewport Overflow

Om ervoor te zorgen dat de tooltip correct werkt wanneer deze niet binnen het viewport past, kunnen we een combinatie van de position-try rule en de @position-try at-rule gebruiken:

#popover {
  ...
  --margin: 8px;
  max-width: 250px;
  min-width: 200px;
  margin: var(--margin);
  position-anchor: --popover-trigger;
  inset-area: right;
  position-try-options: --bottom;
}

@position-try --bottom {
  margin: var(--margin);
  inset-area: bottom;
}

Dit is wat elke eigenschap doet:

  • position-anchor: --popover-trigger;: Verankert de tooltip aan het trigger-element met behulp van een aangepast ankerpunt.
  • inset-area: right;: Positioneert de tooltip aanvankelijk rechts van het trigger-element.
  • position-try-options: --bottom;: Geeft aan dat de browser een alternatieve positie moet proberen als de tooltip buiten het viewport zou vallen.
  • @position-try --bottom { ... }: Bepaalt wat er moet gebeuren als de tooltip opnieuw moet worden gepositioneerd, en verplaatst deze naar de onderkant van het trigger-element met dezelfde marge.

Met wat extra styling ziet het resultaat er als volgt uit:

Een tooltip die zich verplaatst wanneer deze buiten de viewport dreigt te komen
Hoe de tooltip zich gedraagt wanneer deze buiten het viewport valt.

Eindresultaat:

Conclusie

De Popover API en nieuwe CSS-functies vereenvoudigen het proces van het maken en beheren van tooltips en popovers aanzienlijk. Het neemt de complexiteit van het beheren van popovers weg en zorgt ervoor dat ze toegankelijk en correct gepositioneerd zijn. De nieuwe CSS-functies, zoals anchor en @position-fallback, bieden extra maatwerkopties voor het verfijnen van de plaatsing en het gedrag van popovers.

Het is echter belangrijk om de browserondersteuning voor deze functies te controleren, vooral de CSS-eigenschappen, omdat ze mogelijk nog niet in alle browsers worden ondersteund. Bekijk MDN voor de laatste informatie en overweeg om progressieve verbeteringstechnieken te gebruiken indien nodig.

Al met al zijn de Popover API en gerelateerde CSS-functies waardevolle tools voor het maken van gebruiksvriendelijke en toegankelijke tooltips en popovers. Naarmate de browserondersteuning verbetert, kunnen we verwachten dat deze functies op grotere schaal worden toegepast. Persoonlijk ben ik enthousiast om hiermee aan de slag te gaan en eindelijk afscheid te nemen van al die npm-pakketten en aangepaste oplossingen!

← Alle blogposts