The <hx-partial> tag lets you update multiple elements from a single response, with explicit control over targeting and swap strategy.
Syntax
<hx-partial hx-target="#messages" hx-swap="beforeend"> <div>New message</div> </hx-partial> <hx-partial hx-target="#count"> <span>5</span> </hx-partial>
Attributes
hx-target- Where to place content. Accepts any CSS selector or htmx extended selector, resolved relative to the element that triggered the requestid- Shorthand alternative tohx-target. Targets the element with that ID (e.g.<hx-partial id="messages">targets#messages)hx-swap- Swap style (defaults toinnerHTML)
Either hx-target or id is required. If both are present, hx-target takes precedence.
Relative Targeting
hx-target supports the full htmx extended selector vocabulary — closest, next, previous, find, findAll — resolved relative to the element that triggered the request. This lets the server express structural intent without requiring stable IDs:
<!-- replace the list row containing the button that was clicked --> <hx-partial hx-target="closest li" hx-swap="outerHTML"> <li>Updated item <button hx-post="/edit/2">Edit</button></li> </hx-partial> <!-- update the error element after the input that triggered validation --> <hx-partial hx-target="next .error"> <span class="error">Required</span> </hx-partial>
Avoid targeting an ancestor that the main swap is also replacing — the partial would be swapping into a detached node.
Responses Without Main Content
When a response contains only <hx-partial> tags (no main content), the main target is left untouched. This is by design — partials are true response separators where each section is self-contained, giving the server explicit control over multi-target updates.
Unlike hx-swap-oob, this behavior cannot be changed globally. Use the swapEmpty:true modifier on hx-swap if you need to clear the main target:
<button hx-post="/submit" hx-swap="innerHTML swapEmpty:true">Submit</button>
Alternative Syntax
Template languages that strip unknown tags can use the equivalent <template> form:
<template hx type="partial" hx-target="#messages" hx-swap="beforeend"> <div>New message</div> </template>
See Also
hx-swap-oob, an alternative for simple ID-based updates- Multi-Target Updates for full documentation