You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Material UI Autocomplete自定义Popper组件选中选项时页面自动滚动至顶部问题

解决Material UI Autocomplete多选模式下选中选项页面滚动到顶部的问题

我之前处理过一模一样的场景,这个问题大多是因为选中选项时Autocomplete默认会把焦点移回输入框,触发了浏览器的自动滚动行为。试试下面这几个解决方案:

方案1:禁用选中后的焦点恢复

给Autocomplete添加restoreFocus={false}属性,阻止组件在选中选项后自动将焦点移回输入框,这样就不会触发浏览器的滚动行为:

<Autocomplete
  multiple
  PopperComponent={PopperMy}
  restoreFocus={false}
  // 其他属性...
/>

⚠️ 注意:这个方法可能会影响无障碍访问性,如果需要兼顾,你可以手动在onChange事件中处理焦点逻辑,比如在合适的时机将焦点放回输入框,但避免触发滚动。

方案2:调整自定义Popper的定位与修饰符

修改你的自定义Popper组件,通过Material UI Popper的modifiers属性来优化定位,同时确保不会触发不必要的滚动:

const PopperMy = function (props) {
  return (
    <Popper
      {...props}
      style={{ width: "fit-content" }}
      placement="bottom-start"
      modifiers={{
        preventOverflow: {
          enabled: true,
          boundariesElement: 'viewport',
        },
        flip: {
          enabled: true,
        },
      }}
    />
  );
};

这个配置让Popper始终在视口范围内显示,避免因为Popper位置偏移导致的焦点滚动问题。

方案3:阻止选项点击时的默认滚动行为

如果上面的方法都不生效,可以尝试在选项的点击事件中阻止默认行为。你可以通过Autocomplete的renderOption来自定义选项,并添加事件处理:

<Autocomplete
  multiple
  PopperComponent={PopperMy}
  renderOption={(props, option, { selected }) => (
    <li
      {...props}
      onClick={(e) => {
        e.preventDefault();
        // 手动触发选中逻辑
        props.onClick(e);
      }}
    >
      {option.label}
    </li>
  )}
  // 其他属性...
/>

这个方法直接在选项点击时阻止默认的滚动行为,同时保留原本的选中逻辑。

你可以先试方案1,这个是最直接的,通常能解决问题。如果需要兼顾无障碍,再结合方案2或3调整。

内容的提问来源于stack exchange,提问作者C Sharper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:52:50