Pop-over = hint

Gepubliceerd: 26 februari 2025

Chrome 133 bouwt voort op de bestaande popover-functie door een nieuwe modus te introduceren: popover="hint" . Deze door de browser beheerde modus maakt een nieuwe stapelcontext mogelijk die het maken van tooltips en soortgelijke kortstondige zwevende elementen vereenvoudigt. Het vermindert de inspanningen van ontwikkelaars terwijl de ontwerpflexibiliteit behouden blijft.

Inleiding en geschiedenis

Met de Popover API, geïntroduceerd in Chrome 114 , kunt u een toegankelijke zwevende gebruikersinterface maken, zoals menu's en tooltips. Standaard verzorgt popover="auto" de light-dismiss-functionaliteit en het focusbeheer voor u, zonder dat er extra scripting nodig is, zoals beschreven in Introductie van de Popover API . Bij het openen van een popover="auto" popover worden alle andere niet-voorouder-popovers met popover="auto" gesloten, wat zorgt voor een ergonomische API die het meest verstandige doet.

Popovers sluiten andere popovers

<div id="p1" popover>First Popover</div>
<button popovertarget="p1">Open popover 1</button>
<div id="p2" popover>Second Popover</div>
<button popovertarget="p2">Open popover 2</button>

In dit voorbeeld zal het openen van popover 2 popover 1 sluiten, aangezien popover="auto" slechts toestaat dat zo'n popover tegelijk geopend is.

Hoewel dit gedrag goed werkt voor menu's en dialoogvensters, kan het problemen veroorzaken wanneer meerdere typen zwevende gebruikersinterfaces naast elkaar moeten bestaan. Een menu en een tooltip die beide popover="auto" gebruiken, kunnen bijvoorbeeld botsen, waarbij het openen van de tooltip het menu sluit. Dit lijkt misschien een ongewone situatie, maar het komt veel voor in een moderne gebruikersinterface in applicatiestijl. De menu's in de header van github.com gebruiken bijvoorbeeld popovers voor zowel de menu's als de tooltips, waardoor beide onder bepaalde omstandigheden tegelijkertijd zichtbaar zijn:

Een openmenu.
Het GitHub-menu.

Eén manier om dit op te lossen is door popover="manual" te gebruiken voor de tooltip-elementen, waardoor volledige controle over de popover mogelijk is met scripting. Dit vereist echter een herimplementatie van het stapelgedrag, light-dismissal en focusmanagement – ​​precies de taken waarvoor de Popover API is ontworpen. Dit was voor ons aanleiding om manieren te onderzoeken om de API uit te breiden om deze ontbrekende functionaliteit te bieden.

Via ontwikkelaarsonderzoek hebben we twee veelvoorkomende stapelcontexten geïdentificeerd:

  • Persistente gebruikersinterface : bijvoorbeeld menu's en dialoogvensters.
  • Kortstondige gebruikersinterface : bijvoorbeeld hovercards en tooltips.

Om aan beide tegemoet te komen introduceert popover="hint" een tweede stapel, verschillend van popover="auto" , die ervoor zorgt dat menu's open blijven, zelfs als tooltips verschijnen. In plaats van het introduceren van meerdere stapelcontexten voor verschillende UI-typen – wat in wezen z-index opnieuw zou uitvinden – houdt deze aanpak de zaken eenvoudiger door slechts twee brede categorieën te definiëren: persistente UI ( auto ) en kortstondige UI ( hint ). Dit zorgt voor een evenwicht tussen flexibiliteit en het vermijden van het opnieuw opduiken van dezelfde problemen waarmee u te maken kreeg voordat u popover gebruikte.

Gedrag van de nieuwe waarde

Zowel popover="auto" als popover="hint" ondersteunen light distract , wat betekent dat ze automatisch sluiten wanneer de gebruiker erbuiten klikt of op Esc op het toetsenbord drukt. In dit opzicht zijn beide stijlen identiek.

Als het gaat om het geforceerd verbergen van andere popovers, sluit popover="auto" alle andere auto en hint popovers wanneer deze worden geopend, waardoor wordt verzekerd dat slechts één zo'n popover tegelijk actief is (de enige uitzondering hier zijn geneste popovers, die hieronder worden uitgelegd). popover="hint" daarentegen verbergt alleen andere hint popovers geforceerd, waardoor menu's en tooltips open kunnen blijven en naast elkaar kunnen bestaan.

