css3详解

133 阅读8分钟

什么是css3?

CSS3是CSS(层叠样式表)技术的升级版本(是CSS2的升级版本,3只是版本号,它在CSS2.1 的基础上增加了很多强大的新功能),于1999年开始制订,2001年5月23日W3C完成了CSS3的工作草案,主要包括盒子模型、列表模块、超链接方式、语言模块、背景和边框、文字特效、多栏布局等模块 。

css3的新特性

1.动画(animation)

动画(animation)CSS3中具有颠覆性的特征之一,可通过多个节点来精确控制一个或一组动画,常用来实现复杂的动画效果。

相比较过渡,动画可以实现更多变化,更多控制,连续自动播放等效果。

动画的制作过程

首先定义动画,然后元素调用动画;那么如何定义动画呢?、

用keyframes定义动画

 @keyframes 动画名称 {
            /* 初始状态 */
            0% {
               
            }
            /* 结束状态 */
            100% {
            }
        }

使用动画:

 div {
            width: 200px;
            height: 200px;
            background-color: pink;
            /*调用动画: 动画名称 */
            animation-name: move;
            /* 持续时间 */
            animation-duration: 2s;
        }

创建一个简单的demo感受一下; 需求:页面打开,元素从左向右移动:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=], initial-scale=1.0">
    <title>动画animation</title>
    <style>
        /* 1.定义动画 */
        @keyframes move {
            /* 开始状态 */
            0% {
                transform: translateX(0px);
            }
            /* 结束状态 */
            100% {
                transform: translateX(1000px);
            }
        }
        .at {
            width: 100px;
            height: 100px;
            background-color: pink;
            /* 2.调用动画 */
            /* 动画名称 */
            animation-name: move;
            /* 持续时间 */
            animation-duration: 4s;
        }
    </style>

</head>
<body>
    <div class="at"></div>
</body>
</html>

动画序列:

  • 动画从0%开始到100%结束,这个规则就是动画的序列。
  • 在 @keyframes中定义css样式,就能创建由当前样式逐渐改变为新样式的动画效果。
  • 动画是使元素从一种样式逐渐变化为另一种样式的效果,可以改变任意多的样式任意多的次数。
  • 变化的时间要使用百分比的形式,或者使用“from"和“to”,等同与于“0%”和“100%”。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=], initial-scale=1.0">
    <title>动画animation</title>
    <style>
        /* 动画序列 */
        /* 1.可以做多个状态的变化  keyframe 关键帧 */
        /* 2.里面的百分比是整数 */
        /* 3.里面的百分比就是总的时间的划分 */
        @keyframes move {
            /* 0%的内容可以不写,也可以直接不写0% */
           0% {
 
           }
           25% {
               transform: translate(1000px, 0);
           }
           50% {
               transform: translate(1000px, 200px);
               background-color:red;
           }
           75% {
               transform: translate(0px, 200px);
           }
           100% {
               transform: translate(0, 0);
               background-color:#000;
           }
        }
        .at {
            width: 200px;
            height: 200px;
            background-color: pink;
            /* 2.调用动画 */
            /* 动画名称 */
            animation-name: move;
            /* 持续时间 */
            animation-duration: 10s;
        }
    </style>

</head>
<body>
    <div class="at"></div>
</body>
</html>

动画的属性

WechatIMG79424.png

动画的速度曲线

image.png

动画属性简写:

animation: 动画名称 持续时间 运动曲线 何时开始 播放次数 是否反方向 动画起始或者结束的状态; 简写属性里面不包含animation-play-state

· 暂停动画:animation-play-state: paused; 经常和鼠标经过等其他配合使用

· 想要动画走回去,而不是直接跳回来:animation-direction: alternate

· 盒子动画结束后,停在结束位置:animation-fill-mode: forwards

2.圆角(border-radius)

