用js控制css动画效果@keyframes

今天看到一个css动画样式,然后打算封装一个这个css样式。

我用的react组件,然后map了我要的全部盒子

遇到了困难,我打印e和this,都没有我想用的东西。

持续性困惑。

陷入沉思和沉睡。

然后不停打印refs。。。

天啊,我在干什么。我执着地寻找style。。。

我在return的盒子里加了一个style,然后打印了style,的确可以改变css属性

我突然意识到,我需要打印更原始,或者说更底层的一些东西

于是我开始打印window和document,笨蛋啊,操作dom啊

我打印了document,然后开始点方法打印styleSheets

是个数组,然后百度了styleSheets,

应用于文档的所有样式表是通过document.styleSheets集合来表示。通过这个集合的length属性可以获知文档中样式表的数量,而通过方括号语法或itme()方法可以访问每一个样式表。

还查看了这个parentStyleSheet:

parentStyleSheet:在当前样式表是通过@import导入的情况下,这个属性是一个指向导入它的样式表的指针。

我要写动画!我要写动画!

我要怎么才能用上它呢?

        this.refs[0].style.animation='myMove 5s'
        document.styleSheets[0].insertRule(`@keyframes myMove{from{ color:'red' }to{color:'blue'}`,0)
insertRule是个啥呢。。。
这个网址必读,有详细介绍。
格式有了,然后加上方法的调用以及停止,代码如下
 1 import React, { Component } from 'react'
 2 
 3 export default class OneDemo extends Component {
 4     
 5     //构造方法,创建组件时调用
 6     constructor(props){
 7         super(props)
 8         this.state={
 9             data:[1,2,3,4,5,'',6,7,8,9,'',0,2,1,3,4,5,6,7,'',5,4,3,2,1,2,3,9]
10         }
11     }
12 
13     componentDidMount(e) {
14         //拿到一个this.refs的数量,是个遍历key的数组,numArr
15         let numArr = Object.keys(this.refs)
16         //因为是顺序排列的,要最后一位,也等于长度减一
17         let num = numArr.length-1
18         let startNum = 0
19         //我在函数里拿到num,放到state里呗
20         this.state.startNum=startNum
21         this.state.endNum = num
22         //设一个时间函数timer,1000毫秒执行一次
23         this.state.timer=setInterval(this.fn,300)
24     }
25     fn=()=>{27         let animationStyle = this.refs[this.state.startNum].style
28         animationStyle.display='inline-block'
29         document.styleSheets[0].insertRule(`@keyframes mymove{
30             0%{ color:white;transform:rotate(0deg) translateY(0px)}
31             70%{color:black;transform:rotate(180deg) translateY(-24px)}
32             100%{ color:#666;transform:rotate(360deg) translateY(0px)} }`,0)
33         animationStyle.animation='mymove 1s linear forwards'
34         //递增
35         this.state.startNum++
36         //清除timer
37         if(this.state.startNum==this.state.endNum+1){
38             clearInterval(this.state.timer)
39         }
40     }
41     
42     render() {
43         return (
44             <div className="OneDemo">
45                {
46                    this.state.data.map((v,i)=>{
47                        if(v===''){
48                             return(
49                                 <span key={i} ref={i} style={{display:'inline-block','6px',height:'24px'}}>&nbsp;</span>
50                             ) 
51                        }else{
52                             return(
53                                 <span key={i} ref={i}  style={{display:'inline-block','6px',height:'24px'}}>{v}</span>
54                             ) 
55                        }
56                         
57                    })
58                }
59             </div>
60         )
61     }
62 }
你复制一下,就知道这个循环渲染文字加动画,还是不错滴!
原文地址:https://www.cnblogs.com/GGbondLearn/p/12261972.html