CSS 动画学习笔记——Transition篇
该笔记中,主要记录CSS动画的:transition 和 animation
一丶Transition
transition 从它本身的意思来说就是 过渡,在css3引入transition前,css的状态变化都是即时完成的,例如我们平时若是不使用UI库的情况下,做类似于折叠面板的组件时,我们通常会用display的none和block来进行显示&隐藏的控制;有时用到伪类或者点击进行即时样式更改,页面上的效果也是即时变化,通常是没有动画过渡效果,如下例:
注释:这是一个通过点击控制高度变化的块
身为前端,当然是想做一些页面效果好的东西,而我们就可以通过 transition 对上面进行改进,效果如下:
注释:这是添加了transition之后的效果
实现上述的代码如下:
<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> .block_wrap { width: 500px; height: 500px; background: #e3e3e3; /*设置动画过渡时间和其所需要的过渡的属性*/ transition: 1s height; margin: 0 auto; } /*通过点击事件添加/删除该样式进行高度控制*/ .pick { height: 100px } </style> </head> <body> <div id="block_wrap" class="block_wrap"> </div> </body> <script type="text/javascript"> // 获取标题元素 var block_wrap = document.getElementById('block_wrap') //给标题元素添加点击事件,通过点击控制class的添加&去除达成动画效果 block_wrap.onclick = function() { // 获取标题元素className集合 let classArray = this.className.split(/\s+/) if (classArray.includes('pick')) { block_wrap.classList.remove('pick') return } else { block_wrap.classList.add('pick') return } } </script> </html>
如若我们需要动画效果的不止高度呢?那也可以,可以将样式代码改成这样
1 .block_wrap { 2 width: 500px; 3 height: 500px; 4 background: #e3e3e3; 5 /*可以设置多个属性,并且每个属性的过渡时间都可不同*/ 6 transition: 1s height, 0.5s width; 7 margin: 0 auto; 8 } 9 /*通过点击事件添加/删除该样式进行高度&宽度控制*/ 10 .pick { 11 height: 100px; 12 width: 100px 13 }
改进之后的效果:
注释:点击时,控制高度&宽度变化
·transition-delay
还有更加花里胡哨一些的,可以让动画效果延迟(delay),效果见下图:
注释:宽度延迟
使用延迟只需将代码修改一下:
1 /*第一个时间为动画时间,第二个时间为延迟时间,不设置则为0*/ 2 transition: 1s height, 1s 1s width;
delay的应用场景在于一些比较复杂的动画,可以通过它指定执行顺序来完成。
·transition-timing-function
transition的状态变化速度(又称timing-function),默认逐渐放慢(ease),其他模式为:
- linear 匀速
- ease-in 加速
- ease-out 减速
- cubic-bezier函数 自定义速度模式
如若使用cubic-bezier,可以访问该网站 https://cubic-bezier.com/ 进行定制
transition总结
transition简写:
/*第一个参数为动画时间,第二个为延迟(delay),第三个为动画效果的属性,第三个为状态变化速度(timing-function),另外可以单独定义每个属性*/ transition: 1s 1s height ease;
transition: 1s 1s height ease, 1s 1s width ease;
transition各属性:
/*动画效果属性*/ transition-property: height; /*动画时间*/ transition-duration: 1s; /*延迟*/ transition-delay: 1s; /*timing-function*/ transition-timing-function: ease;
常见的动画效果,都可以用transition来完成,一些复杂的动画则需要各属性的配合。
目前主流的浏览器都已经兼容transition,但是要注意,并不是所有的CSS属性都支持transition,而且在使用transition时,要明确地给出开始到结束的数值,也就是要明确0-100,或者100-0,否则,transition无法计算中间状态。