返回顶部
首页 > 资讯 > 精选 >React如何实现具备吸顶和吸底功能组件
  • 572
分享到

React如何实现具备吸顶和吸底功能组件

2023-07-05 05:07:27 572人浏览 八月长安
摘要

本篇内容介绍了“React如何实现具备吸顶和吸底功能组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体要求:需要可以设置是 吸顶 还是

本篇内容介绍了“React如何实现具备吸顶和吸底功能组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

具体要求:

  • 需要可以设置是 吸顶 还是 吸底

  • 吸顶 可以设置距离视窗顶部的位置,吸顶 可以设置距离视窗底部的位置。

  • 可以对正常组件都生效,不影响组件自身的样式。

实现

组件主要是为了 吸顶 或者 吸底 功能,那么就命名为 AutoFixed

主要实现逻辑:需要判断自身在视窗内的位置与设置的 吸顶 或者 吸底 位置是否匹配,匹配上了则可以进行 吸顶 或者 吸底

获取自身位置一般可以用 滚动的位置自身距离页面顶部 的位置来判断,但实现起来会麻烦一些,IntersectionObserver也很好用,而且性能会更好,因此这里将直接使用 IntersectionObserver 来处理。

下面,我们先实现一个基于 IntersectionObserver 实现的判断位置的 hook

定义 props 类型:

import { RefObject } from "react";type Props = {  el: React.RefObject<Element>;  options?: IntersectionObserverInit;};

可接受参数:

el: React 的 ref 实例,被判断判断位置的 DOM 元素。 options: IntersectionObserver 构造函数的初始化参数。

具体实现:

