首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将背景JS动画集成到我的react应用程序中?

如何将背景JS动画集成到我的react应用程序中?
EN

Stack Overflow用户
提问于 2019-10-26 20:18:08
回答 1查看 1.8K关注 0票数 0

我正在尝试将萤火虫动画添加到react中的组件中(我试图使用的代码是这里的https://codepen.io/celli/pen/xZgpvN)。如果我有一个简单的HTML / CSS / Javascript设置,我就知道该做什么,但我不知道如何在React上下文和单个组件的范围内集成这个动画。下面的代码放在哪里?如何在组件中引用它?

代码语言:javascript
复制
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代码放在哪里?

代码语言:javascript
复制
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%;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-26 21:32:39

React在与其他图书馆的整合上的页面可能是最好的起点。

首先,这里有一个可以直接在StackOverflow上运行的示例。

代码语言:javascript
复制
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"))
代码语言:javascript
复制
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%;
}
代码语言:javascript
复制
<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>

现在解释一下。

简单地介绍一下:前面提到的与其他库页面的集成现在使用类组件,但是我喜欢使用函数组件,因为钩子是ₜₕₑfᵤₜᵤᵣₑ。我还将一些代码从旧的es5转换为新的现代es6,因为现代js是ₜₕₑfᵤₜᵤᵣₑ。

基本思想是,当您的组件首次挂载时,您将在useLayoutEffect钩子中运行所有初始设置。这基本上可以归结为把大部分当前的js扔到这个钩子里。

组件唯一需要呈现的是包含所有点的div。

这里的优点是,使用react,您可以使用道具来控制动画的各个方面--在示例中通过允许将total变量作为道具传递来演示。

另外,由于React提供了一种通过useRef钩子获取对dom节点的引用的方法,所以您可以使用它而不是document.querySelector('#contanier')

我把CSS放在哪里?

最好的地方实际上取决于您如何设置您的反应应用程序。

如果你有一个HTML模板,你可以抛出一个样式标签或链接标签,就像其他项目一样。

如果您使用创建-反应-应用程序或具有类似的设置,那么您可以通过导入样式表、使用css模块或修改src/index.css将它们导入到组件中。

另一种选择是使用css in js解决方案,如emotionstyled-components,但这些解决方案可能需要一些习惯。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58574393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档