【WEB】CSS过渡,变形与动画详解


在Web开发中,静态的页面早已无法满足用户对交互体验的期待。当我们浏览那些流畅切换的按钮状态、随鼠标舞动的元素,或是富有节奏感的加载动画时,背后往往藏着CSS的三大“魔法”—— 过渡(transition)、变形(transform)和动画(animation)。它们就像给页面注入生命力,让枯燥的像素组合拥有了呼吸感与叙事性。。

一、 过渡

CSS3提供了强大的过度属性,它可以在不使用Flash或JavaScript的情况下,为元素从一种样式转化为另一种样式时添加效果,例如渐显,渐弱,动画快慢等等

1.1 transition-property 指定内容具有过渡效果

取值:

  • none
  • all
  • property 定义过度效果的css名称

1.2 transition-duration:time 变化时间

单位:

  • 秒(s)
  • 毫秒(ms)

以下是指定内容和变化时间的演示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg1{
            width:200px;
            height:100px;
            background-color: #f99b9b;
            transition:background-color 3s;
        }    
        .eg1:hover{
            background-color: #760707;
        }
        </style>
</head>

<body>
  <div class="eg1"></div>  
</body>
</html>

过渡演示

1.3 transition-timing-function 过渡效果的速度曲线

取值:

  • linear 匀速 相当于cubic-bezier(0,0,1,1)
  • ease 慢-加快-慢 相当于cubic-bezier(0.25,0.1,0.25,1)
  • ease-in 慢-快(淡入) 相当于cubic-bezier(0.42,0,1,1)
  • ease-out 快-慢 (淡出)相当于cubic-bezier(0,0,0.58,1)
  • ease-in-out 低速开始,低速结束 相当于cubic-bezier(0.42,0,0.58,1)
  • steps(n) 分布动画 常配合精灵图实现精灵动画
  • cubic-bezier(n,n,n,n) 定义用于加速或减速的贝塞尔曲线 取值为0 - 1

1.4 transition-delay:time 延时播放

取值:

  • 秒(s)
  • 毫秒(ms)

1.5 transition 的复合属性

transition :property duration timing-function delay
注意: 设置多个参数时参数要按照定义顺序,不可以颠倒。尤其注意变化时间在延时时间之前。

二、 变形

CSS3之前,需要依赖图片、Flash或JavaScript才能实现变形,而CSS3提供了transform属性来实现变形效果。

2.1 transform:translate(x,y)位移

取值:

  • px
  • % 基于元素本身计算

注意:

  1. 以元素的左上角为基点
  2. 省略第二个参数时默认为0,仅该改变水平位移。
  3. 使用translateX(),translateY()可以分别指定水平和竖直方向上的位移
  4. 取值为正分别表示向右、向下,负数则为反方向。

应用:使元素位于中心

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
     .eg2{
            width:200px;
            height:100px;
            background-color: #eb7070;
            position :absolute;
            left:50%;
            top:50%;
            /* 此时盒子左上角位于浏览器正中心 */
            transform:translate(-50%,-50%);
            /* 此时盒子中心位于浏览器中心 */
        }
    </style>
</head>

<body>
  <div class="eg2"></div>  
</body>
</html>

eg2

2.2 transform:rotate(x deg)旋转

注意:

  1. 取值为正表示顺时针,取值为负则为反方向
  2. 默认旋转原点为盒子中心点
  3. transform-origin :x y 改变旋转原点

取值:

  • left ,right,top,bottom,center
  • %
  • px

以下是旋转示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg4{
            transition: all 1s;
        }
        .eg4:hover{
            width:50px;
            transform: rotate(360deg);
        }
        </style>
</head>

<body>
  <img class="eg4" src="./blue.jpg"></img>  
</body>
</html>

旋转演示

transform:translate( ) rotate( ) 可以实现位移和旋转的复合效果但是 位移必须放在旋转之前

以下是位移和旋转复合的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
      .eg7 img{
            transition: all 3s;
        }
      .eg7:hover img{
            transform: translate(650px) rotate(720deg);
        }
        </style>
