当前位置: 首页 > 知识库问答 >
问题:

除非用户向上滚动,否则保持溢出div滚动到底部

锺离穆冉
2023-03-14

我有一个只有300像素大的div,我希望当页面加载滚动到内容的底部时。这个div有动态添加的内容,需要一直向下滚动。现在,如果用户决定向上滚动,我不希望它跳回到底部,直到用户再次向下滚动

是否可能有一个div会一直滚动到底部,除非用户向上滚动,并且当用户向后滚动到底部时,即使添加了新的动态内容,它也需要将自己保持在底部。我该如何去创造这个。

共有3个答案

松俊才
2023-03-14

我刚刚实现了这一点,也许您可以使用我的方法。

假设我们有以下超文本标记语言

<div id="out" style="overflow:auto"></div>

然后我们可以检查它是否滚动到底部:

var out = document.getElementById("out");
// allow 1px inaccuracy by adding 1
var isScrolledToBottom = out.scrollHeight - out.clientHeight <= out.scrollTop + 1;

scrollHeight为您提供元素的高度,包括任何由于溢出而不可见的区域。clientHeight为您提供CSS高度,或者以另一种方式说,元素的实际高度。这两种方法都返回没有边距的高度,所以你不必担心。scrollTop给你垂直滚动的位置。0是top,max是元素的scrollHeight减去元素高度本身。当使用滚动条它可以是困难的(这是在Chrome我)得到滚动条一直到底部。因此,即使滚动条从底部算起是1px,isScrolledToBottom也将是true。你可以把这个设置成你觉得合适的。

然后只需将元素的scrollTop设置为底部。

if(isScrolledToBottom)
    out.scrollTop = out.scrollHeight - out.clientHeight;

我为你做了一把小提琴来展示这个概念:http://jsfiddle.net/dotnetCarpenter/KpM5j/

编辑:添加代码片段以澄清IsCrolledTobottom何时为true

将滚动条粘到底部

const out = document.getElementById("out")
let c = 0

setInterval(function() {
    // allow 1px inaccuracy by adding 1
    const isScrolledToBottom = out.scrollHeight - out.clientHeight <= out.scrollTop + 1

    const newElement = document.createElement("div")

    newElement.textContent = format(c++, 'Bottom position:', out.scrollHeight - out.clientHeight,  'Scroll position:', out.scrollTop)

    out.appendChild(newElement)

    // scroll to bottom if isScrolledToBottom is true
    if (isScrolledToBottom) {
      out.scrollTop = out.scrollHeight - out.clientHeight
    }
}, 500)

function format () {
  return Array.prototype.slice.call(arguments).join(' ')
}
#out {
    height: 100px;
}
<div id="out" style="overflow:auto"></div>
<p>To be clear: We want the scrollbar to stick to the bottom if we have scrolled all the way down. If we scroll up, then we don't want the content to move.
</p>
韦修文
2023-03-14

这可能会帮助您:

var element = document.getElementById("yourDivID");
element.scrollTop = element.scrollHeight;

[编辑],以匹配注释。。。

function updateScroll(){
    var element = document.getElementById("yourDivID");
    element.scrollTop = element.scrollHeight;
}

每当添加内容时,调用函数updateScroll(),或设置计时器:

//once a second
setInterval(updateScroll,1000);

如果只想在用户未移动时更新:

var scrolled = false;
function updateScroll(){
    if(!scrolled){
        var element = document.getElementById("yourDivID");
        element.scrollTop = element.scrollHeight;
    }
}

$("#yourDivID").on('scroll', function(){
    scrolled=true;
});
毛博
2023-03-14

我能够得到这个工作与CSS只。

诀窍是使用show: flex;flex-方向:列反转;

浏览器对待底部就像对待顶部一样。假设您的目标浏览器支持flex-box,唯一的警告是标记必须以相反的顺序。

下面是一个工作示例。https://codepen.io/jimbol/pen/YVJzBg

 类似资料:
  • 问题内容: 我有一个只有300像素大的div,我希望它在页面加载时滚动到内容的底部。该div具有动态添加的内容,并且需要一直向下滚动。现在,如果用户决定向上滚动,我不希望它跳回到底部,直到用户再次向下滚动 是否有可能使div保持滚动到底部,除非用户向上滚动,并且当用户滚动回到底部时,即使添加了新的动态内容,它也需要保持在底部。我将如何创建这个。 问题答案: 这可以帮助您: [编辑],以匹配评论…

  • 所以我不知道该怎么解释,但我会试着解释的。我有一个评论页面。帖子是一个顶部,下面的评论字段。在这两者的中间是评论。现在的问题是,在几个注释之后,用户最终不得不向下滚动相当多的时间来查看表单。我想做的是显示4个评论,然后当用户向下滚动时,他们会看到更多。只有当他们在评论上滚动时。所以它类似于,但是在div上。这里有更多的信息来可视化它 如果用户在任何注释上滚动,它将像一样滚动,并显示更多注释。所以它

  • 问题内容: 我正在使用Ajax请求创建聊天,并且试图使消息div滚动到底部没有太多运气。 我将所有内容包装在这个div中: 有没有一种方法可以使用JS将其默认滚动到底部? 有没有一种方法可以在ajax请求后将其滚动到底部? 问题答案: 这是我在网站上使用的内容:

  • 问题内容: 我有一个使用overflow:auto的div,它在调整大小并在页面中拖动时将内容保留在div中。我正在使用一些Ajax从服务器中检索文本行,然后将它们附加到div的末尾,因此内容正在向下增长。每次发生这种情况时,我都希望使用JS将div滚动到底部,以便可以看到最新添加的内容,类似于聊天室或命令行控制台的工作方式。 到目前为止,我一直在使用此代码段执行此操作(我也在使用jQuery,因

  • 问题内容: 我正在使用Rails中的Ajax请求创建聊天,并且试图使div滚动到底部没有太多运气。 我将所有内容包装在这个div中: 有没有一种方法可以使用JS将其默认滚动到底部? 有没有办法在ajax请求之后将其滚动到底部? 问题答案: 这是我在网站上使用的内容:

  • 问题内容: 给出以下HTML代码段: 您(通常)会得到一个黑匣子,其中的滚动条包含一个数字1至30,每个数字都在新行中。 您可以在该框内上下滚动。 我现在需要的是找出框处于哪个滚动位置的可能性。假设每行高15像素,然后向下滚动到数字10,我想得到的结果是数字150(15像素* 10行)。 我在哪里可以找到这个号码? 我手上有普通的JavaScript和jQuery。 问题答案: 您需要使用该属性。