Skip to content

The popovertarget Attribute

Global Attribute NEW

The popovertarget attribute connects a button to a popover element, allowing the button to control (show, hide, or toggle) the popover. It provides a declarative way to create interactive UI without requiring JavaScript.

<button popovertarget="popover-id">Open Popover</button>
<div id="popover-id" popover>Popover content</div>
ValueDescription
ID stringThe id of the popover element to control
Result
Result
Result
Result
Result

By default, popovertarget toggles the popover:

<button popovertarget="my-popover">Toggle</button>
<div id="my-popover" popover>Content</div>
  • First click: Opens popover
  • Second click: Closes popover

Combine with popovertargetaction for specific actions:

<!-- Show only -->
<button popovertarget="menu" popovertargetaction="show">Open</button>
<!-- Hide only -->
<button popovertarget="menu" popovertargetaction="hide">Close</button>
<!-- Toggle (default) -->
<button popovertarget="menu" popovertargetaction="toggle">Toggle</button>
<div id="menu" popover>Menu content</div>

Only <button> and <input type="button|reset|submit"> elements support popovertarget:

<!-- ✓ Works -->
<button popovertarget="popover">Open</button>
<input type="button" popovertarget="popover" value="Open">
<!-- ✗ Doesn't work -->
<div popovertarget="popover">Open</div>
<a popovertarget="popover">Open</a>

Buttons with popovertarget don’t submit forms:

<form>
<input type="text">
<!-- Won't submit form -->
<button popovertarget="help">Help</button>
<!-- Will submit form -->
<button type="submit">Submit</button>
</form>
<!-- Good: Clear action -->
<button popovertarget="menu">Open Menu</button>
<!-- Bad: Unclear -->
<button popovertarget="menu">Click</button>
<button
popovertarget="menu"
aria-label="Open navigation menu"
aria-expanded="false">
Menu
</button>

3. Provide Close Buttons for Manual Popovers

Section titled “3. Provide Close Buttons for Manual Popovers”
<div id="dialog" popover="manual">
<button popovertarget="dialog" popovertargetaction="hide">
Close
</button>
Content...
</div>
<!-- Neutral action -->
<button type="button" popovertarget="info">Info</button>
<!-- Not a form submit -->
<button type="button" popovertarget="help">Help</button>

While popovertarget works declaratively, you can also use JavaScript:

const button = document.getElementById('trigger');
const popover = document.getElementById('my-popover');
// Set target programmatically
button.popoverTargetElement = popover;
// Get target
console.log(button.popoverTargetElement); // Returns the popover element
// Or use setAttribute
button.setAttribute('popovertarget', 'my-popover');

Buttons with popovertarget are fully keyboard accessible:

  • Enter/Space: Activates button and toggles popover
  • Tab: Moves focus to/from button
  • Escape: Closes auto popovers (built-in)
<button
popovertarget="menu"
aria-expanded="false"
aria-controls="menu"
aria-haspopup="true">
Menu
</button>
<div id="menu" popover role="menu">
<button role="menuitem">Item 1</button>
<button role="menuitem">Item 2</button>
</div>
// Update aria-expanded dynamically
const button = document.getElementById('menu-btn');
const popover = document.getElementById('menu');
popover.addEventListener('toggle', (e) => {
button.setAttribute('aria-expanded', e.newState === 'open');
});
<button popovertarget="dropdown">
Options ▼
</button>
<div id="dropdown" popover>
<button>Edit</button>
<button>Delete</button>
<button>Share</button>
</div>
<button popovertarget="info-tooltip" aria-label="More information">
ℹ️
</button>
<div id="info-tooltip" popover class="tooltip">
Additional information here
</div>
<button popovertarget="confirm">Delete Item</button>
<div id="confirm" popover="manual">
<p>Are you sure?</p>
<button popovertarget="confirm" popovertargetaction="hide">Cancel</button>
<button onclick="deleteItem()">Confirm</button>
</div>
BrowserSupport
Chrome114+
Edge114+
Safari17+
Firefox125+ (behind flag)