首页 > 技术文章 > CSS3

ccv2 2020-05-31 21:23 原文

 

一、CSS3

CSS3现状

  • 在CSS2的基础上新增(扩展)样式
  • 移动端支持优于PC端
  • 不断改进中
  • 应用相对广泛

二、CSS3选择器

2.1 属性选择器(权重是10)

 

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        button {
            cursor: pointer;
        }
        /* 属性选择器使用方法 */
        /*选择的是:既是button又有disabled这个属性的元素*/
        button[disabled] {
            cursor: default;
        }
    </style>
</head>

<body>
    <button>按钮</button>
    <button>按钮</button>
    <button disabled="disabled">按钮</button>
    <button disabled="disabled">按钮</button>

</body>

 

 2.2 结构伪类选择器(权重10)

 

 

 

ul li:first-child {
     background-color: lightseagreen;
   }
   
   ul li:last-child {
     background-color: lightcoral;
   }
   
   ul li:nth-child(3) {
     background-color: aqua;
   }

nth-child 详解

   - 注意:本质上就是选中第几个子元素

   - n 可以是数字、关键字、公式

   - n 如果是数字,就是选中第几个

   - 常见的关键字有 `even` 偶数、`odd` 奇数

   - 常见的公式如下(如果 n 是公式,则从 0 开始计算)

   - 但是第 0 个元素或者超出了元素的个数会被忽略

 

 

 

<style>
     /* 偶数 */
     ul li:nth-child(even) {
       background-color: aquamarine;
     }
   
     /* 奇数 */
     ul li:nth-child(odd) {
       background-color: blueviolet;
     }
   
     /*n 是公式,从 0 开始计算 */
     ul li:nth-child(n) {
       background-color: lightcoral;
     }
   
     /* 偶数 */
     ul li:nth-child(2n) {
       background-color: lightskyblue;
     }
   
     /* 奇数 */
     ul li:nth-child(2n + 1) {
       background-color: lightsalmon;
     }
   
     /* 选择第 0 5 10 15, 应该怎么选 */
     ul li:nth-child(5n) {
       background-color: orangered;
     }
   
     /* n + 5 就是从第5个开始往后选择 */
     ul li:nth-child(n + 5) {
       background-color: peru;
     }
   
     /* -n + 5 前五个 */
     ul li:nth-child(-n + 5) {
       background-color: tan;
     }
   </style>

 

`nth-child`  `nt-of-type` 的区别:

 - `nth-child`  选择父元素里面的第几个子元素,不管是第几个类型,选择整个父元素里面的第几个孩子

 - `nt-of-type`  选择指定类型的元素,选择某个特定标签类型里面的第几个元素

    <div>
        <p>我是p</p>
        <span>我是span</span>
        <span>我是span</span>
        <span>我是span</span>
    </div>
div span:nth-child(1){
            background-color: pink;
        }

 

上面这个选择器是无法选择出任何元素的,因为这个选择器要求选出标签是span并且是 div(父元素) 的第一个孩子,这里面是没有满足这个两个条件的元素的

div span:nth-of-type(1) {
            background-color: purple;
        }

 

上面这个选择器可以选出第一个sapn元素,他选出的是满足标签是span,并且是从span这个类型的标签里面选择的第一个元素

2.3 伪元素选择器

伪类选择器是一个冒号,伪元素选择器是两个冒号

 

 

伪类选择器注意事项

   - `before``after` 必须有 `content` 属性

   - `before` 在内容前面,after 在内容后面

   - `before` 和 `after` 创建的是一个元素,但是属于行内元素

   - 创建出来的元素在 `Dom` 中查找不到,所以称为伪元素

   - 伪元素和标签选择器一样,权重为 1

 

伪元素字体图标

 

span {
            font-family: 'icomoon';
            position: absolute;
            top: 10px;
            right: 10px;
        }
        
        div,
        p {
            position: relative;
            width: 249px;
            height: 35px;
            border: 1px solid red;
        }
        
        p::after {
            content: "\ea50";
            position: absolute;
            top: 10px;
            right: 10px;
            font-family: 'icommon';
        }

 

 

    <div>
        <span></span>
    </div>
    <p></p>

 

上述代码的作用是,直接使用伪元素选择器在p标签里面创建了一个字体图标,不用像第一种方式创建一个div,里面再放一个span

