如何将背景 JS 动画集成到我的 React 应用程序中?
How do I integrate a background JS animation into my react app?
我正在尝试将萤火虫动画添加到 React 中的组件中(我正在尝试使用的代码在此处 https://codepen.io/celli/pen/xZgpvN)。如果我有一个简单的 HTML / CSS / Javascript 设置我会知道该怎么做,但我对如何在 React 和单个组件的范围。我把下面的代码放在哪里?我如何在组件中引用它?
var total=40,
container=document.getElementById('container'),
w=window.innerWidth,
h=window.innerHeight,
Tweens=[],
SPs=1;
for (var i=total;i--;){
var Div=document.createElement('div');
TweenLite.set(Div,{attr:{class:'dot'},x:R(w),y:R(h),opacity:0});
container.appendChild(Div); Anim(Div); Tweens.push(Div);
};
function Anim(elm){
elm.Tween=TweenLite.to(elm,R(20)+10,{bezier:{values:[{x:R(w),y:R(h)},{x:R(w),y:R(h)}]},opacity:R(1),scale:R(1)+0.5,delay:R(2),onComplete:Anim,onCompleteParams:[elm]})
};
for(var i=total;i--;){
Tweens[i].Tween.play()};
function R(max){return Math.random()*max};
其次,下面的CSS代码放在哪里?
body{
background-color: #222222;
overflow:hidden;
}
.dot{
width:4px;
height:4px;
position:absolute;
background-color:#ff00cc;
box-shadow:0px 0px 10px 2px #ff00cc;
border-radius: 20px;
z-index:2;
}
#container {
width:100%;
height:100%;
}
Integrating With Other Libraries 上的 React 页面可能是最好的起点。
首先,这是一个可以直接在 Whosebug 上 运行 的示例。
const {
useRef,
useLayoutEffect,
} = React
// import React, { useRef, useLayoutEffect } from 'react';
function R(max) {
return Math.random() * max
};
function Background(props) {
const {
total = 40
} = props
const ref = useRef()
useLayoutEffect(() => {
const contanier = ref.current
const w = window.innerWidth
const h = window.innerHeight
const dots = []
function addAnimation(elm) {
return TweenLite.to(elm, R(20) + 10, {
bezier: {
values: [{
x: R(w),
y: R(h)
}, {
x: R(w),
y: R(h)
}]
},
opacity: R(1),
scale: R(1) + 0.5,
delay: R(2),
onComplete: addAnimation,
onCompleteParams: [elm]
})
}
for (let i = 0; i < total; i++) {
const div = document.createElement('div')
TweenLite.set(div, {
attr: {
class: 'dot'
},
x: R(w),
y: R(h),
opacity: 0
})
container.appendChild(div);
const dot = addAnimation(div)
dot.play()
dots.push(dot)
}
return () => {
// Clear animations and whatever here
dots.forEach(dot=>dot.kill())
container.innerHTML = ''
}
}, [total])
return <div className="fireflies" ref={ref} />
}
function App() {
return <Background total={25} / >
}
ReactDOM.render( <App / > , document.querySelector("#container"))
body {
background-color: #222222;
overflow: hidden;
}
.dot {
width: 4px;
height: 4px;
position: absolute;
background-color: #ff00cc;
box-shadow: 0px 0px 10px 2px #ff00cc;
border-radius: 20px;
z-index: 2;
}
.fireflies {
width: 100%;
height: 100%;
}
<div id="container" />
<!-- React -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<!-- TweenMax -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.15.0/TweenMax.min.js"></script>
现在解释。
附带说明:前面提到的“与其他库集成”页面目前使用 class 组件,但我喜欢使用功能组件,因为挂钩是 ₜₕₑ fᵤₜᵤᵣₑ。我还将一些代码从旧的 es5 转换为新的现代 es6,因为现代 js 是ₜₕₑ fᵤₜᵤᵣₑ。
基本思想是,当您的组件首次安装时,您 运行 在 useLayoutEffect
挂钩中进行所有初始设置。这基本上可以归结为将你当前的大部分 js 扔到那个钩子里。
组件唯一需要渲染的是 div,它将包含所有的点。
这里的优势在于,使用 React,您可以使用道具来控制动画的各个方面——示例中通过允许 total
变量作为道具传递来演示。
此外,由于 React 提供了一种通过 useRef
挂钩获取对 dom 节点的引用的方法,因此您可以使用它来代替 document.querySelector('#contanier')
.
Where do I put the CSS
最佳位置实际上取决于您如何设置 React 应用程序。
如果您在某个地方有一个 HTML 模板,您可以像在任何其他项目中一样在其中添加样式标签或 link 标签。
如果您使用了 create-react-app 或具有类似的设置,那么您可以通过 importing the stylesheet, by using css modules 或通过修改 src/index.css
将它们导入到您的组件中。
另一种选择是使用 css-in-js 解决方案,例如 emotion
或 styled-components
,但这些可能需要一点时间来适应。
我正在尝试将萤火虫动画添加到 React 中的组件中(我正在尝试使用的代码在此处 https://codepen.io/celli/pen/xZgpvN)。如果我有一个简单的 HTML / CSS / Javascript 设置我会知道该怎么做,但我对如何在 React 和单个组件的范围。我把下面的代码放在哪里?我如何在组件中引用它?
var total=40,
container=document.getElementById('container'),
w=window.innerWidth,
h=window.innerHeight,
Tweens=[],
SPs=1;
for (var i=total;i--;){
var Div=document.createElement('div');
TweenLite.set(Div,{attr:{class:'dot'},x:R(w),y:R(h),opacity:0});
container.appendChild(Div); Anim(Div); Tweens.push(Div);
};
function Anim(elm){
elm.Tween=TweenLite.to(elm,R(20)+10,{bezier:{values:[{x:R(w),y:R(h)},{x:R(w),y:R(h)}]},opacity:R(1),scale:R(1)+0.5,delay:R(2),onComplete:Anim,onCompleteParams:[elm]})
};
for(var i=total;i--;){
Tweens[i].Tween.play()};
function R(max){return Math.random()*max};
其次,下面的CSS代码放在哪里?
body{
background-color: #222222;
overflow:hidden;
}
.dot{
width:4px;
height:4px;
position:absolute;
background-color:#ff00cc;
box-shadow:0px 0px 10px 2px #ff00cc;
border-radius: 20px;
z-index:2;
}
#container {
width:100%;
height:100%;
}
Integrating With Other Libraries 上的 React 页面可能是最好的起点。
首先,这是一个可以直接在 Whosebug 上 运行 的示例。
const {
useRef,
useLayoutEffect,
} = React
// import React, { useRef, useLayoutEffect } from 'react';
function R(max) {
return Math.random() * max
};
function Background(props) {
const {
total = 40
} = props
const ref = useRef()
useLayoutEffect(() => {
const contanier = ref.current
const w = window.innerWidth
const h = window.innerHeight
const dots = []
function addAnimation(elm) {
return TweenLite.to(elm, R(20) + 10, {
bezier: {
values: [{
x: R(w),
y: R(h)
}, {
x: R(w),
y: R(h)
}]
},
opacity: R(1),
scale: R(1) + 0.5,
delay: R(2),
onComplete: addAnimation,
onCompleteParams: [elm]
})
}
for (let i = 0; i < total; i++) {
const div = document.createElement('div')
TweenLite.set(div, {
attr: {
class: 'dot'
},
x: R(w),
y: R(h),
opacity: 0
})
container.appendChild(div);
const dot = addAnimation(div)
dot.play()
dots.push(dot)
}
return () => {
// Clear animations and whatever here
dots.forEach(dot=>dot.kill())
container.innerHTML = ''
}
}, [total])
return <div className="fireflies" ref={ref} />
}
function App() {
return <Background total={25} / >
}
ReactDOM.render( <App / > , document.querySelector("#container"))
body {
background-color: #222222;
overflow: hidden;
}
.dot {
width: 4px;
height: 4px;
position: absolute;
background-color: #ff00cc;
box-shadow: 0px 0px 10px 2px #ff00cc;
border-radius: 20px;
z-index: 2;
}
.fireflies {
width: 100%;
height: 100%;
}
<div id="container" />
<!-- React -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<!-- TweenMax -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.15.0/TweenMax.min.js"></script>
现在解释。
附带说明:前面提到的“与其他库集成”页面目前使用 class 组件,但我喜欢使用功能组件,因为挂钩是 ₜₕₑ fᵤₜᵤᵣₑ。我还将一些代码从旧的 es5 转换为新的现代 es6,因为现代 js 是ₜₕₑ fᵤₜᵤᵣₑ。
基本思想是,当您的组件首次安装时,您 运行 在 useLayoutEffect
挂钩中进行所有初始设置。这基本上可以归结为将你当前的大部分 js 扔到那个钩子里。
组件唯一需要渲染的是 div,它将包含所有的点。
这里的优势在于,使用 React,您可以使用道具来控制动画的各个方面——示例中通过允许 total
变量作为道具传递来演示。
此外,由于 React 提供了一种通过 useRef
挂钩获取对 dom 节点的引用的方法,因此您可以使用它来代替 document.querySelector('#contanier')
.
Where do I put the CSS
最佳位置实际上取决于您如何设置 React 应用程序。
如果您在某个地方有一个 HTML 模板,您可以像在任何其他项目中一样在其中添加样式标签或 link 标签。
如果您使用了 create-react-app 或具有类似的设置,那么您可以通过 importing the stylesheet, by using css modules 或通过修改 src/index.css
将它们导入到您的组件中。
另一种选择是使用 css-in-js 解决方案,例如 emotion
或 styled-components
,但这些可能需要一点时间来适应。