使用方法:border-radius:圆角值;圆角值接收1-4个值:

  • 如果只有一个值,则代表每个圆角相同(border-radius:10px; //4个圆角都为10px)
  • 如果有两个值,则分别代表左上、右下两个和右上、左下两个圆角(border-radius:10px 5px; //左上、右下两个圆角都为10px,右上、左下两个都是5px;)
  • 如果有三个值,第一个代表左上,第二个是右上和左下,第三个是右下;
  • 如果有四个值,则依次代表左上,右上,右下,左下;
  • 单独设置某一个角的圆角,使用border-xxx-xxx-radius(xxx代表位置,左上就是border-top-left-radius)

利用圆角属性,可以实现一些特殊的效果:

  • 常规圆角
 div {
            width: 200px;
            height: 200px;
            background-color: pink;
            border-radius:10px ;
        }

image.png

  • 圆角实现圆形 ``
    div {
            width: 200px;
            height: 200px;
            background-color: pink;
            /*元素为正方形时,设置圆角为宽高的一半*/
           /* border-radius:100px ; */
             /* 也可以用百分比*/
             border-radius:50%;
        }

image.png

  • 圆角实现半圆
  div {
            width: 200px;
            height: 100px;
            background-color: pink;
            border-radius: 100px 100px 0  0 ;
        }

image.png

  • 圆角实现扇形
div {
            width: 100px;
            height: 100px;
            background-color: pink;
            border-radius: 100px 0 0 0 ;
        }

image.png

说到图形绘制,再额外增加两个常用的图形绘制,三角形和梯形,与圆角无关

  • 边框实现三角形
 div {
            width: 0;
            height: 0;
            border-top: 50px solid red;
            border-left: 50px solid blue;
            border-right: 50px solid orange;
            border-bottom: 50px solid pink;
        }

image.png

  • 边框实现梯形
   div {
            width: 100px;
            height: 0;
            border-bottom: 80px solid red;
            border-left: 50px solid transparent;
            border-right: 50px solid transparent;
        }

image.png

3.阴影

3.1 文本阴影(text-shadow)

语法

text-shadow: h-shadow v-shadow blur color;

属性

image.png

使用文字阴影可以实现多种炫酷文字效果

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=], initial-scale=1.0">
    <title>文本阴影(text-shadow)</title>
    <style>
        body{
            background-color: #000;
        }
        div{
            margin:20px 0;
            font-size: 30px;
        }
        .fd {
            color: #eee;
            text-shadow: -1px -1px 0 #fff, 1px 1px 0 #333, 1px 1px 0 #444;
        }

        .mb {
            text-shadow: 2px 2px 0 #9f4d95, -2px 2px 0 #9f4d95, 2px -2px 0 #9f4d95, -2px -2px 0 #9f4d95;
        }

        .thd {
            color: #fff;
            text-shadow: -2px -2px #ddd, -3px -3px #ddd, -4px -4px #ddd, -5px -5px #ddd;
        }

        .hy {
            text-shadow: 0 0 4px white, 0 -5px 4px #ff3, 2px -10px 6px #fd3, -2px -15px 11px #f80,
                2px -25px 18px #f20;
        }

        .gy {
            text-shadow: 0 0 20px #fff, 0 0 40px #ca8eff, 0 0 60px #6f00d2;
        }
    </style>

</head>

<body>
    <div class="fd">
        浮雕效果
    </div>
    <div class="mb">
        描边效果
    </div>
    <div class="thd">
        3D效果
    </div>
    <div class="hy">
        火焰特效
    </div>
    <div class="gy">
        光影特效
    </div>
</body>

</html>

image.png

3.2 盒子阴影(box-shadow)

语法

box-shadow: *h-shadow v-shadow blur spread color* inset;

属性

image.png

使用盒子阴影可以实现盒子的3D效果和模糊背影,在日常开发中用到的还算多

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=], initial-scale=1.0">
    <title>盒子阴影(box-shadow)</title>
    <style>
       .box1{
        width: 200px;
        height: 200px;
        background-color: #8ac007;
        margin: 50px;
        box-shadow: 10px 10px 5px green;
       }
       .box2{
        width: 200px;
        height: 200px;
        background-color: #8ac007;
        margin: 50px;
        box-shadow: 0 10px 30px rgba(0,0,0,.5);
       }
       .box3{
        width: 200px;
        height: 200px;
        background-color: #8ac007;
        margin: 50px;
        box-shadow: 0 0 30px rgba(0,0,0,.5) inset;
       }
    </style>

</head>