此外使用字体图标的方式有两种:

一是复制里面的小图标放在标签里面

而是使用前面的代码放到伪元素里面的content中,注意前面要加上转义符\ 

 

三、2D转换 

转换(transform)是CSS3中最具有颠覆性的特征之一,可以实现元素的位移、旋转、缩放效果

转换(transform):

  • 移动:translate
  • 旋转:rotate
  • 缩放:scale

3.1 二维坐标系 

3.2 移动translate

改变元素在页面中的位置,类似定位

3.2.1 语法

transform: translate(x, y)
transform: translateX(n)
transfrom: translateY(n)

 

 

移动盒子的位置的方式:

  1. 定位
  2. 盒子的外边距
  3. 2d转换移动

3.2.2 重点   

-`2D` 的移动主要是指 水平、垂直方向上的移动

- `translate` 最大的优点就是不影响其他元素的位置(这是定位和外边距不能实现的)

- `translate` 中的100%单位,是相对于盒子本身的宽度和高度来进行计算的

-  行内标签没有效果

 

让盒子水平垂直居中

 div {
            position: relative;
            width: 500px;
            height: 500px;
            background-color: pink;
        }
        
        p {
            position: absolute;
            top: 50%;
            left: 50%;
            width: 200px;
            height: 200px;
            background-color: purple;
            transform: translate(-50%, -50%);
        }
<div>
    <p></p>
</div>

 

/*盒子往上走自己高度的一半,往左走盒子宽度的一半*/
transform: translate(-50%, -50%);

 

3.3 旋转rotate

3.3.1 语法

transform:rotate(度数)
transform:rotate(45deg) //角度为正值顺时针旋转,为负值时逆时针旋转

 

3.3.2 三角

以前是通过字体图标的方式放一个下三角,现在通过旋转的属性实现

<div></div>
        div {
            position: relative;
            width: 249px;
            height: 35px;
            border: 1px solid #000;
        }
        
        div::after {
            content: "";
            position: absolute;
            top: 8px;
            right: 15px;
            width: 10px;
            height: 10px;
            /* 给出一个右边框和一个下边框,再旋转45度即可 */
            border-right: 1px solid #000;
            border-bottom: 1px solid #000;
            transform: rotate(45deg);
            transition: all .2s;
        }
        /* 鼠标经过div,里面的after伪元素进行旋转 */
        
        div:hover::after {
            transform: rotate(225deg);
        }

 

3.3.3 设置元素旋转中心点(transform-origin)

transform-origin: x y;

- 注意后面的参数 x 和 y 用空格隔开

- x y 默认旋转的中心点是元素的中心 (50% 50%),等价于 `center`  `center`

- 还可以给 x y 设置像素或者方位名词(`top`、`bottom`、`left`、`right`、`center`)

3.4 缩放scale

transform:scale(x,y);

 

   - 注意,x 与 y 之间使用逗号进行分隔

   - `transform: scale(1, 1)`: 宽高都放大一倍,相当于没有放大

   - `transform: scale(2, 2)`: 宽和高都放大了二倍

   - `transform: scale(2)`: 如果只写了一个参数,第二个参数就和第一个参数一致

   - `transform:scale(0.5, 0.5)`: 缩小

   - `scale` 最大的优势:可以设置转换中心点缩放,默认以中心点缩放,而且不影响其他盒子

3.4.1 图片放大案例

<div><a href=""></a><img src="media/scale.jpg" alt=""></div>
<div><a href=""></a><img src="media/scale.jpg" alt=""></div>
<div><a href=""></a><img src="media/scale.jpg" alt=""></div>
        div {
            overflow: hidden;
            float: left;
            margin: 10px;
        }
        
        div img {
            transition: all .4s;
        }
        
        div img:hover {
            transform: scale(1.1);
        }

 

3.4.2 分页按钮案例

实现鼠标放在页码上,页码放大

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        li {
            float: left;
            width: 30px;
            height: 30px;
            border: 1px solid pink;
            margin: 10px;
            text-align: center;
            line-height: 30px;
            list-style: none;
            border-radius: 50%;
            cursor: pointer;
            transition: all .4s;
        }
        
        li:hover {
            transform: scale(1.2);
        }
    </style>
</head>

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>
</body>

 

3.5 2D转换综合写法

