我有一个ul
,其中有一个max-height
和一个overflow-y: auto
。
当用户输入足够多的li
元素时,ul
开始滚动,但我希望最后一个包含form
的li
始终对用户显示和可见。
我尝试实现了一个scrollToBottom
函数,如下所示:
scrollToBottom() {
this.formLi.scrollIntoView({ behavior: 'smooth' });
}
但这只会使ul
跳到屏幕顶部,并将其中包含窗体的li
显示为唯一可见的东西。
有没有更好的方法来完成这一点?我发现答案往往有点老,使用reactDOM。谢谢!
CSS:
.prompt-box .options-holder {
list-style: none;
padding: 0;
width: 95%;
margin: 12px auto;
max-height: 600px;
overflow-y: auto;
}
于飞:
<ul className='options-holder'>
{
this.state.items.map((item, index) => (
<li key={item.id} className={`option ${index === 0 ? 'first' : ''}`}>
<div className='circle' onClick={this.removeItem} />
<p className='item-text'>{ item.text }</p>
</li>
))
}
<li key={0} className={`option form ${this.state.items.length === 0 ? 'only' : ''}`} ref={el => (this.formLi = el)}>
<div className='circle form' />
<form className='new-item-form' onSubmit={this.handleSubmit}>
<input
autoFocus
className='new-item-input'
placeholder='Type something and press return...'
onChange={this.handleChange}
value={this.state.text}
ref={(input) => (this.formInput = input)} />
</form>
</li>
</ul>
9条答案
按热度按时间sh7euo9m1#
我有一个填充页面高度的容器。这个容器有display flex和flex direction列。然后我有一个
Messages
组件,它是一个ul
,每个消息有一个li
,加上一个特殊的AlwaysScrollToBottom
组件,作为最后一个子组件,在useEffect
的帮助下,滚动到列表的底部。CSS是
MessageComposer
,它包含用于发送消息的表单、输入字段等。xfb7svmp2#
使用react-scroll库。但是您必须显式设置
ul
的ID。您可以在setState回呼上呼叫
scrollToBottom
。比如说
或者使用setTimeout。
或者,您甚至可以从
react-scroll
设置Element
,然后滚动到某个li
。ssm49v7z3#
当渲染来自用户导入的组件数组时,我也遇到了类似的问题。
7y4bm7vi4#
看起来你正在构建一个类似聊天的界面。你可以尝试将
<ul>
和div.circle-form
Package 在一个单独的div中,如下所示:第一个
编辑
并使用javascript滚动到列表底部。
2cmtqfgy5#
我有一个脚本,我已经在我的一个项目中使用滚动顶部平滑,我做了一个小的重构滚动您的div的高度(滚动底部),我希望它有帮助。
滚动.js
你应该把它导入到你的组件里面,有两个参数(你的元素的ID,在这个例子中,你可以使用ref。第二个是我用来处理滚动速度的字符串。
我不知道你是如何Map这个LI在你的渲染,但你应该作出验证,如果有属性溢出,你应该运行滚动。
有一个合理的答案,你的组件是跳到第一个元素,你击中了第一个元素的参考,而不是最后一个。
可能的解决方法:
**更新1:**原始scroll.js,scrolling to the top的要点
ifmq2ha26#
只需使用
position:sticky
s.t.,最后一个列表项将始终显示。Demo
卡尼乌斯
tkqqtvp17#
我用一个通用的实用函数解决了这个问题,这个函数可以在任何特定的组件之外工作。你需要在父元素(列表框,多行编辑,等等)和最后一个子元素(或者你想滚动到的任何地方)上定义一个引用。
我使用它作为一个功能组件,并调用它作为一个效果,每当我的父容器得到更新。
2o7dmzc58#
answer here不太适合我,因为我使用的是CSS网格而不是Flexbox,所以添加的
div
创建了另一个网格行。为了解决这个问题,我详细地创建了一个钩子,它接受
ref
,并将最后一个子对象获取到scrollIntoView()
。第一个
6qftjkof9#
您可以使用"react-scroll-to-bottom"模块来完成此操作。
添加新子项时自动滚动到底部。
链接:https://www.npmjs.com/package/react-scroll-to-bottom