</head>

<body>
    <div class="eg7">
        <img src="./blue.jpg" width="50px">
    </div>
</body>
</html>

位移旋转复合演示

2.3 transform:scale(x,y)缩放

注意:

  1. 取值可以为正数,负数,小数。正数表示基于指定的宽度和高度放大元素。负数不会缩小元素,而是反转后缩放元素。
  2. 如果省略第二个参数,则第二个参数等于第一个参数。

以下是缩放的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg8 img{
            width:100%;
            transition: all 1s;
        }
        .eg8:hover img{
            transform: scale(0.8);
        }
        </style>
</head>

<body>
     <div class="eg8">
        <img src="./blue.jpg" width="100px">
    </div>
</body>
</html>

缩放演示

2.4 transform:skew(x deg ,y deg)倾斜

注意:

  1. 正数表示分别沿x,y轴顺时针扭曲,负数表示反向方向。
  2. 省略第二个参数则默认在水平方向上倾斜,竖直方向上不变。
  3. 子元素会继承父元素的倾斜效果,如果避免可以设置为skew(0)。

以下是倾斜的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg9{
            margin-left: 50px;
            width:100px;
            height:200px;
            background-color: #f0b1b1;
            transition:all 1s;
        }
        .eg9:hover{
            transform: skew(10deg);
        }
        </style>
</head>

<body>
     <div class="eg9"></div>
</body>
</html>

倾斜演示

2.5 background-image:inear-gradient 渐变

2.5.1 线性渐变

  • 属性:
    background-image : linear-gradient(
    渐变方向,
    颜色1 终点位置 ,
    颜色2 终点位置 ,

    );
  • 取值:
    • 渐变方向:(可选,默认为由上到下):
      • to 方位
      • 角度度数
    • 终点位置(可选,默认为各50%):
      • 百分比
2.5.1.1 省略渐变方向和终点位置
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg10{
            margin:10px;
            width:200px;
            height:200px;
            background-image: linear-gradient(
                /* 省略方向,默认为从上到下 */
                rgb(240, 162, 162),rgb(169, 219, 169)
            );
        }
        </style>
</head>

<body>
     <div class="eg10"></div>
</body>
</html>

2.5.1.2 指定方向(to 方位)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg10{
            margin:10px;
            width:200px;
            height:200px;
            background-image: linear-gradient(
               to right,
               rgb(240, 162, 162),rgb(169, 219, 169)
            );
        }
        </style>
</head>

<body>
     <div class="eg10"></div>
</body>
</html>

2.5.1.3 指定方向(角度)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg10{
            margin:10px;
            width:200px;
            height:200px;
            background-image: linear-gradient(
               45deg,
               rgb(240, 162, 162),rgb(169, 219, 169)
            );
        }
        </style>
</head>

<body>
     <div class="eg10"></div>
</body>
</html>

2.5.1.4 指定终点位置
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg10{
            margin:10px;
            width:200px;
            height:200px;
            background-image: linear-gradient(
               rgb(240, 162, 162) 70% ,rgb(169, 219, 169)
            );
        }
        </style>
</head>

<body>
     <div class="eg10"></div>
</body>
</html>

2.5.2 径向渐变

  • 属性:
    background-image : linear-gradient(
    半径 at 圆心位置
    颜色1 终点位置 ,
    颜色2 终点位置 ,

    );

  • 取值:

    • 半径:(可以为2个,空格隔开,即椭圆)
    • 圆心位置:
      • 百分比
      • px
      • 方位
  • 2.5.2.1 圆心居中,一个半径:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg14{
            width: 100px;
            height:100px;
            border-radius: 50%;
            background-color: #f6bcbc;
            margin:10px ;
            background-image: radial-gradient(
                50px at center center,
                rgb(240, 33, 33) ,rgb(238, 198, 205)
            );
        }
        </style>
</head>

<body>
     <div class="eg14"></div>
