实现水平滚动功能的React组件

前言

在现代 Web 开发中,经常需要实现水平滚动功能的容器来展示横向排列的内容。本文将介绍一个使用 React 框架封装的组件,可以轻松实现水平滚动功能。这是我在项目中使用的一个组件,在这里记录一下。

效果展示

大概效果就是下面这样,比较简单。 向右滚动后如下:

代码分析

首先,让我们来看一下组件的代码:

ini 复制代码
import { useEffect, useRef } from "react";
import "./App.css";

function App() {
  const arr = [
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
    22, 23, 24,
  ];
  const ref = useRef();

  const to = (dir) => {
    const current = ref.current;
    const scrollAmount =
      dir === "left"
        ? current.scrollLeft - current.offsetWidth + 10
        : current.scrollLeft + current.offsetWidth - 10;

    ref.current.scrollTo({
      left: scrollAmount,
      behavior: "smooth",
    });
  };

  return (
    <>
      <div className="root" ref={ref}>
        {arr.map((item, index) => (
          <div key={index} className="item">
            {item}
          </div>
        ))}
      </div>
      <button onClick={() => to("left")}>left</button>
      <button onClick={() => to("right")}>right</button>
    </>
  );
}

export default App;
css 复制代码
.root {
  height: 400px;
  width: 990px;
  background-color: #bfa;
  display: flex;
  justify-content: flex-start;
  align-items: center;
  gap: 10px;
  overflow: hidden;
  padding: 0 10px;
}

.item {
  height: 380px;
  width: 240px;
  flex-shrink: 0;
  background-color: red;
}

功能解析:

这个组件实现了一个水平滚动容器和两个按钮,用户可以通过点击按钮在容器中水平滚动内容。让我们逐个解析组件的功能:

  1. 在组件的函数体内部,我们定义了一个名为 arr 的数组,其中包含了一系列数字。这些数字将作为滚动容器中的内容进行展示。我们还使用 useRef 创建了一个名为 ref 的引用,用于获取滚动容器的 DOM 元素。

  2. 实现滚动逻辑:

    组件定义了一个名为 to 的函数,用于处理滚动事件。该函数接受一个参数 dir,用于指定滚动的方向("left" 或 "right")。

  3. 计算滚动距离:

    在函数体内部,我们首先获取当前容器的 DOM 元素,使用 ref.current 获取到当前的滚动容器。然后,根据传入的滚动方向 dir,我们计算出滚动的距离。

    对于向左滚动,我们将当前滚动位置减去容器的宽度,并加上一个偏移量(此处为 10 像素),以确保滚动到正确的位置。计算公式为:current.scrollLeft - current.offsetWidth + 10

    对于向右滚动,我们将当前滚动位置加上容器的宽度,并减去一个偏移量(此处为 10 像素),以确保滚动到正确的位置。计算公式为:current.scrollLeft + current.offsetWidth - 10

  4. 执行滚动:

    计算出滚动的距离后,我们使用 ref.current.scrollTo() 方法实现平滑的水平滚动效果。将滚动距离作为参数传入 left 属性,并设置 behavior 属性为 "smooth",以实现平滑滚动的效果。

这样,我们就完成了一个简单的水平滚动组件。如果有误欢迎指正~~

相关推荐
三小河几秒前
解决vite环境下调用获取二进制文件流 部分文件报错 (failed)net::ERR_INVALID_HTTP_RESPONSE)
前端
好好好明天会更好1 分钟前
pinia从定义到运用
前端·vue.js
代码小学僧3 分钟前
Vite 项目最简单方法解决部署后 Failed to fetch dynamically imported Error问题
前端·vue.js·vite
RoyLin3 分钟前
TypeScript设计模式:装饰器模式
前端·后端·typescript
掘金一周13 分钟前
Flutter Riverpod 3.0 发布,大规模重构下的全新状态管理框架 | 掘金一周 9.18
前端·人工智能·后端
一涯24 分钟前
页面出现空白区域
前端
spmcor1 小时前
MinIO本地对象存储部署指南
前端
少年纪1 小时前
前端用 pdf.js 将 PDF 渲染到 Canvas 再转图片,文字消失的坑
前端
RoyLin1 小时前
TypeScript设计模式:复合模式
前端·后端·typescript
我是天龙_绍1 小时前
CSS/JS/图片全挂了,部署后页面白屏/资源加载失败?这两个配置项坑了多少人!
前端