import React, { useEffect, useState } from "react";export function useIntersection(props: Props): boolean {  const { el, options } = props;  // 是否到了指定位置区域  const [intersection, setIntersection] = useState(true);  useEffect(() => {    if (!el.current) return;    // 初始化 IntersectionObserver 实例    const intersectionObserver = new IntersectionObserver(      function (entries) {        setIntersection(entries[0].intersectionRatio === 1);      },      { ...options, threshold: [1] }    );    // 开始监听    intersectionObserver.observe(el.current);    return (): void => {      // 销毁      intersectionObserver.disconnect();    };  }, [el.current]);  return intersection;}

现在实现了一个可以根据传入的参数来控制否到了指定位置区域的 hook :useIntersection

useIntersection 只是对 IntersectionObserver 的简单封装,并没有复杂实现,具体作用就是用于判断某个元素是否进入了 可视窗口,想了解更多可以点击去查看它的MDN文档。

下面再来实现我们要实现的具备吸顶和吸底功能的组件:AutoFixed

参数定义:

export type AutoFixedProps = React.ImghtmlAttributes<HTMLDivElement> & {    top?: string;    bottom?: string;    alwaysFixed?: boolean;  zIndex?: number;  children: React.Reactnode;    height: number | string;    root?: Element | Document | null;    fixedClassName?: string;    fixedStyle?: React.CSSProperties;    onFixedChange?: (isFixed: boolean) => void;};

可接受参数 基于 React.HtmlHTMLAttributes<HTMLDivElement> ,也就是继承了 div 的默认属性。

其他自定义参数说明:

  • top 吸顶距离,元素顶部距离视窗顶部小于等于 top 时,进行吸顶。

  • bottom 吸底部距离,元素底部距离视窗底部大于等于 bottom 时,进行吸底。注意逻辑是和吸顶相反。

  • alwaysFixed,用于支持默认就要一直吸顶或者吸底的情况,需要配合 topbottom 来使用。

  • zIndex 控制吸顶或者吸底时的样式层级。

  • children children 元素是正常的 React 组件即可。

  • height 被包裹元素的高度.也就是 children 元素 的高度。

  • root,相对视窗的目标元素,也就是可以控制在某个区域内进行吸顶和吸底,但因为这里是用的 fixed 定位,如果需要设置 root 时,需要改变成 absolute 定位。

  • fixedClassName 吸顶和吸底的时候需要动态添加的 className

  • fixedStyle 吸顶和吸底的时候需要动态添加的 样式

  • onFixedChange 吸顶和吸底的时候告诉外界。

具体实现:

import React, { useRef, useEffect } from "react";import { useIntersection } from "../../components/hooks/use-intersection";export const AutoFixed = (props: AutoFixedProps) => {  const {    alwaysFixed,    top,    bottom,    style,    height,    root,    zIndex = 100,    children,    className,    fixedClassName,    fixedStyle,    onFixedChange,    ...rest  } = props;  // `bottom` 值存在时,表面要悬浮底部  const isFiexdTop = !bottom;  const wrapperRef = useRef<HTMLDivElement>(null);  // 设置监听参数控制:top 为吸顶距离,bottom 为吸底距离  const options = {    rootMargin: isFiexdTop      ? `-${top || "0px"} 0px 1000000px 0px`      : `0px 0px -${bottom || "0px"} 0px`,    // 设置root    root,  } as IntersectionObserverInit;  // 是否悬浮  const intersection = useIntersection({ el: wrapperRef, options });  const shouldFixed = alwaysFixed ? true : !intersection;  useEffect(() => {    // 通知外部    onFixedChange?.(shouldFixed);  }, [shouldFixed, onFixedChange]);  return (    <div      style={{ ...style, height }}      {...rest}      className={`${className}${shouldFixed ? " fixedClassName" : ""}`}      ref={wrapperRef}    >      <div        style={{          height,          position: shouldFixed ? "fixed" : "initial",          top: isFiexdTop ? top || 0 : undefined,          bottom: isFiexdTop ? undefined : bottom || 0,          zIndex: zIndex,          ...(shouldFixed ? fixedStyle : {}),        }}      >        {children}      </div>    </div>  );};

实现逻辑:

  • 使用了 alwaysFixed 判断是否一直悬浮。

  • 默认悬浮顶部,bottom 值存在时,表明要悬浮底部。

  • useIntersection 传入监听位置控制参数。

  • 根据 useIntersection 的结果来判断是否应该 吸顶吸底

  • 做了 style 样式和 className 传入处理的问题,以及 zIndex 层级问题。

  • 吸顶时,不进行设置 bottom,吸底时,不进行设置 bottom

主要核心逻辑是第 3 点:

const options = {    rootMargin: `-${top || "0px"} 0px -${bottom || "0px"} 0px`,};

rootMargin 中:-${top || "0px"} 为吸顶距离,-${bottom || "0px"} 为吸底距离。一定要是负的,正数表示延伸到了视窗外的距离,负数表示距离视窗顶部或者底部的距离。

使用方式:

<AutoFixed    // 距离顶部为 20px 吸顶    top="20px"    // 占位高度,也就是 children 的高度    height="20px"    // fixed状态改变时    onFixedChange={(isFixed) => {      console.log(`isFixed: ` + isFixed);    }}    // fixed状态需要添加的className    fixedClassName="hello"    // fixed状态需要添加的style    fixedStyle={{ color: "red" }}>    <div>        我是悬浮内容,高度 20px, 距离顶部为 20px 吸顶    </div></AutoFixed>

“React如何实现具备吸顶和吸底功能组件”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: React如何实现具备吸顶和吸底功能组件

本文链接: https://lsjlt.com/news/349847.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • React如何实现具备吸顶和吸底功能组件
    本篇内容介绍了“React如何实现具备吸顶和吸底功能组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体要求:需要可以设置是 吸顶 还是 ...
    99+
    2023-07-05
  • React 实现具备吸顶和吸底功能组件实例
    目录背景实现结语背景 现在手机应用经常有这样一个场景: 页面上有一个导航,导航位置在页面中间位置,当页面顶部滚动到导航位置时,导航自动吸顶,页面继续往下滚动时,它就一直在页面视窗顶...
    99+
    2023-02-23
    React吸顶吸底功能 React 功能组件
  • React实现锚点跳转组件附带吸顶效果的示例代码
    React实现锚点跳转组件附带吸顶效果 import React, { useRef, useState, useEffect } from 'react'; import styl...
    99+
    2023-01-05
    React锚点跳转组件 React吸顶效果 React吸顶
  • React-Native如何实现ListView组件之上拉刷新功能
    这篇文章给大家分享的是有关React-Native如何实现ListView组件之上拉刷新功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。思路:1、常量定义:const ...
    99+
    2024-04-02
  • react-native中ListView组件如何实现点击跳转功能
    这篇文章主要介绍react-native中ListView组件如何实现点击跳转功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!先看效果用法NewsList.js_onPress(r...
    99+
    2024-04-02
  • React如何利用Antd的Form组件实现表单功能详解
    一、构造组件 1、表单一定会包含表单域,表单域可以是输入控件,标准表单域,标签,下拉菜单,文本域等。 这里先引用了封装的表单域 <Form.Item /> 2、使用For...
    99+
    2024-04-02
  • Vue和React组件间如何实现传值
    这篇文章主要讲解了“Vue和React组件间如何实现传值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue和React组件间如何实现传值”吧!组件间的传值方式组件的传值场景无外乎以下几种:...
    99+
    2023-07-04
  • java组件SmartUpload和FileUpload如何实现文件上传功能
    这篇文章主要为大家展示了“java组件SmartUpload和FileUpload如何实现文件上传功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java组件SmartUpload和FileU...
    99+
    2023-05-30
    java smartupload fileupload
  • 如何使用React Portals实现一个功能强大的抽屉组件
    本篇内容介绍了“如何使用React Portals实现一个功能强大的抽屉组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2024-04-02
  • 如何用js和jQuery实现回到页面顶部功能
    这篇文章给大家分享的是有关如何用js和jQuery实现回到页面顶部功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。HTML代码:<div class="...
    99+
    2024-04-02
  • 如何实现C#控件数组的功能
    这篇文章主要讲解了“如何实现C#控件数组的功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现C#控件数组的功能”吧!Dot.Net里取消了C#控件数组,这让习惯了使用VB控件的程序员...
    99+
    2023-06-18
  • jQuery如何实现返回顶部按钮和scroll滚动功能
    小编给大家分享一下jQuery如何实现返回顶部按钮和scroll滚动功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!jQuer...
    99+
    2024-04-02
  • 如何使用fileupload组件实现文件上传功能
    要使用fileupload组件实现文件上传功能,你需要进行以下步骤:1. 在HTML文件中,添加一个文件上传的input元素,设置t...
    99+
    2023-08-14
    fileupload
  • 移动端底部导航固定配合vue-router如何实现组件切换功能
    这篇文章主要介绍移动端底部导航固定配合vue-router如何实现组件切换功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在我们平时练习或者实际项目中也好,我们常常遇到这么一个需求...
    99+
    2024-04-02
  • 使用vue自定义如何实现Tree组件和拖拽功能
    目录vue自定义实现Tree组件和拖拽功能vue2 + js版vue2 + ts 版总结vue自定义实现Tree组件和拖拽功能 实现功能:树结构、右键菜单、拖拽 效果图 vue2 ...
    99+
    2022-12-09
    vue自定义Tree组件 vue Tree组件 vue拖拽功能
  • vue2.0如何实现前端星星评分功能组件
    这篇文章主要介绍vue2.0如何实现前端星星评分功能组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体代码如下所示:<template id="ping...
    99+
    2024-04-02
  • 如何JavaScript项目中实现一个input组件功能
    这篇文章主要介绍了如何JavaScript项目中实现一个input组件功能,此处通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:Java的特点有哪些Java的特点有哪些1.Java语言作为静态面...
    99+
    2023-06-06
  • vue3全局组件自动注册功能如何实现
    vue3全局组件自动注册第一步:建文件需要在src/components 下创建一个文件夹用于存放封装的公共组件(这里我起名叫coms)需要在src/components 下创建一个js文件用于存放引入组件并注册(这里我起名叫Index.j...
    99+
    2023-05-14
    Vue3
  • JS如何实现京东首页之页面顶部、Logo和搜索框功能
    这篇文章主要为大家展示了“JS如何实现京东首页之页面顶部、Logo和搜索框功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS如何实现京东首页之页面顶部、Lo...
    99+
    2024-04-02
  • Android中如何使用RadioGroup和Fragment实现底部导航栏的功能
    小编给大家分享一下Android中如何使用RadioGroup和Fragment实现底部导航栏的功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在一些购物商城中...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作