Dialog with scrollable backdrop
Rendering a modal Dialog component inside a scrollable backdrop container for dialogs that are taller than the viewport.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
import * as Ariakit from "@ariakit/react";import { useState } from "react";import "./style.css";export default function Example() {const [open, setOpen] = useState(false);return (<>View recipeclassName="dialog"<div className="backdrop" hidden={!open}><div {...props} /></div>)}><div className="header">Homemade CakeClose</div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesentvehicula nisl leo, eget posuere turpis suscipit id. Sed auctor purusurna, imperdiet consectetur est laoreet id. Donec vehicula enim vitaesem molestie commodo quis in lacus. Vestibulum ligula felis, interdumnon risus ut, ultrices euismod urna. Aenean euismod elit tortor, inporttitor risus ornare in. Maecenas condimentum a enim a lacinia.Pellentesque volutpat hendrerit suscipit. Cras pulvinar nunc vitaejusto semper, eu fermentum lorem vulputate. Nulla facilisi. Etiamvestibulum tellus congue urna consectetur, ac mattis massa varius.Etiam vel tellus arcu. Donec a vestibulum orci, ut fringilla sem. Sedvitae augue id lorem tempor imperdiet at et quam.</p><p>Morbi vitae luctus mauris, fermentum vehicula orci. Duis et lobortisnunc, non tempor metus. Curabitur ultrices ante a lorem ornare, velvenenatis felis molestie. Fusce orci nunc, maximus ullamcorper ipsumnon, tristique sagittis diam. Donec sed ante vel massa feugiatcondimentum. Sed rutrum leo id velit semper vulputate. Sed varius sitamet massa sit amet sagittis. Maecenas vel accumsan sem. Nunc commodotincidunt urna et ultricies. Ut et dolor eget lacus consecteturultricies. Aenean condimentum libero mi, nec accumsan mi lacinia sed.Pellentesque pharetra lacus elit, vel aliquam dui tincidunt ut. Inrhoncus porttitor pharetra. Etiam placerat ligula quis metus imperdietsuscipit.</p><p>Pellentesque maximus eu magna at pellentesque. Pellentesque habitantmorbi tristique senectus et netus et malesuada fames ac turpisegestas. Sed vel faucibus leo. Vivamus at mi vel ligula suscipitmalesuada. Aliquam pharetra magna convallis, mattis ipsum id,venenatis risus. Suspendisse pulvinar, mi non condimentum vehicula,magna enim gravida risus, id laoreet massa nibh nec purus. Sedfacilisis, nibh vitae tristique commodo, dolor lacus tempus diam, necblandit massa nulla at leo. Maecenas ut nunc sem. Morbi aliquam nisiet felis vehicula, ultricies viverra massa pharetra. Vestibulumsuscipit feugiat libero ac pulvinar. Nullam ullamcorper augue sedconsequat lacinia. Nam nec nunc eget tellus maximus ullamcorper sitamet vitae nunc. Mauris dignissim mi nunc, nec tincidunt mauris mattisin. In porta semper est eu imperdiet. Sed volutpat, felis vel iaculiseuismod, sapien lorem egestas diam, non elementum risus nisi vitaesem. Nulla vehicula elementum egestas.</p><p>Vivamus varius velit quis facilisis cursus. Cras malesuada turpis acleo gravida, a consectetur diam tincidunt. Nam fermentum, lacus vitaelaoreet efficitur, velit neque cursus nisi, in elementum ante turpisvitae nisi. Sed in varius mauris. Aliquam in interdum mauris. Morbicommodo metus arcu, vitae tincidunt mauris lacinia aliquam. Aliquam inviverra purus, ac pulvinar nunc.</p><p>Duis hendrerit a lacus nec tincidunt. Quisque aliquet enim egetmolestie facilisis. Nulla lacinia est lectus, id lobortis odiobibendum eget. Nulla id bibendum nunc. Vestibulum ornare est eu tempusdignissim. Vestibulum porta porttitor eleifend. Morbi velit tortor,interdum pretium nibh quis, volutpat maximus tortor. Duis varius lacusid bibendum ullamcorper. Duis ac mi vitae nisi finibus semper non velquam.</p></>);}import * as Ariakit from "@ariakit/react";import { useState } from "react";import "./style.css";export default function Example() {const [open, setOpen] = useState(false);return (<>View recipeclassName="dialog"<div className="backdrop" hidden={!open}><div {...props} /></div>)}><div className="header">Homemade CakeClose</div><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesentvehicula nisl leo, eget posuere turpis suscipit id. Sed auctor purusurna, imperdiet consectetur est laoreet id. Donec vehicula enim vitaesem molestie commodo quis in lacus. Vestibulum ligula felis, interdumnon risus ut, ultrices euismod urna. Aenean euismod elit tortor, inporttitor risus ornare in. Maecenas condimentum a enim a lacinia.Pellentesque volutpat hendrerit suscipit. Cras pulvinar nunc vitaejusto semper, eu fermentum lorem vulputate. Nulla facilisi. Etiamvestibulum tellus congue urna consectetur, ac mattis massa varius.Etiam vel tellus arcu. Donec a vestibulum orci, ut fringilla sem. Sedvitae augue id lorem tempor imperdiet at et quam.</p><p>Morbi vitae luctus mauris, fermentum vehicula orci. Duis et lobortisnunc, non tempor metus. Curabitur ultrices ante a lorem ornare, velvenenatis felis molestie. Fusce orci nunc, maximus ullamcorper ipsumnon, tristique sagittis diam. Donec sed ante vel massa feugiatcondimentum. Sed rutrum leo id velit semper vulputate. Sed varius sitamet massa sit amet sagittis. Maecenas vel accumsan sem. Nunc commodotincidunt urna et ultricies. Ut et dolor eget lacus consecteturultricies. Aenean condimentum libero mi, nec accumsan mi lacinia sed.Pellentesque pharetra lacus elit, vel aliquam dui tincidunt ut. Inrhoncus porttitor pharetra. Etiam placerat ligula quis metus imperdietsuscipit.</p><p>Pellentesque maximus eu magna at pellentesque. Pellentesque habitantmorbi tristique senectus et netus et malesuada fames ac turpisegestas. Sed vel faucibus leo. Vivamus at mi vel ligula suscipitmalesuada. Aliquam pharetra magna convallis, mattis ipsum id,venenatis risus. Suspendisse pulvinar, mi non condimentum vehicula,magna enim gravida risus, id laoreet massa nibh nec purus. Sedfacilisis, nibh vitae tristique commodo, dolor lacus tempus diam, necblandit massa nulla at leo. Maecenas ut nunc sem. Morbi aliquam nisiet felis vehicula, ultricies viverra massa pharetra. Vestibulumsuscipit feugiat libero ac pulvinar. Nullam ullamcorper augue sedconsequat lacinia. Nam nec nunc eget tellus maximus ullamcorper sitamet vitae nunc. Mauris dignissim mi nunc, nec tincidunt mauris mattisin. In porta semper est eu imperdiet. Sed volutpat, felis vel iaculiseuismod, sapien lorem egestas diam, non elementum risus nisi vitaesem. Nulla vehicula elementum egestas.</p><p>Vivamus varius velit quis facilisis cursus. Cras malesuada turpis acleo gravida, a consectetur diam tincidunt. Nam fermentum, lacus vitaelaoreet efficitur, velit neque cursus nisi, in elementum ante turpisvitae nisi. Sed in varius mauris. Aliquam in interdum mauris. Morbicommodo metus arcu, vitae tincidunt mauris lacinia aliquam. Aliquam inviverra purus, ac pulvinar nunc.</p><p>Duis hendrerit a lacus nec tincidunt. Quisque aliquet enim egetmolestie facilisis. Nulla lacinia est lectus, id lobortis odiobibendum eget. Nulla id bibendum nunc. Vestibulum ornare est eu tempusdignissim. Vestibulum porta porttitor eleifend. Morbi velit tortor,interdum pretium nibh quis, volutpat maximus tortor. Duis varius lacusid bibendum ullamcorper. Duis ac mi vitae nisi finibus semper non velquam.</p></>);}
Components
Rendering a custom backdrop
In this example, the default backdrop element, which is typically rendered as a sibling, is disabled by setting the backdrop
prop to false
. Then, the dialog is wrapped with a custom backdrop element using the render
prop. The element that receives the props
parameter becomes the dialog itself:
<div className="backdrop">
<div {...dialogProps} />
</div>
)}
/>
<div className="backdrop">
<div {...dialogProps} />
</div>
)}
/>
This method allows us to render the backdrop as a parent of the dialog, but still inside the dialog portal. You can learn more about the render
prop on the Composition guide.
Clicking outside
The Ariakit Dialog component automatically closes when users click outside the dialog. This behavior is controlled by the hideOnInteractOutside
prop, which is enabled by default.
However, Ariakit will make sure the dialog is not closed when users interact with the scrollbar on a container element.