当前位置: 首页 > 面试题库 >

如何滚动div在ReactJS中可见?

秦联
2023-03-14
问题内容

我有一个弹出列表,其中div包含子divs 的垂直列表。我添加了向上/向下键盘导航来更改当前突出显示的哪个孩子。

现在,如果我按下向下键的次数足够多,则突出显示的项目将不再可见。如果滚动视图,则向上键也会发生相同的情况。

在React中自动将孩子滚动div到视图中的正确方法是什么?


问题答案:

我假设您具有某种List组件和某种Itemhtml" target="_blank">组件。我在一个项目中执行此操作的方式是让该项目知道它是否处于活动状态。该项目将要求列表在必要时将其滚动到视图中。考虑以下伪代码:

class List extends React.Component {
  render() {
    return <div>{this.props.items.map(this.renderItem)}</div>;
  }

  renderItem(item) {
    return <Item key={item.id} item={item}
                 active={item.id === this.props.activeId}
                 scrollIntoView={this.scrollElementIntoViewIfNeeded} />
  }

  scrollElementIntoViewIfNeeded(domNode) {
    var containerDomNode = React.findDOMNode(this);
    // Determine if `domNode` fully fits inside `containerDomNode`.
    // If not, set the container's scrollTop appropriately.
  }
}

class Item extends React.Component {
  render() {
    return <div>something...</div>;
  }

  componentDidMount() {
    this.ensureVisible();
  }

  componentDidUpdate() {
    this.ensureVisible();
  }

  ensureVisible() {
    if (this.props.active) {
      this.props.scrollIntoView(React.findDOMNode(this));
    }
  }
}

更好的解决方案可能是使列表负责将项目滚动到视图中(而无需使项目知道它甚至在列表中)。为此,您可以将ref属性添加到特定项目并使用以下内容找到它:

class List extends React.Component {
  render() {
    return <div>{this.props.items.map(this.renderItem)}</div>;
  }

  renderItem(item) {
    var active = item.id === this.props.activeId;
    var props = {
      key: item.id,
      item: item,
      active: active
    };
    if (active) {
      props.ref = "activeItem";
    }
    return <Item {...props} />
  }

  componentDidUpdate(prevProps) {
    // only scroll into view if the active item changed last render
    if (this.props.activeId !== prevProps.activeId) {
      this.ensureActiveItemVisible();
    }
  }

  ensureActiveItemVisible() {
    var itemComponent = this.refs.activeItem;
    if (itemComponent) {
      var domNode = React.findDOMNode(itemComponent);
      this.scrollElementIntoViewIfNeeded(domNode);
    }
  }

  scrollElementIntoViewIfNeeded(domNode) {
    var containerDomNode = React.findDOMNode(this);
    // Determine if `domNode` fully fits inside `containerDomNode`.
    // If not, set the container's scrollTop appropriately.
  }
}

如果您不希望做数学运算来确定该项是否在列表节点内可见,则可以使用DOM方法scrollIntoView()或特定于Webkit的Webkit
scrollIntoViewIfNeeded,它可以使用polyfill,因此可以在非Webkit浏览器中使用它。



 类似资料:
  • 所以我目前正在尝试使用React引导程序为我的网站。我很困惑如何使只有一个div是可滚动的,而其他的不能。这是我在app.js中的代码 有没有人知道如何让一个div独立滚动,而其他div则停留而不能滚动?提前致谢

  • 我已经做了一个div,它包装溢出的内容可滚动,但我希望它的滚动是隐藏的,但div仍然是可滚动的。

  • 问题内容: 我有一个滚动条,当我单击它时我想要一个链接,它将迫使其滚动以查看其中的元素。我这样写它的JavasSript: 但这会在滚动页面的同时滚动所有页面。如何解决? 我想这样说 问题答案: 您需要获取要滚动到视图中的元素相对于其父元素(滚动div容器)的顶部偏移量: 现在,将变量topPos设置为滚动div的顶部与希望显示的元素之间的距离(以像素为单位)。 现在,我们告诉div使用以下命令滚

  • 问题内容: 我想固定表格的标题。表格位于可滚动div中。下面是我的代码。 以下是我用于以上div的CSS: 问题答案: 怎么做这样的事情?我从头开始… 我所做的是使用2个表,一个表用于标题,该表始终是静态的,而另一个表呈现单元格,我使用固定高度的元素包装了这些单元格,并启用了滚动, 还要确保您使用固定宽度的元素,以便在使用不带字符串的情况下不会断线,以便在使用时断开该字符串

  • 问题内容: 是否可以为div上的垂直滚动条指定位置(左侧或右侧)? 其中说明了如何使用溢出属性。有什么方法可以将滚动条放在可滚动区域的左侧? 问题答案: 要么 适用于所有主要浏览器(甚至是Safari)的剪切和粘贴解决方案 任何高度或宽度都可以 (可选)添加到每个项目中,以更改文本回流的方向,同时保留容器的方向。

  • 问题内容: 滚动到该位置后如何使它固定?我在页面的后面有一个,您需要滚动到那个页面。 如果我使用: 在出现之前就应该正常显示。我需要的一个很好的例子是9gag上的第二个广告。如果屏幕分辨率足够低,则在加载首页后您将看不到该广告,但是向下滚动后,您会看到第二个广告,并且在向下滚动时它将保持固定。 问题答案: 我知道这仅被标记为html / css,但是您不能仅使用css来做到这一点。最简单的方法是使