react项目中实现滚动页面后 导航栏固定在页面顶部

6 篇文章 0 订阅

在很多大型官方的网站上,都会有导航栏随着页面滚动后,固定在页面顶部,方便用户操作的功能,下面我们来实现一下。

1.思路

首先,我们想固定在页面顶部,那就是设置了position为fixed;其次,我们用什么判断设置fixed的时机:那就是在页面上的位置。

我们可以使用 节点.offsetTop 获取到当前节点距离顶部的位置,document.documentElement.scrollTop可以获取到滚动页面距离顶部的位置,那么只要 页面滚动的垂直距离 > 导航栏距离顶部的距离,换句话就是说已经滑动过了导航栏的位置,那么我们就可以给它设置一个属性,就是position: fixed

2.代码实现

const navRef: any = React.createRef();
const [is_fixed, set_is_fixed] = useState(false);

useEffect(() => {
        const fixedTop = navRef.current.offsetTop;
        window.onscroll = () => {
            let scrollTop = document.documentElement.scrollTop;
            const isFixed = scrollTop >= fixedTop;
            set_is_fixed(isFixed);
          }
}, [])


<div className={`apps_navs ${is_fixed ? 'fixedTop' : ''}`} ref={navRef}>
    我是导航栏
</div>

我们使用createRef获取了节点,使用他们的位置比较判断是否设置fixed属性的class:fixedTop,完成。

3.结果展示

初始化是这样

滑动后

TIPS:写ref的组件不能写在useEffect中,踩过坑,我觉得应该是页面的类型的问题导致拿不到节点。

create-react-app 是一个用于快速创建 React 应用程序的命令行工具,它默认创建的是单页面应用。如果需要实现页面应用,可以按照以下步骤进行操作: 1. 在 src 目录下创建多个页面文件夹,如 page1、page2 等,每个文件夹创建一个 index.js 和一个 index.html 文件。 2. 在 index.js 文件编写 React 组件,作为页面的内容。 3. 在 index.html 文件引入打包后的 js 文件和其他必要的资源文件。 4. 在 public 目录下创建多个 html 文件,分别对应不同的页面,如 page1.html、page2.html 等。 5. 修改 package.json 文件的 scripts 部分,新增多个打包命令,如: ``` "scripts": { "start": "react-scripts start", "build:page1": "react-scripts build --entry ./src/page1/index.js --output-path build/page1", "build:page2": "react-scripts build --entry ./src/page2/index.js --output-path build/page2", "build": "npm run build:page1 && npm run build:page2" }, ``` 这样就可以通过 npm run build:page1 和 npm run build:page2 命令分别打包不同的页面,打包后的文件会输出到 build/page1 和 build/page2 目录下。 6. 在 public 目录下创建多个入口 html 文件,如 page1.html、page2.html 等,每个 html 文件引入相应的 js 文件即可。 7. 使用服务器部署打包后的文件,访问不同的 html 文件即可进入不同的页面。 需要注意的是,这种方式下,每个页面都需要重新加载 React 应用程序,可能会影响性能。如果需要实现更好的性能和用户体验,可以考虑使用 React Router 实现页面应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值