Waar ze het meest van verschillen, is hun nestgedrag. popover="auto" ondersteunt nesten, waardoor een onderliggende popover open kan blijven binnen een andere bovenliggende popover. popover="hint" heeft een speciaal nestgedrag, waarbij de afzonderlijke "stacks" een rol spelen. Wanneer een hint popover zich in een auto popover bevindt, voegt deze zich bij de auto stapel om de contextuele groepering te behouden, wat betekent dat deze open blijft totdat andere auto of hint popovers ervoor zorgen dat deze geforceerd wordt verborgen. Dit zorgt voor intuïtief gedrag, waarbij tooltips andere menu's of popovers niet onderbreken.

Ten slotte is er voor heel verschillende gebruiksscenario's altijd popover="manual" , waarin geen van deze gedragingen zijn ingebakken, waardoor u de precieze functionaliteit en het gedrag kunt definiëren die u nodig hebt.

popover="auto" popover="hint" popover="manual"
Licht afwijzen Ja Ja Nee
Force-huiden: Niet-gerelateerde auto 's en hint Niet-gerelateerde hint Niets
Nesten: Ja Speciaal (eerder beschreven) N.v.t. – geen licht ontslag

Zweeftriggering

Een veelgebruikt UX-patroon is dat tooltips en hovercards door hover worden geactiveerd . Als u de muis gedurende een bepaalde periode over een interessant element beweegt, wordt de hovercard weergegeven. Momenteel moet dat gedrag worden geïmplementeerd via JavaScript, bijvoorbeeld door luisteraars toe te voegen voor de mouseenter en mouseleave -gebeurtenissen. Er is echter nog een andere API in ontwikkeling die hovertriggering declaratief moet maken: de Interest Invokers API .

Deze API is nog steeds een work in progress, maar het algemene idee is om aan veel elementtypen een attribuut met de naam interesttarget toe te voegen, dat hover-triggering-gedrag aan hen verleent:

<a interesttarget="my-hovercard" href="...">
  Hover to show the hovercard
</a>
<span popover="hint" id="my-hovercard">
  This is the hovercard
</span> 

Met de voorgaande HTML zal het bewegen van de <a> -link automatisch de my-hovercard popover weergeven. Als u de aanwijzer van dat element verwijdert, wordt de popover verborgen. Allemaal zonder JavaScript!

Voorbeelden

<button>An interesting button</button>
<div popover="hint">More info about the button</div>
[popover] {
  margin: 0;
  inset: auto;
  position-area: bottom right;
}
const button = document.querySelector('button');
const popover = document.querySelector('[popover]');

button.onmouseenter = () => {
  setTimeout(() => {
    popover.showPopover({source: button});
  }, 500);
}

button.onmouseleave = () => {
  setTimeout(() => {
    popover.hidePopover();
  }, 500);
}
Knop met tooltip.
Probeer dit live uit.

In dit voorbeeld wordt popover="hint" gebruikt om een ​​basistooltip samen te stellen, die meer informatie geeft over de knop wanneer er met de muis over de knop wordt bewogen. De hover-activering wordt verzorgd door gebeurtenishandlers voor mouseenter en mouseleave met eenvoudige vertragingen van 0,5 seconde. Houd er rekening mee dat er een aantal details zijn die in dit voorbeeld niet worden afgehandeld:

  1. Het zweven over de popover zelf verhindert niet dat het wegzweven van een activerend element de popover sluit. Het is dus niet mogelijk om bijvoorbeeld tekst uit de popover te kopiëren of te plakken.
  2. Er is geen sprake van "debouncing": een kleine fractie van een seconde op de knop zweven is voldoende om de popover te activeren, zelfs als de knop snel wordt uitgeschakeld voordat de vertragingstijd is verstreken. In dit geval "flikkert" de tooltip snel open en dicht.
  3. Het voorbeeld is helemaal niet toegankelijk: elke gebruiker die geen muis gebruikt, heeft geen toegang tot de tooltip-inhoud.

Deze tekortkomingen kunnen worden verholpen met extra JavaScript. focus (of misschien keydown en keyup) gebeurtenishandlers zouden bijvoorbeeld moeten worden toegevoegd om toetsenbordgebaseerde activering van de popover te ondersteunen. Voor een uitleg van de dingen die correct moeten worden afgehandeld om ervoor te zorgen dat de tooltip toegankelijk is, zie deze geweldige blogpost van Sarah Higley. Al deze problemen (en meer) worden automatisch declaratief afgehandeld door de Interest Invokers API .

Meer informatie

Zie de functie-uitleg of de HTML-specificatie voor meer details.