【问题标题】:Is there a way to display the last li element of a ul element that overflows its parent?有没有办法显示溢出其父元素的 ul 元素的最后一个 li 元素?
【发布时间】:2020-05-01 14:48:09
【问题描述】:

背景

我正在开发一个聊天应用程序,其中我有一个 ul 元素,它使用 li 元素显示消息。 在某些时候,ul 元素会溢出其父元素。

问题

现在,问题是当我切换聊天时。有没有办法让 ul 元素显示溢出的 li 元素,也就是说,显示 ul 元素的最后一个 li 元素,而不是从第一个 li 元素显示,并让用户滚动到底部,因为那样会使糟糕的用户体验。

我尝试使用 scrollIntoView() 方法让 ul 元素在添加新的 li 元素时滚动到最后一条消息,这在用户聊天时工作正常,但一旦用户切换聊天,新聊天的 ul元素明显滚动到其中的最后一个元素。我想从底部显示元素而不滚动 ul 元素。

代码示例

const MessagingScreen = ({ openChat }) => {
  const messagesEnd = useRef();
  const [message, setMessage] = useState("");

  const scrollToBottom = () => {
    if (openChat.messages.length > 0) {
      messagesEnd.current.scrollIntoView({ behaivor: "smooth", block: "start" });
    }
  }

  useEffect(() => {
    scrollToBottom();
  }, [openChat.messages])

  return (
    <main className="flex flex-column flex-grow mh-50">
        <ul className="chat-msgs flex-grow w-100 h-100 bg-white overflow-y-scroll instant">
          {openChat.messages.map(chatMessageDetails =>
            <ChatMessageItem {...chatMessageDetails} key={chatMessageDetails.message}/>)
          }
          <div ref={messagesEnd}/>
        </ul>
     </main>
  )
 }

【问题讨论】:

  • 嗨@Bebian,欢迎来到 Stack Overflow。解决方案可能取决于您的
      元素的上下文。您能否提供一个代码示例来演示您遇到的问题?
  • 感谢@totallyuneekname,很高兴来到这里。我现在将在问题的编辑中添加代码示例

标签: javascript html css reactjs


【解决方案1】:

我想这可能就是你要找的东西 scrollTop: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollTop

显式设置元素的scrollTop 会立即将其滚动到您指定的值。

您可以将它与scrollHeight 结合使用:https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight

scrollHeight 是元素可以滚动的总量,包括溢出的不可见位。

所以一个例子是:

var myListElement = document.getElementById('myList');
myListElement.scrollTop = myListElement.scrollHeight

在你的启动函数中抛出这个应该会在初始化时将列表滚动到底部。 scrollTop 在开始时为 0,应在初始化时设置为最大值 scrollHeight

希望对你有帮助

【讨论】:

  • 谢谢肖恩。我明白你在说什么,我已经尝试过了,但它仍然明显改变了位置。调查一下,虽然设置 scrollTop 属性确实会导致元素立即滚动到某个位置,但我似乎只能在列表元素安装后设置 scrollTop 属性,从而使列表最初从顶部开始,然后再滚动到底部,从而使更改可见。
  • 你在使用 react 对吗?为什么你不能有一个元素 ref 并检查 current 何时可用然后滚动?因此,在您的 componentDidUpdate() 中检查 this.myElementRef.current 是否为真,然后滚动到您想要的位置,它应该是瞬时的。我目前正在使用它是我的项目之一,只是也有一个标志只能这样做一次,否则它总是会在每次更新时滚动
  • 嗯,我想这就是我已经在做的事情。如果您检查我对问题所做的编辑,我从项目中添加了代码并且滚动行为仍然可见,这是您的意思还是其他?
猜你喜欢
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2023-03-22
  • 2019-08-15
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多