1.  知识要点

   - 同时使用多个转换,其格式为 `transform: translate() rotate() scale()`

   - 顺序会影响到转换的效果(先旋转会改变坐标轴方向)

   - 但我们同时有位置或者其他属性的时候,要将位移放到最前面

div:hover {
     transform: translate(200px, 0) rotate(360deg) scale(1.2)
   }

 

四、动画

4.1 什么是动画

动画是CSS3中最具颠覆性的特征之一,可通过设置多个节点来精确的控制一个或者一组动画,从而实现复杂的动画效果

4.2 动画的基本使用

   - 先定义动画

   - 在调用定义好的动画

4.3 语法格式(定义动画)

   @keyframes 动画名称 {
       0% {
           width: 100px;
       }
       100% {
           width: 200px
       }
   }

 

4.4 语法格式(使用动画)

   div {
       /* 调用动画 */
       animation-name: 动画名称;
        /* 持续时间 */
        animation-duration: 持续时间;
   }

 

4.5 动画序列

   - 0% 是动画的开始,100 % 是动画的完成,这样的规则就是动画序列

   - 在 @keyframs 中规定某项 CSS 样式,就由创建当前样式逐渐改为新样式的动画效果

   - 动画是使元素从一个样式逐渐变化为另一个样式的效果,可以改变任意多的样式任意多的次数

   - 用百分比来规定变化发生的时间,或用 `from` 和 `to`,等同于 0% 和 100%

百分比是时间的划分,比如总时间为10s,25%就是2.5s

 

4.6 动画属性

 

 简写形式:

/* animation: 动画名称 持续时间 运动曲线 何时开始 播放次数 是否反方向 起始与结束状态 */
animation: name duration timing-function delay iteration-count direction fill-mode

   - 简写属性里面不包含 `animation-paly-state`

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

   - 要想动画走回来,而不是直接调回来:`animation-direction: alternate`

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

 

4.7 速度曲线细节

animation-timing-function: 规定动画的速度曲线,默认是`ease`

 

 奔跑的熊大

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

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body {
            background-color: #ccc;
        }
        
        div {
            position: absolute;
            width: 200px;
            height: 100px;
            background: url(media/bear.png) no-repeat;
            /* 元素可以添加多个动画 用逗号分割 */
            animation: bear 1s steps(8) infinite, move 3s forwards;
        }
        
        @keyframes bear {
            0% {
                background-position: 0 0;
            }
            100% {
                background-position: -1600px 0;
            }
        }
        
        @keyframes move {
            0% {
                left: 0;
            }
            100% {
                left: 50%;
                transform: translate(-50%);
            }
        }
    </style>
</head>

<body>
    <div></div>
</body>

</html>

 

元素可以添加多个动画,用逗号隔开即可

五、3D转换 

5.1 3D移动 translate3d

   - `3D` 移动就是在 `2D` 移动的基础上多加了一个可以移动的方向,就是 z 轴方向

   - `transform: translateX(100px)`:仅仅是在 x 轴上移动

   - `transform: translateY(100px)`:仅仅是在 y 轴上移动

   - `transform: translateZ(100px)`:仅仅是在 z 轴上移动

   - `transform: translate3d(x, y, z)`:其中x、y、z 分别指要移动的轴的方向的距离

   - **注意:x, y, z 对应的值不能省略,不需要填写用 0 进行填充**

5.2 透视perspective

   - 如果想要网页产生 `3D` 效果需要透视(理解成 `3D` 物体投影的 `2D` 平面上)

   - 实际上模仿人类的视觉位置,可视为安排一直眼睛去看

   - 透视也称为视距,所谓的视距就是人的眼睛到屏幕的距离

   - 距离视觉点越近的在电脑平面成像越大,越远成像越小

   - 透视的单位是像素

  - **透视需要写在被视察元素的父盒子上面**

 

 

     - d:就是视距,视距就是指人的眼睛到屏幕的距离

     - z:就是 z 轴,z 轴越大(正值),我们看到的物体就越大

body {
     perspective: 1000px;
   }

 

5.3 translatez

1.  `translateZ``perspecitve` 的区别

   - `perspecitve` 给父级进行设置,`translateZ` 给 子元素进行设置不同的大小

5.4 3D旋转 rotate3d

