CSS知识点总结

146 阅读2分钟

CSS动画

浏览器渲染原理

  • 步骤
  1. 根据HTML构建HTML树(DOM)
  2. 根据CSS构建CSS树(CSSOM)
  3. 将两棵树合并成为一颗渲染树(render true)
  4. Layout布局(文档流、盒模型、计算大小和位置)
  5. Paint绘制(把边框颜色、文字颜色、阴影等画出来)
  6. Compose合成(根据层叠关系展示画面)
  • 三棵树
  • 三种更新方式 1.div.remove()会触发当前消失,其他元素relayout
    2.改变背景颜色,直接repaint+composite
    3.改变 transform ,只需 composite

CSS动画的两种做法(transition 和 animation)

transition

  • 四个常用的功能
  1. 位移 translate
  2. 缩放 scale
  3. 旋转 rotate
  4. 倾斜 skew
    重点:这些功能一般都需要配合 transition 过渡。
    inline 不支持 transform,需要先变成 block
  • translate 常用写法
  1. translateX(<length-percentage>)
  2. translateY(<length-percentage>)
  3. translate(<length-percentage>, <length-percentage>?)
  4. translateZ(<length>) 且父容器 perspactive
  5. translate3d(X, Y, Z)
    重点:translate(-50%, -50%) 可做绝对定位元素的居中
  • scale
  1. scaleX(<numer>)
  2. scaleY(<number>)
  3. scale(<number>, <number>?)
  • rotate
  1. rotate([<angle> | <zero>])
  2. rotateX([<angle> | <zero>]),以 X 轴旋转
  3. rotateY([<angle> | <zero>]),以 Y 轴旋转
  4. rotateZ([<angle> | <zero>]),以 Z 轴旋转
  5. rotate3d([<angle> | <zero>])
    重点:一般用于360度旋转制作loading
  • skew
  1. skewX([<angle> | <zero>])
  2. skewY([<angle> | <zeor>])
  3. skew([<angle> | <zeor>], [<angle> | <zero>]?)

transition 过渡

  • 作用 补充中间帧
  • 语法
  1. transition: 属性名 时长 过渡方式 延迟
  2. transition: left 200ms linear
  3. 可以用逗号分隔两个不同的属性
  4. transition: left 200ms, top 400ms
  5. transition: all 200ms
  6. 可以用 all 代表所有属性
  7. 过渡方式有:linear | ease | ease-in | ease-out | ease-in-out | cubic-bezier | step-start | step-end | steps
  • 重点 并不是所有属性都能过渡
    display: none => block 没法过渡
    一般改成 visibility: hidden => visible
  • 示例
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            box-sizing: border-box;
        }

        #heart {
            display: inline-block;
            margin: 100px;
            position: relative;
            transition: all 1s;

        }

        #heart:hover {
            transform: scale(1.2);

        }

        #heart>.left {
            background: red;
            width: 50px;
            height: 50px;
            position: absolute;
            transform: rotate(45deg) translateX(31px);
            bottom: 50px;
            left: -50px;
            border-radius: 50% 0 0 50%;
        }

        #heart>.right {
            background: red;
            width: 50px;
            height: 50px;
            border-radius: 50%;
            position: absolute;
            transform: rotate(45deg) translateY(31px);
            bottom: 50px;
            right: -50px;
            border-radius: 50% 50% 0 0;
        }

        #heart>.bottom {
            background: red;
            width: 50px;
            height: 50px;
            transform: rotate(45deg);
        }
    </style>
</head>

<body>
    <div id="heart">
        <div class="left"></div>
        <div class="right"></div>
        <div class="bottom"></div>
    </div>
</body>

</html>

animation

  • 缩写语法 animation: 时长 | 过渡方式 | 延迟 | 次数 | 方向 | 填充模式 | 是否暂停 | 动画名;
  1. 时长:1s 或 1000ms
  2. 过渡方式:跟 transition 取值一样
  3. 次数:3 或者 2.4 或者 infinite
  4. 方向:reverse | alternate | alternate-reverse
  5. 填充模式:none | forwards | backwards | both
  6. 是否暂停:paused | running
  7. 以上所有属性都有对应的单独属性
  • 示例
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            box-sizing: border-box;
        }

        #heart {
            display: inline-block;
            margin: 100px;
            position: relative;
            animation: .5s heart infinite alternate-reverse;

        }

        @keyframes heart {
            0% {
                transform: scale(1);
            }

            100% {
                transform: scale(1.2);
            }
        }

        #heart>.left {
            background: red;
            width: 50px;
            height: 50px;
            position: absolute;
            transform: rotate(45deg) translateX(31px);
            bottom: 50px;
            left: -50px;
            border-radius: 50% 0 0 50%;
        }

        #heart>.right {
            background: red;
            width: 50px;
            height: 50px;
            border-radius: 50%;
            position: absolute;
            transform: rotate(45deg) translateY(31px);
            bottom: 50px;
            right: -50px;
            border-radius: 50% 50% 0 0;
        }

        #heart>.bottom {
            background: red;
            width: 50px;
            height: 50px;
            transform: rotate(45deg);
        }
    </style>
</head>

<body>
    <div id="heart">
        <div class="left"></div>
        <div class="right"></div>
        <div class="bottom"></div>
    </div>
</body>

</html>

浏览地址

写在最后

一定要多练 一定要多练 一定要多练!!!!!