我一直在寻找一种“灯箱”类型的解决方案,它允许这样做,但还没有找到(如果你知道的话,请提出建议)。
我试图重现的行为就像你在 Pinterest 点击图片时看到的一样。叠加层是可滚动的( _因为整个叠加层像页面顶部的页面一样向上移动_)但叠加层 后面 的主体是固定的。
我试图只用 CSS 来创建它( 即 --- 用 div
覆盖在整个页面和正文的 overflow: hidden
),但它不会阻止 div
从可滚动。
如何保持正文/页面不滚动但继续在全屏容器内滚动?
原文由 PotatoFro 发布,翻译遵循 CC BY-SA 4.0 许可协议
理论
查看 pinterest 网站的当前实现(将来可能会更改),当您打开覆盖时,
noscroll
类应用于body
元素(设置overflow: hidden
) 使body
不再可滚动。即时创建或已在页面中注入并通过
display: block
可见的覆盖 - 没有区别- 有position : fixed
和overflow-y: scroll
top
,left
,right
andbottom
properties set to0
: this style makes the overlay fill the whole viewport (但现在是 2022 年,所以您可以使用inset: 0
代替)。覆盖层内的
div
在position: static
所以垂直滚动条与该元素相关。这导致可滚动但固定的覆盖。当您关闭叠加层时,您必须隐藏它(使用
display: none
),您甚至可以通过 javascript 删除节点(或者只是里面的内容,这取决于您,但也取决于内容的性质)。最后一步是删除应用于
body
的noscroll
类(因此overflow
属性恢复到之前的值)代码
(它通过更改覆盖层的
aria-hidden
属性来显示和隐藏它并增加其可访问性)。标记
(打开按钮)
(覆盖和关闭按钮)
CSS
Javascript (原版 JS)
最后,这是另一个示例,其中覆盖以淡入效果打开,CSS
transition
应用于opacity
属性。当滚动条消失时,还应用padding-right
以避免底层文本重排。CSS