我正在尝试使用dialog
元素。
当对话框/模态关闭时,主体应该是可滚动的。
当对话框/模式打开时,如果它有很大的内容,对话框/模式应该是可滚动的。
然而,当对话框/模态打开时,我不希望滚动同时应用于对话框/模态 * 和 * 正文背景,这是默认情况下它所做的。
例如:https://output.jsbin.com/mutudop/3。
当对话框/模式打开时,如何使滚动仅应用于对话框/模式内容?
注意:我只对使用原生dialog
元素的解决方案感兴趣。
我正在尝试使用dialog
元素。
当对话框/模态关闭时,主体应该是可滚动的。
当对话框/模式打开时,如果它有很大的内容,对话框/模式应该是可滚动的。
然而,当对话框/模态打开时,我不希望滚动同时应用于对话框/模态 * 和 * 正文背景,这是默认情况下它所做的。
例如:https://output.jsbin.com/mutudop/3。
当对话框/模式打开时,如何使滚动仅应用于对话框/模式内容?
注意:我只对使用原生dialog
元素的解决方案感兴趣。
5条答案
按热度按时间nzk0hqpo1#
所以我也试了一下,得出了这个结论:
你可能已经注意到我添加了两行JS来隐藏/显示
body
的overflow
,你可能需要它们,因为如果你想检查dialog
是否打开,你不能用纯CSS来定位body
。如果你不想要它们,你可以**删除它们,它工作正常。但是,你会在右侧有两个滚动条。这是没有JS的情况下的外观:
x
的一个字符串
如果你需要任何解释,让我知道,但我相信代码应该是不言自明的。
niknxzdl2#
这个答案考虑到了escape键。我将
keydown
事件侦听器添加到document.documentElement
而不是实际的dialog
元素。这是因为当dialog
具有keydown
事件侦听器时,它并不总是触发。例如,如果dialog
打开,其中的一个按钮具有焦点,并且您按下escape键,keydown
事件侦听器 * 将 * 触发。但让我们假设dialog
中有一些文本,您突出显示文本,然后按escape键。在这种情况下,keydown
事件侦听器将 * 不 * 触发。ccrfmcuu3#
2023/2024解决方案(仅限JavaScript / CSS)
现在可以使用CSS :has选择器来实现这一点。
添加以下CSS:
字符串
如果您使用tailwindcss:
型
上面的CSS将在
dialog
元素打开时从主体中删除滚动。目前所有主流浏览器都支持
:has
选择器。请查看here的详细兼容性。的字符串
7eumitmz4#
更新
我创建了另一个例子,如果你的主内容比你的主内容大,你可以在容器上将
position
设置为fixed
。原始答案
你可以在对话框上设置一个
max-height
,并相应地设置对话框内容的样式。见下面的例子。x
的一个字符串
bwntbbo35#
简单的解决方案是:一旦mnodel被显示,使一个更多的DIV作为覆盖整个屏幕的覆盖,在那个地方css { pointer-events:none}和模型将被放置在上面。用户不能点击身体内容以外的模型数据。
创建示例:http://jsfiddle.net/z3sgvnox/
字符串
CSS
型
JS:
型