React + GSAP + ScrollTrigger + Vite ==> 炫酷3D动画网页 -- 下篇

该项目由React + vite 搭建 基于GSAP和ScrollTrigger实现炫酷3D动画网页

动画效果可以看gif图或者查看 线上地址仓库

本期接着 上篇 继续完善这个炫酷3D动画网页

上篇文章我们已经能把项目跑起来啦, 但是都是硬代码 不具备什么扩展性 这篇文章我们将再次优化代码

这篇文章主要讲解以下部分

  • 重组代码结构
  • 图与文字排版效果
  • 部署github page上线

重组代码结构

上篇 文章我们提到每个section结构都是高度耦合的 并且还会设置不同的css属性 所以必须做一些抽取封装

思考

section会包含不同的sectionClassName属性, 文字属性h3ClassName 动画类型animationType以及不同文字 为了更好的封装文字就用插槽children

一般工程中会写一个配置文件,就叫gridAnimationConfig,包含每个section的必要的属性,其中因为children是React.JSX.Element 所以是jsx文件

jsx 复制代码
// const.jsx
const gridAnimationConfig = [
  {
    animationType: 'grid--1',
    sectionClassName: '',
    h3ClassName: 'content__title--right content__title--top',
    children: (
            <>
                    {'Fleeting moments,'} <br />
                    {`existence's dance.`}
            </>
    ),
    },
    {
    animationType: 'grid--2',
    sectionClassName: '',
    h3ClassName: '',
    children: (
            <>
                    {'Impermanence'} <br />
                    {`guides life's river.`}
            </>
    ),
  }
    .....
]
export default gridAnimationConfig

图与文字排版效果

配置h3ClassName 其中content__title--(top bottom left right)都是content-title附加类 作用就是见名知意啦

css 复制代码
.content__title {
    position: absolute;
    height: 100vh;
    width: 100vw;
    top: 50%;
    left: 50%;
    margin: -50vh 0 0 -50vw;
    padding: 0 10vw;
    display: grid;
    place-items: center;
    text-align: center;
    font-weight: 300;
    font-size: clamp(1.5rem, 15vw, 6.5rem);
	}
.content__title--top {
    align-items: start;
}
.content__title--bottom {
    align-items: end;
}
.content__title--left {
    justify-items: start;
    text-align: left;
}
.content__title--right {
    justify-items: end;
    text-align: right;
}

最后调试一下效果看符合预期不

可以看到确实是在content的右上方 没问题!

重组 gridAnimation.jsx --完结 🎉🎉🎉

  • images 变量包含在 useLayoutEffect 的依赖数组中可以确保在 images 图片加载完成后重新执行 useLayoutEffect 中的逻辑 确保在执行动画之前图片已经加载
  • 待检测每个gridchooseAnimation之后再关掉loading遮罩层 就可以显示最终效果啦
jsx 复制代码
import { useLayoutEffect, useState } from 'react'
import { initSmoothScrolling, useImagePreloader, supportsCssVars, chooseAnimation } from './utils'
import gridAnimationConfig from './const'
import './style/index.less'
function GridAnimation() {
	const [loading, setLoading] = useState(true)
	const images = useImagePreloader()
	useLayoutEffect(() => {
		supportsCssVars() || alert('请在支持CSS变量的现代浏览器中查看此演示')
		initSmoothScrolling()
		const grids = document.querySelectorAll('.grid')
		Array.from(grids).map((grid, i) => chooseAnimation(`grid--${i + 1}`, grid))
		setLoading(false)
	}, [images])
	if (loading || !images.length) return <div className="loading"></div>
	return (
        <div>
                <main>
                        <div className="intro">
                                <h1 className="intro__title">
                                        <span className="intro__title-pre">On-Scroll</span>
                                        <span className="intro__title-sub">Perspective Grid Animations</span>
                                </h1>
                                <span className="intro__info">Scroll moderately to fully experience the animations</span>
                        </div>

                        {gridAnimationConfig.map(({ sectionClassName, h3ClassName, children }, index) => (
                                <section key={index} className={'content ' + sectionClassName}>
                                        <div className={'grid'}>
                                                <div className="grid-wrap">
                                                        {images.map((item, index) => (
                                                                <div className="grid__item" key={index}>
                                                                        <img className="grid__item-inner" src={item.src} />
                                                                </div>
                                                        ))}
                                                </div>
                                        </div>
                                        <h3 className={'content__title ' + h3ClassName}>{children}</h3>
                                </section>
                        ))}
                </main>
        </div>
	)
}
export default GridAnimation

项目部署到github page

安装依赖

因为我们使用vite搭建 gh-pages是一种静态网站托管服务 直接从仓库中中获取HTML、CSS和JavaScript文件,可以选择在构建过程中运行这些文件并发布github page

zsh 复制代码
npm i -D gh-pages

package.json文件添加配置

  • homepage 也就是上线部署的url 格式就是https://${youName}.github.io/{gihubPageName}

  • "predeploy": "npm run build" 预先部署命令 就是在部署之前先运行项目的构建(build)命令 也就是vite原有的script 'build' : 'vite build'进行项目打包

  • "deploy": "gh-pages -d dist" 将位于 "dist" 目录中的文件部署到 GitHub Pages

然后把代码推上去

zsh 复制代码
git add . 
git commit -m '...'
git push

执行deploy

zsh 复制代码
npm run deploy

看到Published就标志成功咯 🎉🎉🎉

github配置

  • 配置仓库的Settings

  • 选择gh-pages分支

  • 查看Actions

  • 看看线上效果! 没问题! 终于完工啦!! 经过三期文章将近2.5w+字的详细注解相信juer肯定有收获吧! 记得点赞收藏ooo ~

推荐文章

React + GSAP + ScrollTrigger + Vite ==> 炫酷3D动画网页 -- 上篇

React + GSAP + ScrollTrigger + Vite ==> 炫酷3D动画网页 -- 中篇

参考

相关推荐
xj7573065334 分钟前
《python web开发 测试驱动方法》
开发语言·前端·python
IT=>小脑虎7 分钟前
2026年 Vue3 零基础小白入门知识点【基础完整版 · 通俗易懂 条理清晰】
前端·vue.js·状态模式
IT_陈寒35 分钟前
Python 3.12性能优化实战:5个让你的代码提速30%的新特性
前端·人工智能·后端
赛博切图仔36 分钟前
「从零到一」我用 Node BFF 手撸一个 Vue3 SSR 项目(附源码)
前端·javascript·vue.js
爱写程序的小高36 分钟前
npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
前端·npm·node.js
loonggg36 分钟前
竖屏,其实是程序员的一个集体误解
前端·后端·程序员
程序员爱钓鱼1 小时前
Node.js 编程实战:测试与调试 - 单元测试与集成测试
前端·后端·node.js
码界奇点1 小时前
基于Vue.js与Element UI的后台管理系统设计与实现
前端·vue.js·ui·毕业设计·源代码管理
时光少年1 小时前
Android KeyEvent传递与焦点拦截
前端
踢球的打工仔1 小时前
typescript-引用和const常量
前端·javascript·typescript