<body>
    <div class="box1">
      盒子悬浮效果1
    </div>
    <div class="box2">
        盒子悬浮效果2
    </div>
    <div class="box3">
        内阴影效果
    </div>
    
</body>

</html>

image.png

4.渐变(gradients)

之前的渐变只能通过图像实现,css3提供gradients渐变来实现,有效的减少下载的时间和宽带的使用;

CSS3 定义了两种类型的渐变(gradients):

(1)线性渐变(Linear Gradients)- 向下/向上/向左/向右/对角方向 (2)径向渐变(Radial Gradients)- 由它们的中心定义

4.1 线性渐变:至少定义两种颜色结点。颜色结点即你想要呈现平稳过渡的颜色。同时,你也可以设置一个起点和一个方向(或一个角度)。

语法

background: linear-gradient(direction, color-stop1, color-stop2, ...);

线性渐变实例:

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=], initial-scale=1.0">
    <title>渐变(gradient)</title>
    <style>
        /* 线性渐变默认从左到右 */
        .line-left {
                width: 300px;
                height: 300px;
                background: linear-gradient(red, blue);
        }
        /* 如果需要别的方向渐变,需要指定方向 */
        .line-top {
                width: 300px;
                height: 300px;
                background: linear-gradient(to right,red, blue);
        }
        .line-diagonal {
                width: 300px;
                height: 300px;
                background: linear-gradient(to bottom right,red, blue);
        }
    </style>

</head>

<body>
    <div style="display:flex;justify-content: space-around;">
        <div>
            线性渐变:从左到右
            <div class="line-left"></div>
        </div>
        <div >
            线性渐变:从上到下
            <div class="line-top "></div>
        </div>
        <div >
            线性渐变:对角
            <div class="line-diagonal"></div>
        </div>
    </div>
   

</body>

</html

image.png

4.2 射线渐变 :至少定义两种颜色结点。颜色结点即你想要呈现平稳过渡的颜色。同时,你也可以指定渐变的中心、形状(圆形或椭圆形)、大小。默认情况下,渐变的中心是 center(表示在中心点),渐变的形状是 ellipse(表示椭圆形),渐变的大小是 farthest-corner(表示到最远的角落)。

语法

background: radial-gradient(center, shape size, start-color, …,last-color);

实例

    <!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=], initial-scale=1.0">
    <title>渐变(gradient)</title>
    <style>
        /* 均匀分布 */
        .grad-uniformity {
            width: 300px;
            height: 300px;
            background: radial-gradient(red, yellow, green);
        }

        /* 颜色节点自定义 非均匀分布 */
        .grad-Uneven {
            width: 300px;
            height: 300px;
            background: radial-gradient(red 5%, yellow 10%, green 80%);
        }

        /*shape 参数定义了形状;
         它可以是值 circle 或 ellipse;
          circle 表示圆形  默认 ellipse 椭圆 */
        .grad-circle {
            width: 500px;
            height: 300px;
            background: radial-gradient(circle, red, yellow, green);
        }
    </style>

</head>

<body>
    <div style="display:flex;">
        <div class="grad-uniformity"></div>
        <div class="grad-Uneven"></div>
        <div class="grad-circle"></div>
    </div>
</body>

</html>

效果

image.png

5.转换(transform)

转换的效果是让某个元素改变形状,大小和位置。 transform 属性向元素应用 2D 或 3D 转换。该属性允许我们对元素进行旋转、缩放、移动或倾斜。(注意:transform不会触发回流,和重绘)

所有操作的默认的基点都在中心位置,可以使用 transform-origin: (x,y) 来改变元素基点,一般基本不会用到。

5.1 移 动(translate)

语法:transform:translate(x,y)   x,y 单位为元素单位

  2D:  transform:translate(x轴偏移,y轴偏移)  
        transform:translateX(x) 相对x轴偏移 
        transform:translateY(y) ......
          
  3D   transform:translate3d(x轴偏移,y轴偏移,z轴偏移) 
       transform:translateZ(z) ......

 
transform: translate(10px,20px);

image.png

