我一直在寻找一种“灯箱”类型的解决方案,它允许这样做,但还没有找到(请提出建议,如果您知道的话)。
我尝试重新创建的行为就像单击图片时在Pinterest上看到的一样。叠加层是可滚动的(
因为整个叠加层像页面顶部的页面一样向上移动 ),但是叠加层 后面 的主体是固定的。
我试图仅使用CSS( _即使用div
覆盖整个页面和正文的覆盖层)overflow: hidden
_来创建它,但这并不能阻止div
其滚动。
如何防止正文/页面滚动但在全屏容器中继续滚动?
理论
查看pinterest网站的当前实现(将来可能会更改),当您打开叠加层时,会将一个noscroll
类应用于该body
元素并overflow:hidden
进行设置,因此该类body
不再可滚动。
叠加(上即时或已经在页面内,并通过可见创建display: block
,它使没有区别)有position : fixed
和overflow-y: scroll
,与top
,left
,right
和bottom
属性设置为0
:这种风格使得覆盖填充整个视口。
该div
覆盖里面,而不是仅仅在position: static
然后就看到垂直滚动条是有关该元素。结果,内容是可滚动的,但是覆盖层保持固定。
关闭缩放时,您可以隐藏叠加层(通过display: none
),然后也可以通过javascript完全删除叠加层(或仅删除其中的内容,具体取决于注入方式)。
作为最后一步,您还必须将noscroll
类删除到body
(这样,溢出属性将返回其初始值)
码
(它通过更改aria-hidden
叠加层的属性来显示和隐藏它并增加其可访问性而起作用)。
标记
(打开按钮)
<button type="button" class="open-overlay">OPEN LAYER</button>
(叠加和关闭按钮)
<section class="overlay" aria-hidden="true">
<div>
<h2>Hello, I'm the overlayer</h2>
...
<button type="button" class="close-overlay">CLOSE LAYER</button>
</div>
</section>
的CSS
.noscroll {
overflow: hidden;
}
.overlay {
position: fixed;
overflow-y: scroll;
top: 0; right: 0; bottom: 0; left: 0; }
[aria-hidden="true"] { display: none; }
[aria-hidden="false"] { display: block; }
Javascript (香草JS)
var body = document.body,
overlay = document.querySelector('.overlay'),
overlayBtts = document.querySelectorAll('button[class$="overlay"]');
[].forEach.call(overlayBtts, function(btt) {
btt.addEventListener('click', function() {
/* Detect the button class name */
var overlayOpen = this.className === 'open-overlay';
/* Toggle the aria-hidden state on the overlay and the
no-scroll class on the body */
overlay.setAttribute('aria-hidden', !overlayOpen);
body.classList.toggle('noscroll', overlayOpen);
/* On some mobile browser when the overlay was previously
opened and scrolled, if you open it again it doesn't
reset its scrollTop property */
overlay.scrollTop = 0;
}, false);
});
最后,这是另一个示例,其中,通过将CSS transition
应用于opacity
属性,叠加层以淡入效果打开。padding- right
当滚动条消失时,还应用a来避免基础文本上的重排。
的CSS
.noscroll { overflow: hidden; }
@media (min-device-width: 1025px) {
/* not strictly necessary, just an experiment for
this specific example and couldn't be necessary
at all on some browser */
.noscroll {
padding-right: 15px;
}
}
.overlay {
position: fixed;
overflow-y: scroll;
top: 0; left: 0; right: 0; bottom: 0;
}
[aria-hidden="true"] {
transition: opacity 1s, z-index 0s 1s;
width: 100vw;
z-index: -1;
opacity: 0;
}
[aria-hidden="false"] {
transition: opacity 1s;
width: 100%;
z-index: 1;
opacity: 1;
}
问题内容: 我使用jQueryMobile为iOS和Android创建了一个网站。 我不希望文档本身滚动。相反,只有一个区域(一个元素)应该是可滚动的(通过css属性)。 所以我通过以下方式禁用了文档滚动: 但这也将禁用文档中所有其他元素的滚动,无论是否设置。 我该如何解决? 问题答案: 终于,我开始工作了。真的很简单:
我有一个,其元素样式如下: 我需要允许滚动沿Y轴当它变得高于300px,这工作很好。但我需要将设置为滚动条本身。 我尝试使用这个元素样式: 当它隐藏滚动条时,它也不允许滚动。有没有一种方法可以在滚动条不可见的情况下滚动?
问题内容: 在IE10中,滚动条并不总是存在的……当它出现时以覆盖的形式出现……这是一个很酷的功能,但是我想为我的特定网站关闭它,因为它是一个全屏应用程序,而我徽标和菜单丢失了。 问题答案: 搜寻了一下之后,我偶然发现了一个讨论,其中“蓝墨水”留下的评论指出: 检查页面,我设法使用以下方法重现了这些页面: @ -ms-viewport {width:device-width; } 这会导致滚动条变
问题内容: 我想创建一个可以滚动但不显示滚动条的div。我已经找到了Webkit的解决方案(如下),但是如何在其他浏览器中实现呢? 我宁愿避免使用javascript插件。希望找到CSS或特定于供应商的解决方案。 问题答案: 您必须将可滚动div包裹在另一个div中,以隐藏滚动条。 。 顺便说一句:一个漂亮的jQuery小插件jScrollPane使用了相同的技术
问题内容: 我有一个模态框窗口(弹出窗口),其中包含一个iframe, 并且在该 iframe中 有一个可滚动的 div 。 当我滚动iframe的内部DIV,并且达到其上限或下限时, 浏览器本身的窗口就会开始滚动。这是 不想要的行为 。 我已经尝试过类似的操作, 当鼠标进入弹出框区域时,该操作会在onMouseEnter时终止主窗口滚动: e.preventDefault()由于某些原因无法正常
我预计我的< code>UICollectionView会有问题,基本上当我清除约束时,它会完美地滚动,尽管我无法到达底部(但那是另一天的事情),但是宽度太大了,我只能看到我的< code>UICollectionView的左半部分。 现在,当我设置使其适合屏幕时,它将不再滚动。即使UIRefreshControl也不会触发。 我没有办法了,有人有线索吗?或者解决办法? 非常感谢! 编辑:它不会滚