第二次重写个人网站,分享一些感想

前端瓶子君

共 6767字,需浏览 14分钟

 ·

2023-07-07 09:28

这个是首页截图,当封面,接下来我简单的说明一下我制作这个网站的全部过程 。如果你也想写自己的个人主页,希望这篇文章可以给你一些灵感。

这个是个人主页地址 www.zpzpup.com/[1] 2.0版本

以前的1.0版本地址 www.zpzpup.com/blog[2]

bb03aeef9834fbbfbc9cfe88eb0c41e6.webpimage.png 1. 确定整个个人页板块组合

例如我个人页的板块就分为了4个大的板块 首页 关于 项目 找我,功能我就不一一写了, 大家可以直接去网站主页看看

2. 构思整体的风格

这里大家可以去 dribbble[3] 找找灵感

7a2b448d08bb227ca4452cad8d0c4b5b.webpimage.png

一开始我本来打算把blog页进行重构,但是发现各种各样写blog的地方实在是不少,想了一下,还是算了 所以最终就决定做一个一屏展示页

我借鉴了这个设计图

e617a6942544a3acdb30d90930a94ebb.webpimage.png

大家可以自己搜索一下 不会设计还不简单 借鉴就完了 哈哈哈哈哈

3. 头部跟尾部

最开始网站确认的是头跟尾部

头部

6b53bb9cea1c5195beef98753d177bb1.webp20230608105635_rec_.gif

这里加入了2个小动画 一个是波纹动画

      
      .round {
  width28px;
  height28px;
  background-colorrgba(74130216, .2);
  border-radius50%;
  display: inline-block;
  transition: all 1s;
  position: relative;
  &::before {
     content"";
     position: absolute; // 定位到同元素上
     top: -3px;
     left: -3px;
     width100%;
     height100%;
     border3px solid rgba(74130216, .2); // 波纹
     border-radius50%; // 变圆
     background: transparent; // 不要背景颜色
     animation: pulse 2s cubic-bezier(.57, .06, .27, .84) infinite; // pulse 动画
     z-index1; // 放在原来元素之上
  }
}
@keyframes pulse {
 0% {
   transformscale(1);
   border-colorrgba(74130216, .2);
 }
 100% {
   transformscale(1.2); // 放大
   border-color: transparent; // 透明
 }
}

还有就是一个简单的位移动画 这里就不贴代码了 有兴趣的可以去自己看github[4] 喜欢可以给个star 🌟

362fa5ba11ff2d78f3d84b76bedcac50.webpimage.png

导航切换这里我用了一个slider元素进行过度

      
      
        <div className={styles.slider} style={{ left }}>
        </div>
        
      
      &:nth-child(1):hover~.slider {
  left0px;
}
&:nth-child(2):hover~.slider {
  left75px;
}
&:nth-child(3):hover~.slider {
  left150px;
}
&:nth-child(4):hover~.slider {
  left225px;
}

尾部

7be52e6bc480519c6138f7998326834f.webpimage.png

尾部这里分成了2块

25b160fef309ea59ff11051431cd9eeb.webp左边用了一个简单的

关于方块的动画,它并不是一个 Gif 图片,而是 Lottie 动画。这是 Airbnb 开源的一套跨平台的完整的动画效果解决方案。说人话:就是高级版的 Gif。动画内容是通过 JSON 文件来驱动的,可以在 \[Lottie 官网\][5]

下面使用了提示有木有很熟 用的antd Tooltip😂

右边板块就更简单了

de19792d4d3a6796f9c9614d93feea45.webp20230608112018_rec_.gif

添加了wobble,中文名是 摆动 的动画。

      
      @keyframes wobble {
  0% {
    transformtranslateY(0%);
  }

  15% {
    transformtranslateY(-25%);
  }

  30% {
    transformtranslateY(20%);
  }

  45% {
    transformtranslateY(-15%);
  }

  60% {
    transformtranslateY(10%);
  }

  75% {
    transformtranslateY(-5%);
  }

  100% {
    transformtranslateY(0%);
  }
}
4. home板块

当初设计这里,弄了很久 一直没弄满意 ,做了一版又一版总有不满意的地方,不过没事 古话说得好 只要功夫深,铁杵磨成针

de94cb31a13174a7d9d546a918f7c409.webp20230608115622_rec_.gif

左边打字板块使用的 打字效果 可以使用 typed.js[6] 这个小库,用起来非常简单,这是官方的小 Demo:

      
      // Can also be included with a regular script tag
import Typed from 'typed.js';
var options = {
 strings: ['<i>First</i> sentence.''&amp; a second sentence.'],
 typeSpeed40
};
var typed = new Typed('.element', options);

这里封装成了hooks

      
      import { useEffect, useRef } from "react";