注意:transform偏移和position偏移的区别,position定位位移可以根据自身属性设置进行相对于自身/或者浏览器视窗等效果,但是有一个问题。就是它的位置变动会引起回流重绘。transform不会有这个问题,原因就是它的移动过程是通过GPU控制的支持硬件加速。并不需要软件⽅⾯的渲染。有疑惑的话可以分别使用position和transform完成一个动画,就能看出来明显区别。

 根据translate的特性,我们可以使用translate配合其它css属性进行对于一个元素的居中,例如translate配合position就可以实现一个不定宽高元素的垂直左右居中

5.2 缩 放(scale)

 语法:transform:scale()x,y是缩放倍数 
 
   2D: transform:scale(x,y)  
        transform:scaleX(x)  
        transform:scaleY(y) 
          
  3D   transform:scale(x,y,z) 
       transform:scaleZ(z) 
transform: scale(0.3,0.5);

image.png

5.3 旋 转(rotate)

语法:transform:rotate(angle)angle是角度deg,负值为逆时针
 
  2D: transform:rotate(angle)
          
  3D   transform:rotate3d(x,y,z,angle) 
       transform:rotateZ(angle) 
       transform:rotateX(angle)  
       transform:rotateY(angle) 
    transform: rotate(30deg);

image.png

5.4 倾斜

语法:transform:skew(x-angle,y-angle) 
     倾斜只有2D效果   
     skew(x-angle,y-angle) 
     skewX(angle) 
     skewY(angle)
     
     
  transform: skew(50deg);

image.png

5.5 其它

 定义不进行转换。
none3D 转换元素定义透视视图。
perspective(n)
 定义 2D 转换,使用六个值的矩阵。
matrix(n,n,n,n,n,n)
 定义 3D 转换,使用 16 个值的 4x4 矩阵。
matrix3d(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n)

看一下transform属性实现的一些效果吧:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="referrer" content="no-referrer" />
    <meta name="viewport" content="width=\, initial-scale=1.0">
    <title>CSS3立方体旋转动画</title>
 
    <style>
        * {
            margin: 0 auto;
            padding: 0;
        }
 
        div.wrap {
            width: 120px;
            height: 120px;
            position: absolute;
            left: 50%;
            top: 50%;
            transform: translateX(-50%) translateY(-50%); /*利用位移来处理垂直水平居中*/
        }
 
        .wrap > div.cube {
            width: 120px;
            height: 120px;
            position: relative;
            transform-style: preserve-3d;
            transform: rotateX(-50deg) rotateY(-50deg) rotateZ(0deg); /*旋转*/
            animation: move 20s infinite linear; /*动画*/
        }
 
        /*关键帧*/
        @keyframes move {
            0% {
                transform: rotateX(0deg) rotateY(0deg);
            }
            100% {
                transform: rotateX(360deg) rotateY(360deg);
            }
        }
 
        .cube > div {
            width: 100%;
            height: 100%;
            position: absolute;
            opacity: 0.8;
            transition: all 0.4s ease-in-out, box-shadow 0.4s ease-in-out; /*过渡 属性 时间 过渡曲线*/
        }
 
        .cube div.out-front {
            transform: translateZ(60px); /*转换  位移*/
        }
 
        .cube div.out-back {
            transform: translateZ(-60px) rotateY(180deg); /*转换 位移 旋转*/
        }
 
        .cube div.out-left {
            transform: translateX(-60px) rotateY(-90deg);
        }
 
        .cube div.out-right {
            transform: translateX(60px) rotateY(90deg);
        }
 
        .cube div.out-top {
            transform: translateY(-60px) rotateX(90deg);
        }
 
        .cube div.out-bottom {
            transform: translateY(60px) rotateX(-90deg);
        }
    </style>
</head>
<body>
<div class="wrap">
    <div class="cube">
        <div class="out-front"><img style="width: 100%;height:100%;" src="https://files-cdn.cnblogs.com/files/cjsblog/cube01.bmp"></div>
        <div class="out-back"><img style="width: 100%;height:100%;" src="https://files-cdn.cnblogs.com/files/cjsblog/cube02.bmp"></div>
        <div class="out-left"><img  style="width: 100%;height:100%;" src="https://files-cdn.cnblogs.com/files/cjsblog/cube03.bmp"></div>
        <div class="out-right"><img src="https://files-cdn.cnblogs.com/files/cjsblog/cube04.bmp"></div>
        <div class="out-top"><img style="width: 100%;height:100%;" src="https://files-cdn.cnblogs.com/files/cjsblog/cube05.bmp"></div>
        <div class="out-bottom"><img  style="width: 100%;height:100%;" src="https://files-cdn.cnblogs.com/files/cjsblog/cube06.bmp"></div>
    </div>
