zoukankan      html  css  js  c++  java
  • 用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 }
    你复制一下,就知道这个循环渲染文字加动画,还是不错滴!
  • 相关阅读:
    LeetCode Missing Number (简单题)
    LeetCode Valid Anagram (简单题)
    LeetCode Single Number III (xor)
    LeetCode Best Time to Buy and Sell Stock II (简单题)
    LeetCode Move Zeroes (简单题)
    LeetCode Add Digits (规律题)
    DependencyProperty深入浅出
    SQL Server存储机制二
    WPF自定义RoutedEvent事件示例代码
    ViewModel命令ICommand对象定义
  • 原文地址:https://www.cnblogs.com/GGbondLearn/p/12261972.html
Copyright © 2011-2022 走看看