1. 语法

   - `transform: rotateX(45deg)` -- 沿着 x 轴正方向旋转 45 度

   -  `transform: rotateY(45deg)` -- 沿着 y 轴正方向旋转 45 度

   -  `transform: rotateZ(45deg)` -- 沿着 z 轴正方向旋转 45 度

   - `transform: rotate3d(x, y, z, 45deg)` -- 沿着自定义轴旋转 45 deg 为角度

 

  `rotate3d`

   - `transform: rotate3d(x, y, z, deg)` -- 沿着自定义轴旋转 deg 为角度

   - x, y, z 表示旋转轴的矢量,是标识你是否希望沿着该轴进行旋转,最后一个标识旋转的角度

     - `transform: rotate3d(1, 1, 0, 180deg)` -- 沿着对角线旋转 45deg

     - `transform: rotate3d(1, 0, 0, 180deg)` -- 沿着 x 轴旋转 45deg

5.5 3D呈现 transform-style

   1.  `transform-style`

      - ☆☆☆☆☆ 

      -  控制子元素是否开启三维立体环境

      - `transform-style: flat`  代表子元素不开启 `3D` 立体空间,默认的

      - `transform-style: preserve-3d` 子元素开启立体空间

      -  代码写给父级,但是影响的是子盒子

 5.6 案例

3D导航栏

 

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

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        ul {
            margin: 100px;
        }
        
        ul li {
            width: 120px;
            height: 35px;
            list-style: none;
            /* 之后需要给box也添加透视,因此没有把这个透视属性加在box上面,反而加在了li上 */
            perspective: 500px;
        }
        
        .box {
            position: relative;
            width: 100%;
            height: 100%;
            transform-style: preserve-3d;
            transition: all .5s;
        }
        
        .box:hover {
            transform: rotateX(90deg);
        }
        
        .front,
        .bottom {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
        }
        
        .front {
            background-color: pink;
            z-index: 1;
            /* 我们先把紫色盒子沿着x轴旋转90度,
            之后并没有把紫色盒子向后移动宽度的一半,而是把粉色盒子向前移动了宽度的一半 */
            /* 这样才能让整个盒子立方体沿着中心点旋转,否则盒子将会沿着 */
            transform: translateZ(17.5px);
        }
        
        .bottom {
            background-color: purple;
            /* 必须先写移动 */
            transform: translateY(17.5px) rotateX(-90deg);
        }
    </style>
</head>

<body>
    <ul>
        <li>
            <div class="box">
                <div class="front">哼唧哼唧</div>
                <div class="bottom">哼唧哼唧</div>
            </div>
        </li>
    </ul>
</body>

</html>

 

旋转木马

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

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        body {
            perspective: 1000px;
        }
        
        section {
            position: relative;
            width: 300px;
            height: 300px;
            margin: 150px auto;
            transform-style: preserve-3d;
            /* 添加动画效果 */
            animation: rotate 6s linear infinite;
            background: url(media/pig.jpg) no-repeat;
        }
        
        section:hover {
            /* 鼠标放上去暂停旋转 */
            animation-play-state: paused;
        }
        
        @keyframes rotate {
            0% {
                transform: rotateY(0);
            }
            100% {
                transform: rotateY(360deg);
            }
        }
        
        section div {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: url(media/dog.jpg) no-repeat;
        }
        
        section div:nth-child(1) {
            transform: translateZ(300px);
        }
        
        section div:nth-child(2) {
            /* 先旋转好了再移动 */
            transform: rotateY(60deg) translateZ(300px);
        }
        
        section div:nth-child(3) {
            /* 先旋转好了再移动 */
            transform: rotateY(120deg) translateZ(300px);
        }
        
        section div:nth-child(4) {
            /* 先旋转好了再移动 */
            transform: rotateY(180deg) translateZ(300px);
        }
        
        section div:nth-child(5) {
            /* 先旋转好了再移动 */
            transform: rotateY(240deg) translateZ(300px);
        }
        
        section div:nth-child(6) {
            /* 先旋转好了再移动 */
            transform: rotateY(300deg) translateZ(300px);
        }
    </style>
</head>

<body>
    <section>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </section>
</body>

</html>

 

六、浏览器私有前缀

浏览器私有前缀是为了兼容老版本的浏览器,比较新版本的浏览器无需添加

七、背景线性渐变

 

背景渐变必须添加浏览器私有前缀

起始方向可以是:方位名词 或者度数,如果省略默认就是top

 

推荐阅读