如何制作滚动条占位符

Posted

技术标签:

【中文标题】如何制作滚动条占位符【英文标题】:How to make a scrollbar placeholder 【发布时间】:2011-09-29 05:09:04 【问题描述】:

我的问题是,例如 overflow:hidden; 删除的浏览器窗口垂直滚动条会在稍后重新出现时使页面跳转。我使用 jQuery 从访问者中删除滚动选项,同时脚本正在运行并将页面滚动到特定点,然后让它再次出现:

www.nebulafilm.dk/index.html?content

我可以为滚动条创建一个占位符,当它不存在时,它不会跳转回来?

或者是否可以“禁用”它并使其“变灰”?

我无法通过搜索找到任何解决方案。我在这里找到了类似的东西:***.com 滚动条总是在那里。但不同之处在于滚动条必须保持禁用状态,即使页面比窗口长。它只能通过我控制的另一个脚本再次“打开”。

这有可能吗?

谢谢。


更新:

是时候更新状态了。

我在使用body 标签上设置的星云背景图片时遇到了一些问题。 当 jQuery 脚本(来自 cwolves 的回答)将填充添加到 html 标记并因此应该将页面上的所有元素推到左侧时,背景图像的行为仍然不正确。

好吧,我发现body 元素的反应不像任何div 元素。它不仅仅是html 标记内的“块”,就像任何其他块元素一样。它有自己的行为,显然不能以同样的方式被欺骗。因此,背景图像在body 上时无法触摸。 但我花了一些时间才意识到......

这个问题的最终解决方案非常简单,以至于当我发现时,我几乎要流泪了,想到了无休止的(我可能会夸大其词)几个小时来调查body。 我只是将所有内容都包装在 <div id="body"> 中,然后将其作为背景图像。突然间,一切都到位了。

发件人:

<body>
...
</body>

body background-image: url(...);

收件人:

<body>
<div id="body">
...
</div>
</body>

还有:

#body background-image: url(...);

body 更明智一点。

不再“跳跃”。好吃。

效果现在已完全运行,您几乎不会注意到滚动条的变化,并且每个细节都适合。 Cwolve 的脚本是完美的,并且会进行精确的计算:

function getScrollBarWidth()
    var div = $('<div><div>' + new Array(100).join('content<br />') + '</div></div>'),
       div2 = div.find('div'),
       body = $(document.body);

    div.css( overflow : 'hidden', width: 100, height: 100, position : 'absolute', left : -1000, top : -1000 );
    body.append(div);

    var width1 = div2.width();
    div.css( overflow : 'auto' );
    var width2 = div2.width();

    div.remove();

    return width1 - width2;

getScrollBarWidth() 将精确地包含滚动条的宽度,无论浏览器如何,我都可以使用它来添加和删除我想要的填充:

    var sWidth = getScrollBarWidth();

    $("body").css('overflow': 'hidden');
    $("html").css('padding-right': sWidth);

    $('html, body').delay(1000).animate(

        scrollTop: $(hash).offset().top - 170

    , 2000, 'swing', function()

        $("body").css('overflow': 'auto');
        $("html").css('padding-right': 0);

    );

非常感谢。这是一个不错的。

【问题讨论】:

【参考方案1】:

您可以使用http://jscrollpane.kelvinluck.com/ 让您对滚动条进行一些控制并以此进行工作。

【讨论】:

【参考方案2】:

让你的内容比容器的宽度小几个像素并切换overflow-y属性怎么样?

滚动条在不同的浏览器/操作系统上可以有不同的宽度。如果您不打算计算滚动条的宽度,最好将其设置得足够宽,以便它适用于所有浏览器。

Example

【讨论】:

这需要准确了解容器的宽度并观察窗口resize 事件并根据更改进行更新。另外,您的20px 差异并不安全,因为滚动条可以比这更宽。 嗯,这很有趣!但是,当我尝试将宽度设置为比窗口小 20 像素时,我不会有问题吗?在该站点上,我没有为页面元素框设置任何特定宽度,而是仅设置可变宽度以使它们居中对齐。然后他们还会跳,正如我所见? @cwolves 是的,这取决于您愿意放在页面上的复杂程度。这总是一个权衡。我认为您的解决方案设计过度,所以我提出了一个替代方案,在功能上进行了小幅权衡,但在性能上有所提高。【参考方案3】:

这个怎么样:

确定当前浏览器中滚动条的宽度 将内容 div 设置为 padding-right: scrollbar-width 在父级上隐藏滚动

动画之后:

删除内容上的 padding-right 在父级上显示滚动

我做了一个演示:http://jsfiddle.net/cwolves/ezLfU/1/

【讨论】:

是的,这是一个解决方案,如果不能直接操作滚动条。但这将取决于浏览器,并且是一项费力的工作。 怎么辛苦?我给了你一个计算滚动条宽度的演示 :) 实际实现需要你添加我制作的函数和高达 3 行代码,这些代码也在演示中(只需更改选择器)。 好吧,您必须为每种浏览器类型找到准确的滚动条宽度,并实施某种浏览器检查。而且它仍然不是一个安全的解决方案。但这是其中的一部分,也是一种可能的解决方案,所以感谢您的回答。 我给了你代码来找到确切的滚动条宽度......不需要额外的检查,它是完全安全的。你可以字面意思删除我给你的代码,用我的选择器替换bodyscreen 谢谢。很抱歉误解了您的代码。它实际上很精彩。虽然我在使其与 &lt;html&gt;&lt;body&gt; 元素作为包装器和内容持有者一起工作时遇到了一些麻烦,但我怀疑这是因为 &lt;body&gt; 不像其他任何元素一样。谢谢,我会用你的回答来解决我的问题。【参考方案4】:

我刚刚查看了您的网站并想到了另一种方法。如果你用 overflow:hidden 隐藏滚动条,你也可以重新实现滚动。

将事件附加到page up/page down/home/end/向上箭头/向下箭头,鼠标滚轮向上/鼠标滚轮向下,然后执行

$(window).scrollTop($(window).scrollTop() + 15)

上面的代码显然很糟糕,只是一个示例,但您可能想尝试一下。

【讨论】:

好的,这是一个可以跨浏览器工作的解决方案。它虽然很复杂,而不是仅仅使滚动条变灰。但这似乎是不可能的。 对。通常浏览器不会让你在滚动条上弄得太多。您希望在您的网站上做一些复杂的事情,因此您可能会得到一个比优雅更复杂的解决方案。【参考方案5】:

显示禁用的滚动条就像设置溢出一样简单:滚动;

仅垂直是overflow-y:scroll

【讨论】:

不不,当页面长于屏幕时,这不会给出禁用的滚动条。然后它开始“工作”,这是我试图阻止的。它必须被禁用或删除并替换为占位符。 啊,不,我不相信使用 javascript 是可能的,你需要一个浏览器插件来操作浏览器元素。我以为你只是想让你的页面在滚动条出现时不“跳转”。您可以做的一件事是设置滚动条的样式以匹配您的页面,但不幸的是它仅适用于 IE(例如:steve-terada.com)

以上是关于如何制作滚动条占位符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 github 上制作占位符文件?

如何在 Android RecyclerView 中制作占位符项目?

如何在顺风CSS中只制作占位符斜体?

如何使用材料在同一行中制作图标和占位符?

UITextField 占位符对齐滚动问题

如何为“选择”框制作占位符?