今天看到一个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',width:'6px',height:'24px'}}> </span> 50 ) 51 }else{ 52 return( 53 <span key={i} ref={i} style={{display:'inline-block',width:'6px',height:'24px'}}>{v}</span> 54 ) 55 } 56 57 }) 58 } 59 </div> 60 ) 61 } 62 }
你复制一下,就知道这个循环渲染文字加动画,还是不错滴!