实现水平滚动功能的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",以实现平滑滚动的效果。

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

相关推荐
多多*几秒前
OJ在线评测系统 登录页面开发 前端后端联调实现全栈开发
linux·服务器·前端·ubuntu·docker·前端框架
2301_801074151 分钟前
TypeScript异常处理
前端·javascript·typescript
小阿飞_2 分钟前
报错合计-1
前端
caperxi4 分钟前
前端开发中的防抖与节流
前端·javascript·html
霸气小男4 分钟前
react + antDesign封装图片预览组件(支持多张图片)
前端·react.js
susu10830189115 分钟前
前端css样式覆盖
前端·css
学习路上的小刘7 分钟前
vue h5 蓝牙连接 webBluetooth API
前端·javascript·vue.js
&白帝&7 分钟前
vue3常用的组件间通信
前端·javascript·vue.js
小白小白从不日白18 分钟前
react 组件通讯
前端·react.js
Redstone Monstrosity35 分钟前
字节二面
前端·面试