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动画网页 -- 中篇

参考

相关推荐
Yaml41 分钟前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
PleaSure乐事2 分钟前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶3 分钟前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json
getaxiosluo4 分钟前
react jsx基本语法,脚手架,父子传参,refs等详解
前端·vue.js·react.js·前端框架·hook·jsx
理想不理想v7 分钟前
vue种ref跟reactive的区别?
前端·javascript·vue.js·webpack·前端框架·node.js·ecmascript
知孤云出岫8 分钟前
web 渗透学习指南——初学者防入狱篇
前端·网络安全·渗透·web
贩卖纯净水.13 分钟前
Chrome调试工具(查看CSS属性)
前端·chrome
栈老师不回家1 小时前
Vue 计算属性和监听器
前端·javascript·vue.js
前端啊龙1 小时前
用vue3封装丶高仿element-plus里面的日期联级选择器,日期选择器
前端·javascript·vue.js
一颗松鼠1 小时前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript