• 用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 }
    你复制一下,就知道这个循环渲染文字加动画,还是不错滴!
  • 相关阅读:
    部门创建注意问题
    我的技术博客开通啦~
    听侯钟雷老师的讲座,确认了几个问题。
    Dynamics CRM 批量添加用户时,报错:Server was unable to process request.
    汉字的Unicode范围(转)
    转载:Apache1.1 post请求无body的bug
    转载:Android有效解决加载大图片时内存溢出的问题
    2.2之前的webkit crash问题
    转载:Expect:100Continue & HTTP 417 Expectation
    城市旅游问题
  • 原文地址:https://www.cnblogs.com/GGbondLearn/p/12261972.html
Copyright © 2020-2023  润新知