Skip to content

The popovertargetaction Attribute

Global Attribute NEW

The popovertargetaction attribute specifies what action a button should perform on a popover element: show it, hide it, or toggle it. It works in combination with the popovertarget attribute to provide fine-grained control over popover behavior.

<button popovertarget="popover-id" popovertargetaction="action">Button</button>
ValueDescriptionBehavior
toggle (default)Toggle the popoverOpens if closed, closes if open
showShow the popoverOnly opens, won’t close if already open
hideHide the popoverOnly closes, won’t open if already closed
Result
Result
Result
Result

Switches between open and closed states:

<button popovertarget="menu">Menu</button>
<!-- Same as -->
<button popovertarget="menu" popovertargetaction="toggle">Menu</button>
<div id="menu" popover>Content</div>

Behavior:

  • If popover is closed → Opens it
  • If popover is open → Closes it

Only opens the popover:

<button popovertarget="menu" popovertargetaction="show">
Open Menu
</button>
<div id="menu" popover>Content</div>

Behavior:

  • If popover is closed → Opens it
  • If popover is already open → Does nothing

Use cases:

  • Open buttons in multi-step workflows
  • Explicit “show” actions
  • When you have separate open/close buttons

Only closes the popover:

<button popovertarget="menu" popovertargetaction="hide">
Close Menu
</button>
<div id="menu" popover>Content</div>

Behavior:

  • If popover is open → Closes it
  • If popover is already closed → Does nothing

Use cases:

  • Close buttons inside popovers
  • Explicit “dismiss” actions
  • Cancel buttons in dialogs
<!-- Good: Toggle for simple menus -->
<button popovertarget="menu" popovertargetaction="toggle">
Menu
</button>
<!-- Good: Separate show/hide for clarity -->
<button popovertarget="dialog" popovertargetaction="show">
Open Dialog
</button>
<!-- Inside the dialog -->
<button popovertarget="dialog" popovertargetaction="hide">
Close
</button>
<!-- Button text matches action -->
<button popovertarget="menu" popovertargetaction="show">
Open Menu
</button>
<button popovertarget="menu" popovertargetaction="hide">
Close Menu
</button>
<!-- Generic text with toggle -->
<button popovertarget="menu" popovertargetaction="toggle">
Menu
</button>

3. Provide Close Buttons for Manual Popovers

Section titled “3. Provide Close Buttons for Manual Popovers”
<div popover="manual">
<!-- Manual popovers need explicit close -->
<button popovertarget="this-popover" popovertargetaction="hide">
</button>
Content...
</div>
<!-- Step 1 -->
<button
popovertarget="step1"
popovertargetaction="hide"
popovertarget-next="step2"
onclick="document.getElementById('step2').showPopover()">
Next
</button>
<!-- Step 2 -->
<button
popovertarget="step2"
popovertargetaction="hide"
onclick="document.getElementById('step1').showPopover()">
Previous
</button>

Access the action value via JavaScript:

const button = document.getElementById('myButton');
// Set action
button.setAttribute('popovertargetaction', 'show');
// Get action
const action = button.getAttribute('popovertargetaction');
console.log(action); // "show", "hide", or "toggle"
// Use popoverTargetAction property (Camel case)
button.popoverTargetAction = 'hide';
console.log(button.popoverTargetAction); // "hide"
const popover = document.getElementById('my-popover');
popover.addEventListener('toggle', (event) => {
if (event.newState === 'open') {
console.log('Popover opened');
} else {
console.log('Popover closed');
}
});
// Change button text based on state
const toggleBtn = document.getElementById('toggle-btn');
popover.addEventListener('toggle', (event) => {
if (event.newState === 'open') {
toggleBtn.textContent = 'Close Menu';
} else {
toggleBtn.textContent = 'Open Menu';
}
});
<button popovertarget="sidebar" popovertargetaction="show">
Open Sidebar
</button>
<!-- Inside sidebar -->
<div id="sidebar" popover="manual">
<button popovertarget="sidebar" popovertargetaction="hide">
Close
</button>
Content...
</div>
<button id="menu-toggle" popovertarget="menu" popovertargetaction="toggle">
<span id="icon"></span>
<span id="text">Menu</span>
</button>
<script>
document.getElementById('menu').addEventListener('toggle', (e) => {
const icon = document.getElementById('icon');
const text = document.getElementById('text');
if (e.newState === 'open') {
icon.textContent = '';
text.textContent = 'Close';
} else {
icon.textContent = '';
text.textContent = 'Menu';
}
});
</script>
BrowserSupport
Chrome114+
Edge114+
Safari17+
Firefox125+ (behind flag)