import Typed, { TypedOptions } from "typed.js";
const useTyped = (strings: string[], extra?: TypedOptions) => {
 const el = useRef<HTMLElement | null>(null);
 const typed = useRef<Typed | null>(null);
 useEffect(() => {
 const options = {
 strings,
 typeSpeed100,
 backSpeed60,
 ...extra,
 };
 typed.current = new Typed(el.current || "", options);
 return () => typed.current?.destroy();
 }, [strings]);
 return el;
};
export default useTyped;

使用:

      
      const el = useTyped(strings, { looptrue });
<Col span={24} md={12} className={styles.intro}>
 <p>我是Jabin,</p>
 <p>
 一个 前端工程师,写{" "}
 <span className={styles.react}>React/Vue</span> 的。
 </p>
 <p>喜欢简约设计 🛀,</p>
 <p>
 偶尔
 <span className={styles.sometime} ref={el} />
 </p>
 </Col>

538a7d0170445cd28e852e7c87a58c99.webp右边火箭推进器 后面的火也是使用了Lottie动画, 这个我也封装一个hook直接使用

      
      import { useEffect, useRef } from "react";
import lottie, { AnimationConfigWithData } from "lottie-web";

const useLottie = (path: string, extra?: AnimationConfigWithData) => {
let lottieRef = useRef<HTMLDivElement | null>(null);

useEffect(() => {
if (lottieRef.current) {
lottie.loadAnimation({
container: lottieRef.current,
path,
renderer: "svg",
loop: true,
autoplay: true,
...extra,
});
}
return () => {
lottieRef.current = null
}
}, []);

return lottieRef;
};

export default useLottie;
      
      //使用:
const fireRef = useLottie(fireLottie);
  
<div className={styles.fire} ref={fireRef}></div>

相信到这 大家一看就懂。

5. about 板块

3D图片 大家可以去dribbble[7]上找 相信总有你满意的 哈哈哈哈哈哈

这个板块就没啥特别好介绍的 大家一开就懂

6. project 板块

这里用了grid布局,hover效果大家可以去一些大网站白嫖 或者自己在box-shadow generator调整一个自己满意的阴影。

这个板块因为图片比较多,并且图片质量相对较高,做了对应的图片优化

  • 把图片转换成了webp格式,这里推荐大家一个网站进行图片转换 cloudconvert[8]

  • 做了对应的图片懒加载,大家可以参考这篇文章 juejin.cn/post/684490…[9]

7. contact 板块

这个板块就是底部了 上面介绍了 就不重复说明了

8. 最后

写到这基本上就差不多了,写这个个人网站总体时间断断续续 大概2周左右,中间设计构思花了挺多时间到,大家可以多去参考一下别人的网站,发现一些好玩的效果都可以借鉴过来。

构思网站真的是一个挺麻烦的事情,既要花里胡哨又不能太花里胡哨的感觉 ,大家明白吧😂

然后整个网站主要使用技术栈 React antd scss vite typescript

优化方面主要是

  1. 组件用了lazy
  2. 图片转换webp
  3. 图片懒加载
  4. 字体库使用了fontmin[10]进行了压缩,压缩下来只有9k 还是挺满意的 毕竟只用了几个字,引入整个字体就不太划算了
  5. 然后就是加载用Suspense做了个svg动画loading

其实可以做优化的地方还挺多,比如图片走cdn,甚至css js都可以走cdn ,嗯反正是想到哪就写到哪

最后喜欢的话就在 我的 github[11] 上点个 Star 🌟 吧,欢迎 fork 和魔改

参考资料

[1]

https://www.zpzpup.com/

[2]

https://www.zpzpup.com/blog

[3]

https://dribbble.com/

[4]

https://github.com/JabinPeng/pengBlog

[5]

https://lottiefiles.com/featured

[6]

https://link.zhihu.com/?target=https%3A//github.com/mattboldt/typed.js/

[7]

https://dribbble.com/

[8]

https://cloudconvert.com/png-to-webp

[9]

https://juejin.cn/post/6844904147746029581

[10]

https://link.zhihu.com/?target=https%3A//github.com/ecomfe/fontmin

[11]

https://github.com/JabinPeng/pengBlog

关于本文
作者:JabinPeng https://juejin.cn/post/7242127432203173948

最后


欢迎关注【前端瓶子君】✿✿ヽ(°▽°)ノ✿ 回复「 交流 」,吹吹水、聊聊技术、吐吐槽! 回复「 阅读 」,每日刷刷高质量好文! 如果这篇文章对你有帮助,在看」是最大的支持!


          
                

最后不要忘了点赞呦!289edef51ae7b1f430086ede7c6cae00.webp


        
              



浏览 25
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报