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

Ant Design Table组件滚动条控制:实现左右滚动悬浮按钮

Ant Design Table 添加左右滚动悬浮按钮实现方案

完全可以实现这个需求,核心思路是通过操作Table滚动容器的scrollLeft属性控制水平滚动,配合悬浮按钮触发滚动逻辑即可,具体实现步骤如下:

1. 确保Table开启水平滚动

先给Table配置水平滚动,通过scroll.x设置一个大于列总宽度的数值:

<Table
  scroll={{ x: 1800 }} // 根据实际列宽调整数值
  columns={yourColumns}
  dataSource={yourDataSource}
/>

2. 获取Table的滚动容器

Ant Design Table的水平滚动容器DOM类名为.ant-table-body,可以通过useRef结合useEffect获取容器引用:

import { useRef, useEffect } from 'react';

const scrollContainerRef = useRef(null);

useEffect(() => {
  const tableScrollContainer = document.querySelector('.ant-table-body');
  if (tableScrollContainer) {
    scrollContainerRef.current = tableScrollContainer;
  }
}, []);

3. 编写滚动控制函数

实现两个点击事件处理函数,分别控制容器向左、向右滚动,滚动距离可根据需求调整:

const scrollToLeft = () => {
  if (scrollContainerRef.current) {
    scrollContainerRef.current.scrollLeft -= 300; // 每次向左滚动300px
  }
};

const scrollToRight = () => {
  if (scrollContainerRef.current) {
    scrollContainerRef.current.scrollLeft += 300; // 每次向右滚动300px
  }
};

4. 添加悬浮滚动按钮

用容器包裹Table和按钮,通过绝对定位让按钮悬浮在Table两侧,设置z-index保证按钮在Table上方:

import { Button } from 'antd';
import { LeftOutlined, RightOutlined } from '@ant-design/icons';

<div style={{ position: 'relative', width: '100%' }}>
  {/* 左滚动按钮 */}
  <Button
    onClick={scrollToLeft}
    icon={<LeftOutlined />}
    style={{
      position: 'absolute',
      left: 16,
      top: '50%',
      transform: 'translateY(-50%)',
      zIndex: 10,
      backgroundColor: '#fff'
    }}
  />
  {/* Table组件 */}
  <Table
    scroll={{ x: 1800 }}
    columns={yourColumns}
    dataSource={yourDataSource}
  />
  {/* 右滚动按钮 */}
  <Button
    onClick={scrollToRight}
    icon={<RightOutlined />}
    style={{
      position: 'absolute',
      right: 16,
      top: '50%',
      transform: 'translateY(-50%)',
      zIndex: 10,
      backgroundColor: '#fff'
    }}
  />
</div>

5. 优化体验:根据滚动状态禁用按钮

监听容器滚动事件,根据当前滚动位置判断是否禁用按钮,避免无效点击:

import { useState } from 'react';

const [leftBtnDisabled, setLeftBtnDisabled] = useState(true);
const [rightBtnDisabled, setRightBtnDisabled] = useState(false);

useEffect(() => {
  const handleScroll = () => {
    if (!scrollContainerRef.current) return;
    const { scrollLeft, scrollWidth, clientWidth } = scrollContainerRef.current;
    setLeftBtnDisabled(scrollLeft === 0);
    // 减1避免精度误差,确保滚动到最右侧时禁用按钮
    setRightBtnDisabled(scrollLeft >= scrollWidth - clientWidth - 1);
  };

  const container = scrollContainerRef.current;
  if (container) {
    container.addEventListener('scroll', handleScroll);
    handleScroll(); // 初始化按钮状态
    return () => container.removeEventListener('scroll', handleScroll);
  }
}, []);

// 给按钮添加disabled属性
<Button onClick={scrollToLeft} disabled={leftBtnDisabled} />
<Button onClick={scrollToRight} disabled={rightBtnDisabled} />

内容的提问来源于stack exchange,提问作者Nathan Bernardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:13:23