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

在React中处理滚动动画

蒋培
2023-03-14

在React中处理滚动位置的正确方法是什么?我真的很喜欢平滑滚动,因为更好的用户体验。因为在React中操作DOM是一个反模式,所以我遇到了一个问题:如何平滑地滚动到某个位置/元素?我通常会更改元素的scrollTop值,但这是对DOM的操作,这是不允许的。

杰斯宾

代码:

import React from 'react';
import ReactDOM from 'react-dom';


class App extends React.Component {
  handleClick = e => {
    for (let i = 1; i <= 100; i++) {
      setTimeout(() => (this.node.scrollTop = i), i * 2);
    }
  };

  render() {
    const someArrayToMap = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    return (
      <div ref={node => this.node = node} style={{overflow: 'auto', height: '100vh'}}>
        <button onClick={this.handleClick}>CLICK TO SCROLL</button>
        {
            [...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap,
            ...someArrayToMap].map((e, i) => <div key={i}>some text here</div>)
        }
      </div>
    );
  }
}


ReactDOM.render(<App />, document.getElementById('root'));

如何以反应的方式实现这一点?

共有3个答案

艾敏学
2023-03-14

最简单的方法是:-

window.scrollTo({top: 0, left: 0, behavior: 'smooth' });

这个简单的JavaScript代码适用于所有浏览器。

宰父淳
2023-03-14

window.scroll({top: 0,左边: 0,行为:'ski'})适用于我。

您还需要检查浏览器的兼容性

或者使用polyfill

编辑:为了完整起见,下面是如何动态地用webpack来填充。

if (!('scrollBehavior' in document.documentElement.style)) {
//safari does not support smooth scroll
  (async () => {
    const {default: smoothScroll} = await import(
      /* webpackChunkName: 'polyfill-modern' */
      'smoothscroll-polyfill'
      )
    smoothScroll.polyfill()
  })()
}

通过这种动态多边形填充,除非浏览器支持平滑滚动,否则包将通过ajax加载。

polferd-现代是一个任意的chunk名称,它提示webpack编译器将包组合在一起,以减少对服务器的请求数量。

储思聪
2023-03-14

您只需使用refs和scrollIntoView方法(使用行为:“平滑”进行平滑滚动)。它只需要几行代码,不需要包。

说这是您想要滚动到的内容

<p ref={this.myRef} className="scrollToHere">[1] ...</p>

还有某种按钮

<button onClick={() => {this.scroll(this.myRef)}} className="footnote">[1]</button>

调用scroll方法

class App extends Component {
  constructor() {
    super()
    this.myRef = React.createRef();

  scroll(ref) {
    ref.current.scrollIntoView({behavior: 'smooth'})
  }
}

编辑:因为此方法尚未被所有浏览器支持(浏览器支持概述),所以您可能希望使用多边形填充。

 类似资料:
  • 我的react中有一个滚动的事件处理程序,我正试图使它成为被动的。但它不起作用,我在控制台中不断收到以下警告: 将事件处理程序标记为“被动”以使页面更加响应。 下面是我阅读事件的地方: 这是我的EventContainer中的函数。js文件: 在这一行: {被动:被动} 我得到以下错误在我的编辑器: 参数类型{passive:boolean}不可分配给参数类型boolean 有人知道我做错了什么吗

  • 问题内容: 使用react-router时,后退按钮上的滚动位置(历史记录popstate)遇到一些问题。由于浏览器正在实现一些自动滚动行为,因此React Router v4无法开箱即用地管理滚动。这很棒,除非浏览器窗口的高度从一个视图到另一个视图变化太大。我已经实现了ScrollToTop组件,如下所述:https : //reacttraining.com/react- router/web

  • 问题我如何可以嵌入这个应用程序到SPlitPane,在左边将是另一个面板。 不幸的是,代码导致了错误的坐标,

  • 问题内容: 我想知道是否有人可以提供一些有关他们如何在React.js中处理假动画的见解。我一直在使用Greensock TweenMax,并且enter动画在上可以正常工作,但是我还没有找到一种可靠的方法来对组件进行动画处理。 我的感觉是它应该进入,但是React没有提供回调机制来指示您何时准备释放组件。因此过渡动画永远不会完成,因为这些动画与React是异步的。取而代之的是,您只看到一秒钟的动

  • 我想动态地从EditText中获取值...当用户按下添加按钮时,我生成了很多EditText...当用户按下添加按钮时,它每次都会生成3个Edittext。我不知道如何从这个动态生成的EdiTtext中获取值。现在我的问题是如何从每行的3个Edittext中获取值。我还需要验证用户是否删除了视图。请帮助我是新的android开发。当用户按下保存按钮时,应该会发生这种情况。提前谢谢! 这是课堂。 这

  • Scrollview通常会滚动到底部,但当我触摸TextInput并弹出键盘时,它只会滚动很短的距离,我无法查看下面的内容。 现在只关注Android Android:窗口软输入模式=“调整平移” 我的代码: 其中主要组件包含scrollView