</body>
</html>

  • 2.5.2.2 圆心居中,两个半径:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg15{
            width: 100px;
            height:100px;
            border-radius: 50%;
            background-color: #f6bcbc;
            margin:10px ;
            background-image: radial-gradient(
                50px 20px at center center,
                rgb(240, 33, 33) ,rgb(238, 198, 205)
            );
        }
        </style>
</head>

<body>
     <div class="eg15"></div>
</body>
</html>

  • 2.5.1.3 圆心偏移,一个半径:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        .eg16{
            width: 100px;
            height:100px;
            border-radius: 50%;
            background-color: #f6bcbc;
            margin:10px ;
            background-image: radial-gradient(
                50px 20px at center center,
                rgb(240, 33, 33) ,rgb(238, 198, 205)
            );
        }
        </style>
</head>

<body>
     <div class="eg16"></div>
</body>
</html>

![](https://i-blog.csdnimg.cn/direct/dfcf58bd5e7c4da88bc95150503209ee.png

三、动画

过渡与动画的区别:

  • 过渡:只能实现两个状态的变化,并且需要搭配hover
  • 动画:可以实现多个状态的变化,状态可控。

3.1 @keyframes animation

  • 定义
  1. @keyframes 动画名称{
    from{ … }
    to{ … }
    }
  2. @keyframes 动画名称{
    关键帧1{ … }
    关键帧2{ … }
    关键帧3{ … }

    }
  • 使用
    animation : 动画名称 动画时间
    示例:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
         @keyframes img1 {
            from{
                width:200px;
            }
            to{
                width:400px;
            }
        }
        .eg17{
            width:200px;
            animation:img1 2s
        }
        </style>
</head>

<body>
     <img class="eg17" src="./blue.jpg"></img>
</body>
</html>

动画示例1


2.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        @keyframes img2 {
            0%{
                width:200px;
            }
            50%{
                width:400px;
            }
            100%{
                width:200px;
            }
        }
        .eg18{
            width:200px;
            animation:img2 2s
        }
        </style>
</head>

<body>
     <img class="eg18" src="./blue.jpg"></img>
</body>
</html>

动画示例2

3.2 animation属性

注意:

  1. 动画名称和时间必须赋值
  2. 赋值不分先后顺序
  3. 如果有两个时间值,则第一个为动画时长,第二个为延迟时间

3.2.1 animation-interation-count 播放次数

取值:

  • number 数字
  • infinite 循环

3.2.2 animation-timing-function 速度曲线

  • linear 匀速 相当于cubic-bezier(0,0,1,1)
  • ease 慢-加快-慢 相当于cubic-bezier(0.25,0.1,0.25,1)
  • ease-in 慢-快(淡入) 相当于cubic-bezier(0.42,0,1,1)
  • ease-out 快-慢 (淡出)相当于cubic-bezier(0,0,0.58,1)
  • ease-in-out 低速开始,低速结束 相当于cubic-bezier(0.42,0,0.58,1)
  • steps(n) 分布动画 常配合精灵图实现精灵动画
  • cubic-bezier(n,n,n,n) 定义用于加速或减速的贝塞尔曲线 取值为0 - 1

3.2.3 animation-direction 播放方向

  • normal 默认
  • alternate 奇数次正向,偶数次逆向

3.3.4 animation-fill-function 完毕状态

  • forwards 停在结束状态
  • backwards 停在起始状态 (默认状态)

3.2.5 animation-play-state 动画暂停

  • paused 暂停 搭配hover使用

实际开发中animation的符合属性更常用,代码简洁明了。
以下是animation复合属性示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡,变形,动画</title>
    <style>
        @keyframes eg17 {
            from{width:200px;}
            to{width:800px}
        }
        .eg19{
            width: 200px;
            height:100px;
            background-color: #f9cccc;
            animation: eg17 1s linear infinite alternate;
        }
        .eg19:hover{
            animation-play-state: paused;
        }
        
        </style>
</head>

<body>
     <div class="eg19"> </div>
</body>
</html>

动画示例3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值