</div>
</body>
</html>

image.png

ps:这个不是我做的,之前看别人做的。:瞬移

6.过渡 (transition)

定义:CSS3 过渡是元素从一种样式逐渐改变为另一种的效果。
通过过渡transition,可以让web前端开发人员不需要javascript就可以实现简单的动画交互效果。

语法:transition 属性是一个简写属性,用于设置四个过渡属性:

transition: property duration timing-function delay;

属性:

image.png

6.1 transition-property 用于指定要执行过渡的属性

- 多个属性之间使用 ',' 隔开
- 如果所有属性都需要过渡,则使用 all 关键字
- 大部分属性都支持过渡效果,注意过渡时必须是从一个有效数值向另外一个有效数值进行过渡

6.2 transition-duration 用于指定过渡效果的持续时间

时间单位: s 秒 和 ms 毫秒

ps:特别注意:transition-property 和transition-duration两个属性必须同时给定,否则是不会出现过渡效果的,

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=\, initial-scale=1.0">
    <title>过渡(transition)</title>

    <style>
        .box1 {
            width: 500px;
            height: 500px;
            background-color: yellowgreen;
        }

        .box1 div {
            width: 100px;
            height: 50px;
        }

        .box2 {
            background-color: aqua;
    margin-bottom: 100px;
    transition-property: width, height;
    transition-duration: 2s, 1000ms;

        }

        .box3 {
            background-color: antiquewhite;
        }

        .box1:hover div {
            width: 200px;
    height: 100px;
        }
    </style>
</head>

<body>
    <div class="box1">
        <div class="box2"></div>
        <div class="box3"></div>
    </div>
</body>

</html>

可以用上面的代码体验一下效果

6.3 transition-timing-function 表示过渡的时序函数

    - 指定过渡的执行方式

    - 可选值:

           ease 默认值,慢速开始,先加速,再减速

           linear 匀速运动

           ease-in 加速运动

           ease-out 减速运动

           ease-in-out 先加速 后减速

           cubic-bezier() 来制定时序函数(贝塞尔曲线)

     - https://cubic-bezier.com ,这是一个贝塞尔曲线的网址,可以自己拖动曲线,

            获取想要的结果,有兴趣的小伙伴可以试试

            steps() 分步执行过渡效果

                - 第一个参数表示分几步

                - 第二个参数:

                    start 在时间开始时就执行过渡

                    end 在时间结束时执行过渡(默认值)

下面改动上面的代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=\, initial-scale=1.0">
    <title>过渡(transition)</title>

    <style>
        .box1 {
            width: 500px;
            height: 500px;
            background-color: yellowgreen;
        }

        .box1 div {
            width: 100px;
            height: 50px;
        }

        .box2 {
            background-color: aqua;
            margin-bottom: 100px;
            transition-property: margin-left;
            transition-duration: 2s;

        }

        .box3 {
            background-color: antiquewhite;
            transition-property: margin-left;
            transition-duration: 2s;
            transition-timing-function: linear;
        }   

        .box1:hover div {
            margin-left: 400px;
        }
    </style>
</head>

<body>
    <div class="box1">
        <div class="box2"></div>
        <div class="box3"></div>
    </div>
</body>

</html>

cubic-bezier()改动下,修改box3的 transition-timing-function

.box3 {
     transition-timing-function: cubic-bezier(.13,1.51,.82,-0.59);
  }

steps() 则是分步进行,我们同样修改 .box3 的 transition-timing-function:

.box3 {
    transition-timing-function: steps(3,start);
}

6.4 transition-delay: 过渡效果的延迟,等待一段时间后再执行过渡

修改上面的box3:

.box3 {
  background-color: antiquewhite;
  transition-property: margin-left;
  transition-duration: 2s;
  transition-delay: 1s;
 }

常用的就列这么几个吧,还有像媒体查询等等,后面再加吧,感谢观看,如有问题,欢迎指教