第一篇博客

Posted on:August 28, 2023 at 02:49 AM
预计阅读时长:7 min read 字数:1257

本项目的第一篇博客,近些年来做的博客系统还不少

目录

旅途开始

  • 新建仓库

Reactjs

使用astro-paper主题
# npm 6.x
npm create astro@latest --template satnaing/astro-paper
# npm 7+, extra double-dash is needed:
npm create astro@latest -- --template satnaing/astro-paper
# yarn
yarn create astro --template satnaing/astro-paper

p5js

text

使

framer-motion useScroll

import "./styles.css";
import { motion, useScroll } from "framer-motion";

export default function App() {
  const { scrollYProgress } = useScroll();
  return (
    <>
      <motion.div
        className="progress-bar"
        style={{ scaleX: scrollYProgress }}
      />
    </>
  );
}

css-doodle

basic

noise

todo:这个组件会使滑动卡卡的,分析原因

import Noise from "@components/react/doodle/noise.tsx";
<Noise client:load />;
import "css-doodle";
import {
  useEffect,
  useState,
  type ReactNode,
  type ReactElement,
  useRef,
} from "react";

interface Props {
  children: ReactNode;
  download?: Boolean;
}

const Doodle: React.FunctionComponent<Props> = ({ children, download }) => {
  let value = (children as ReactElement).props.value;
  let doodle = useRef<any>(null);
  let [show, setShow] = useState(false);
  const click = () => {
    setShow(show => !show);
  };
  useEffect(() => {
    setShow(true);
  });
  const downloadClick = () => {
    doodle.current &&
      doodle.current.export({
        scale: 8,
        download: true,
      });
  };
  return (
    <div>
      {show && (
        <css-doodle ref={doodle} onClick={click}>
          {value}
        </css-doodle>
      )}
      {download && <button onClick={downloadClick}>下载</button>}
    </div>
  );
};

export default Doodle;

在 mdx 中使用 dooble 组件,inner children 中的’{‘需要替换成’{‘

import Common from "@components/react/doodle/common.tsx";

<Common  client:load>
@grid: 14 / 50vmin;
@random \{
border-left: 1px solid #5d81bc
}
@random \{
  border-top: 1px solid #5d81bc;
}
@random(.25) \{
  background: linear-gradient(
    @p(#fff, tan, #5d81bc), @lp
  )
  50% / @r(60%) @lr
  no-repeat;
}
@random \{
  filter: drop-shadow(0 0 10px #fff);
}
</Common>

惯性滚动

pnpm i @studio-freight/lenis
const lenis = new Lenis();
lenis.on("scroll", e => {
  console.log(e);
});
function raf(time) {
  lenis.raf(time);
  requestAnimationFrame(raf);
}
requestAnimationFrame(raf);
实现原理

Lenis 是一个轻量级的 JavaScript 库,旨在实现平滑的惯性滚动效果,模拟原生滚动行为,并提供丰富的自定义选项。其核心原理是通过监听用户的滚动操作,计算目标滚动位置,并使用 requestAnimationFrame API 来实现平滑的动画过渡。以下是具体的实现步骤:

  1. 监听滚动事件: Lenis 会监听用户的鼠标滚轮事件或触摸屏滑动事件,以捕捉用户的滚动操作。

  2. 计算目标位置: 根据用户的滚动操作和 Lenis 的配置参数(如惯性强度、滚动方向等),计算出目标滚动位置。这一过程涉及到对用户输入的处理和目标位置的动态计算。

  3. 启动动画循环: 使用 requestAnimationFrame API 启动一个动画循环,这样可以确保动画在浏览器的每一帧中平滑执行。

  4. 更新滚动位置: 在每一帧动画中,根据当前位置和目标位置之间的差值,计算出一个新的滚动位置,并使用 scrollTo 方法更新页面的滚动位置。

  5. 平滑过渡: Lenis 使用 easing 函数来控制动画的过渡效果,使得滚动体验更加平滑自然。通过调整 easing 函数,开发者可以自定义滚动的感觉。

  6. 停止动画循环: 当滚动位置到达目标位置或用户进行新的滚动操作时,停止动画循环。这可以通过检测用户的输入来实现。

以下是一个核心代码示例,展示了如何初始化 Lenis 并启动动画循环:

// 初始化 Lenis 实例
const lenis = new Lenis({
  duration: 1.2, // 滚动动画持续时间
  easing: t => Math.min(1, 1.001 - Math.pow(2, -10 * t)), // 自定义 easing 函数
});

// 监听滚动事件
lenis.on("scroll", () => {
  // 获取当前滚动位置
  const scroll = lenis.scroll;

  // 执行其他操作,例如更新页面元素的位置
});

// 启动动画循环
function raf(time) {
  lenis.raf(time); // 更新 Lenis 实例
  requestAnimationFrame(raf); // 请求下一帧
}
requestAnimationFrame(raf); // 启动动画循环

通过以上步骤和代码示例,Lenis 实现了流畅的惯性滚动效果,提升了用户在网页上的滚动体验。

Remark 和 Rehype

Remark 和 Rehype 都是用于将 Markdown 转换为 HTML 的工具.


Remark 是一个基于 Node.js 的 Markdown 解析器,它将 Markdown 文本解析为 HTML.它支持插件系统,允许用户自定义解析过程.Remark 通常用于生成静态站点,例如博客或文档.


Rehype 是一个基于 Remark 的工具,它提供了额外的功能,例如代码高亮、表格和引用.Rehype 支持多种语言,包括 JavaScript、Python、CSS 和 HTML.Rehype 通常与 Remark 一起使用,以便在解析 Markdown 时应用额外的功能.

例如rehype-autolink-headings is a rehype plugin to add links from headings back to themselves.

下学

人可用功的功夫称之为下学,此功夫在可见,可闻,可言,可思处

update astro to 4.12

允许你结合高性能静态HTML和动态服务器生成组件,可以为不同类型的内容选择不同的缓存策略,并提高页面加载速度

优秀blog链接

next

链接