Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

transition、transform、animation三种方式实现css动画 #100

Open
TieMuZhen opened this issue Mar 8, 2022 · 0 comments
Open

transition、transform、animation三种方式实现css动画 #100

TieMuZhen opened this issue Mar 8, 2022 · 0 comments
Labels

Comments

@TieMuZhen
Copy link
Owner

TieMuZhen commented Mar 8, 2022

一、是什么

CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块

即指元素从一种样式逐渐过渡为另一种样式的过程

常见的动画效果有很多,如平移、旋转、缩放等等,复杂动画则是多个简单动画的组合

css实现动画的方式,有如下三种:

  • transition实现渐变动画
  • transform转变动画
  • animation实现自定义动画

二、实现方式

1、transition实现渐变动画

transition的属性如下:

  • property:填写需要变化的css属性
  • duration:完成过渡效果需要的时间单位(s或者ms)
  • timing-function:完成效果的速度曲线,值有如下:
    • linear:匀速
    • ease:从慢到快再到慢
    • ease-in:慢慢变快
    • ease-out:慢慢变慢
  • delay: 动画效果的延迟触发时间

举个例子,实现鼠标移动上去发生变化动画效果

<style>
      .base {
          width: 100px;
          height: 100px;
          background-color: #0EA9FF;
          transition: 2s;
      }

      /*简写*/
      /*transition: all 2s ease-in 500ms;*/
      .base:hover {
          width: 200px;
          height: 200px;
          background-color: #5daf34;
      }
</style>
<div class="base"></div>

2、transform 转变动画

transform会直接使用硬件加速,在GPU中运行,绕开了软件渲染。并不是所有的CSS属性变化都会直接在GPU处理。只有下面的属性会这样处理:

  • transform
  • opacity
  • filter

因此为了页面更加流畅,高性能的动画,我们需要尽可能的使用GPU来处理。

包含四个常用的功能:

  • translate:位移
  • scale:缩放
  • rotate:旋转
  • skew:倾斜

一般配合transition过度使用

注意: transform不支持inline元素,使用前把它变成block

举个例子

<style>
    .base {
        width: 100px;
        height: 100px;
        display: inline-block;
        background-color: #0EA9FF;
        border-width: 5px;
        border-style: solid;
        border-color: #5daf34;
        transition-property: width, height, background-color, border-width;
        transition-duration: 2s;
        transition-timing-function: ease-in;
        transition-delay: 500ms;
    }
    .base2 {
        transform: none;
        transition-property: transform;
        transition-delay: 5ms;
    }

    .base2:hover {
        transform: scale(0.8, 1.5) rotate(35deg) skew(5deg) translate(15px, 25px);
    }
</style>
 <div class="base base2"></div>

可以看到盒子发生了旋转,倾斜,平移,放大

3、animation 实现自定义动画

CSS动画只需要定义一些关键的帧,而其余的帧,浏览器会根据计时函数插值计算出来,通过@keyframes来定义关键帧,通过使用transform开启硬件加速

因此,如果我们想要让元素旋转一圈,只需要定义开始和结束两帧即可:

@keyframes rotate{
    from{
        transform: rotate(0deg);
    }
    to{
        transform: rotate(360deg);
    }
}

from表示最开始的那一帧,to表示结束时的那一帧

也可以使用百分比刻画生命周期

@keyframes rotate{
    0%{
        transform: rotate(0deg);
    }
    50%{
        transform: rotate(180deg);
    }
    100%{
        transform: rotate(360deg);
    }
}

定义好了关键帧后,下来就可以直接用它了:

animation: rotate 2s;

参考文献

@TieMuZhen TieMuZhen added the CSS label Mar 8, 2022
@TieMuZhen TieMuZhen changed the title transition、transform、animation三种方式实现css动画 transition、transform、animation、requestAnimationFrame四种方式实现css动画 May 9, 2022
@TieMuZhen TieMuZhen changed the title transition、transform、animation、requestAnimationFrame四种方式实现css动画 transition、transform、animation三种方式实现css动画 May 12, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant