使用 React 和 Tailwind 创建阅读进度条

sxkk20082年前知识分享191
目录

前言

我们在上网的时候经常会看到一些优秀的博客顶部有个进度条,这个进度条有助于读者衡量阅读进度,我认为这个功能可以带来良好的用户体验,所以,应该将其添加到我个人博客上的文章中。那么,一起来实现吧。

实现逻辑

  1. 获取页面可以滚动的高度.
  2. 获取页面已经滚动的高度.
  3. 阅读进度=已经滚动的高度/页面可以滚动的高度

代码

单独定义一个 react hook 来活动当前的阅读进度

import { useEffect, useState } from 'react'

export function useReadingProgress() {
  const [progress, setProgress] = useState(0)
  useEffect(() => {
    function updateScroll() {
      // 已经滚动的高度
      const currentScrollY = window.scrollY
      // 可以滚动的高度
      let scrollHeight = document.body.scrollHeight - window.innerHeight
      if (scrollHeight) {
        setProgress(Number((currentScrollY / scrollHeight).toFixed(2)) * 100)
      }
    }
    // 添加全局滚动事件的监听
    window.addEventListener('scroll', updateScroll)

    // 移除监听
    return () => {
      window.removeEventListener('scroll', updateScroll)
    }
  }, [])
  return progress
}

剩下的工作是将进度显示在页面上,为此,我在顶部的导航栏上显示一个进度条。

样式

我的博客使用了 TailwindCSS,用它制作进度条非常容易

export default function ProgressBar() {
  const progress = useReadingProgress()
  return (
    <div
      style={{
        transform: `translateX(${progress - 100}%)`,
      }}
      className="fixed top-0 left-0 h-1 w-full bg-primary-500 backdrop-blur-3xl transition-transform duration-150"
    />
  )
}

我在这里使用 transform 和 translate 属性来制作进度条.

进度为 0 向左偏移 100% ,进度为 100 偏移 0,所以使用 translateX(${progress - 100}%)

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

相关文章

人脸融合:探索虚拟与现实的交汇之道

人脸融合:探索虚拟与现实的交汇之道

  随着科技的不断进步和人工智能的发展,人脸融合作为一种热门的技术引起了广泛关注。它通过将两张或多张不同的人脸合成,创造出一个全新的面容,引发了人们对于虚拟与现实交汇的思考。...

AI绘画入门:让机器帮你完成艺术创作

AI绘画入门:让机器帮你完成艺术创作

  在数字化时代,人们对于美学和艺术的需求越来越多,而AI技术的兴起为我们的艺术创作提供了更多可能性。AI绘画技术便成为了探索艺术创作的一条新途径。本文将介绍AI绘画的入门技...

2022 在微笑中成长

2022 在微笑中成长

哈喽,大家好, 我是Ai知识分享,2022 年不知不觉已经过半了,看到朋友圈关于年中总结的文章,一时间不知道该如何写起,有的升 P8 了,有的拿到了新 offer,去了新公司,有的因疫情遭裁员,开始创...

AI检测:开启新媒体时代的智能呼唤

AI检测:开启新媒体时代的智能呼唤

  AI(人工智能)技术的不断发展和普及,已经渗透到各行各业中。其中,AI检测作为新兴应用领域之一,正在改变我们的生活方式和工作方式。借助AI检测技术,我们能够更加高效准确地...

AI人脸合成技术的应用与发展

AI人脸合成技术的应用与发展

  近年来,随着人工智能技术的不断发展,AI人脸合成技术逐渐崭露头角,并在多个领域展现出巨大的潜力。通过运用AI算法,我们可以将不同人物的脸部特征合成到同一张图片上,创造出令...

百度AI开放平台通用文字识别:数字化时代的利器

百度AI开放平台通用文字识别:数字化时代的利器

  在数字化时代,文字信息的海量增长对于我们的生活和工作产生了深远的影响。然而,要处理这些文字信息并从中提取有用的内容却是一项繁琐且耗时的任务。为了解决这一难题,百度AI开放...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。