一、transition

CSS3的过渡功能就像是一种黄油,可以让CSS的一些变化变得平滑。因为原生的CSS过渡在客户端需要处理的资源要比用JavaScript和Flash少的多,所以才会更平滑

transition的属性格式

  1. transition: property duration timing-function delay;
  2. //先执行宽后,延迟1秒后执行高
  3. transition:width 1s esae,height 1s esae 1s;
描述
transition-property 规定设置过渡效果的 CSS 属性的名称 比如:width height background-color
transition-duration 规定完成过渡效果需要多少秒或毫秒 比如:1s 500ms
transition-timing-function 规定速度效果的速度曲线 liner 匀速
ease-in 加速
ease-out 减速
ease-in-out 先加速再减速
cubic-bezier 三次贝塞尔曲线点击
transition-delay 设置动画的延迟 定义过渡效果何时开始
img{
  height: 15px;
  width: 15px;
  transition:width 1s esae,height 1s esae 1s;/*先执行宽后,延迟1秒后执行高*/
}
img{
  height:15px;
  width: 15px;
  transition - property: height;
  transition - duration: 1s;
  transition - delay: 1s;
  transition - timing - function: ease;/*属性分开写*/
}

img: hover{
  height: 450px;
  width: 450px;
}

**

触发过渡

单纯的代码不会触发任何过渡操作,需要通过用户的行为触发,可触发方式:

  • :hoever
  • :focus
  • :checked
  • 媒体查询触发
  • JavaScript触发

JavaScript触发transition

<style type="text/css">
  .test {
    background: red;
    width: 100px;
    height: 100px;
    transition: all 1s;
    -moz-transition: all 1s;
    -webkit-transition: all 1s;
    -o-transition: all 1s;
  }

  .test:hover {
      background: red;
      width: 200px;
      height: 200px;
    }
</style>

<body>
  <div id="div" class="test"></div>

</body>
<script type="text/javascript">
  document.getElementById("div").onclick = function () {
    document.getElementById("div").style.width = "200px"
    document.getElementById("div").style.height = "200px"
  }
</script>

⚠️注意: 当元素本身为 display:none 时,若想通过js先将其变为 display:block, 随后再触发其他想要的transition过渡效果,需要在 js改变其为display:block 后用setTimeout延迟100ms左右的时间再去设置其他过渡动画,否则该过渡动画不会触发
当元素同时加了js点击事件和CSS的:hove,如果触发过js事件,那么:hove会失效,即不会再恢复原来的元素状态

js监听transition过渡事件

let eventList = [
  "transitionstart",
  "transitionrun",
  "transitionend",
]

eventList.forEach(item => {
  ocument.getElementById("XXX").addEventListener(item, function (e) {
    this.innerHTML = `过渡事件触发:${item}`
  })
})

transition的局限性

  1. transition需要事件触发,所以没法在网页加载时自动发生
  2. transition是一次性的,不能重复发生,除非一再触发
  3. transition只能定义开始状态和结束状态,不能定义中间状态,也就是说只有两个状态
  4. 一条transition规则,只能定义一个属性的变化,不能涉及多个属性
  • CSS Animation 就是为了解决这些问题而提出的

二、animation

CSS Animation 像Flash制作动画一样,通过关键帧来控制动画的每一步,实现复杂动画效果
ainimation实现动画效果主要由两部分组成

  • 通过类似Flash动画中的帧来声明一个动画
  • 调用关键帧声明的动画


animation动画属性

animation:name duration timing-function delay iteration-count direction;
描述
animation-name 规定需要绑定到选择器的 keyframe 名称
animation-duration 规定完成动画所花费的时间,以秒或毫秒计
animation-timing-function 规定动画的速度曲线,播放方式
animation-delay 规定在动画开始之前的延迟
animation-iteration-count 规定动画应该播放的次数
animation-direction 规定是否应该轮流反向播放动画
animation-play-state 规定动画的状态,播放还是暂停
animation-fill-mode 规定动画时间外属性
  • name 默认值none,将没有任何动画效果,其可以用来覆盖任何动画
  • duration 默认值0,意味着动画周期为0,也就是没有任何动画效果
  • timing-function 主要用来设置动画播放方式,主要让元素根据时间的推进来改变属性值的变换速率,简单点说就是动画的播放方式
    • linear(匀速)
    • ease(缓冲)
    • ease-in(加速)
    • ease-out(减速)
    • ease-in-out(先加后减)
    • steps(步数)
    • 也可以定义 三次贝塞尔(Cubic Bezier)函数 的数学函数,来生成速度曲线
  • delay 在开始执行动画时需要等待的时间,单位毫秒
  • iteration-count 定义动画的播放次数
    • 默认为1
    • 如果为infinite,则无限次循环播放
  • direction 设置动画播放方向
    • 默认为nomal,每次循环都是向前播放,0-100
    • 另一个值为alternate,动画播放为偶数次则向前播放,如果为基数词就反方向播放
  • play-state 默认为running播放,paused暂停
    • 可以通过paused将正在播放的动画停下来,也可以通过running将暂停的动画重新播放
    • 这里的重新播放不一定是从元素动画的开始播放,而是从暂停的那个位置开始播放
    • 另外,如果元素动画结束后,元素的样式将回到最原始设置状态
  • fill-mode 定义动画开始之前和结束之后发生的操作
    • none 默认值,动画结束时回到动画没开始时的状态
    • forwards 结束时停留在最后一帧
    • backwards 让动画回到第一帧的状态
    • both 轮流应用forwards和backwards规则

@keyframes 定义关键帧动画

一个 @keyframes 中的样式规则是由多个百分比构成的,可以在这个规则上创建多个百分比,从而达到一种不断变化的效果。另外,@keyframes必须要加webkit前缀

div: hover {
  -webkit - animation: 1s changeColor;
  animation: 1s changeColor;
}

@-webkit - keyframes changeColor {
  0 % { background: #c00; }
  50 % { background: orange; }
  100 % { background: yellowgreen; }
}
@keyframes changeColor {
  0 % { background: #c00; }
  50 % { background: orange; }
  100 % { background: yellowgreen; }
}

上面代码中的0% 100%的百分号都不能省略,

  • 0%可以由from代替
  • 100%可以由to代替
  • 要让changeColor动画有效果,就必须要通过animation来调用它


animation属性与transition的区别

区别animation属性类似于transition,他们都是随着时间改变元素的属性值,其主要区别在于:

  • transition 需要触发一个事件才会随着时间改变其CSS属性
  • animation 在不需要触发任何事件的情况下,也可以随时间变化来改变元素CSS属性

三、transform变换

transform是运动状态时候,必须设置运动时间transition

属性 说明
translate(x,y) 设置盒子位移
scale(x,y) 设置盒子缩放

| 数值>1放大,<1缩小 | | rotate(deg) | 设置盒子旋转 | 旋转360度
| | skew(x-angle,y-angle) | 设置盒子斜切 | | | perspective | 设置透视距离 | | | translateX
translateY

translateZ | 设置三维移动 | | | rotateX
rotateY
rotateZ | 设置三维旋转 | 3D旋转


rotateX(90deg)是绕旋转90度,translaye(100px)是移动100px

transform-style: preserve-3d; 是3D动画的必须在要运动的物体添加 | | scaleX
scaleY
scaleZ | 设置三维缩放 | | | tranform-origin | 设置变形的中心点 | 设置旋转中心点为右下角
| | backface-visibility | 设置盒子背面是否可见 | | | transform-style : flat | preserve-3d | 设置盒子是否按3d空间显示 | | | | | |