Loading

CSS3新特性

CSS3 新增选择器

属性选择器

属性选择器可以根据元素特定的属性来选择元素。这样就可以不借助于类或者id选择器。

  1. 利用属性选择器可以不用借助类和id选择器。
input[value] {

}

以上选择器只选择具有 value 属性的 input。

  1. 属性选择器还可以选择 属性=值 的某些元素
input[type=text] {

}

  1. 属性选择器可以选择属性值开头的某些元素
div[class^=icon] {

}

<div class="icon1">小图标1</div>
<div class="icon2">小图标2</div>
<div class="icon3">小图标3</div>
<div class="icon4">小图标4</div>

  1. 属性选择器可以选择属性值结尾的某些元素
div[class$=data]{

}

<div class="icon1-data">小图标1</div>
<div class="icon2-data">小图标2</div>
<div class="icon3-ico">小图标3</div>

  1. 属性选择器可以选择属性值存在某些值的元素
div[class*=con]{

}

<div class="icon1-data">小图标1</div>
<div class="icon2-data">小图标2</div>
<div class="icon3-ico">小图标3</div>

注意:类选择器,伪类选择器,属性选择器的权重都是10

结构伪类选择器

结构伪类选择器主要根据文档结构来选择元素,常用于根据父级选择里面的子元素。

Untitled

nth-child(n)

选择某个父元素中的一个或者多个特定的子元素。

  • 其中 n 可以是数字,关键字和公式
  • 如果n是数字,那么就是选择第n个子元素,里面的数字从1开始
  • n 可以是关键字:even偶数,odd奇数
  • n 可以是公式:常见的公式如下(如果n是公式,则从0开始计算,但是第0个元素或者超出元素的个数会被忽略)

Untitled

nth-child 和 nth-of-type 的区别

E:nth-child 给所有的孩子标号

E:nth-of-type 仅仅给要选择的孩子E标号

详情看如下

<style>
    /* 由于 nth-child(n) 给所有孩子都标号,所以这里的第一个孩子选择的是p 光头强,但是光头强不是指定的div标签,所以不做更改 */
    section div:nth-child(1) {
    color: pink;
    }
    /* 由于 nth-of-type(n) 仅仅给指定孩子标号,所以这里只给div标号,选取第1个,就是div中标号的第一个,因此将熊大选出 */
    section div:nth-of-type(1) {
        color: pink;
    }
</style>
<body>
    <section>
    <p>光头强</p>
      <div>熊大</div>
      <div>熊二</div>
    </section>
</body>

伪元素选择器(重点)

为元素选择器可以利用CSS创建新标签元素,而不需要HTML标签,从而简化HTML结构。

Untitled

注意:

  • before 和 after 创建一个元素,但是属于行内元素
  • 新创建的这个元素在文档树中是找不到的,所以我们称为伪元素
  • 语法:element::before{}
  • before 和 after 必须有 content 属性
  • before 在父元素内容的前面创建元素,after 在父元素内容的后面插入元素
  • 伪元素选择器标签选择器一样,权重为1

伪元素清除浮动

.clearfix::after {
            content: "";
            display: block;
            height: 0;
            clear: both;
            visibility: hidden;
        }

.clearfix::before,
.clearfix::after {
  content:"";
    /* 转换为块级元素并且在一行内显示 */
    display:table;
}

.clearfix::after {
    clear:both;
}

CSS3 盒子模型

CSS3中可以通过box-sizing来指定盒子模型,有2个值:可以指定为 content-box、border-box,这样一来我们计算盒子大小的方法也发生了改变。

可以分为两种情况:

  1. box-sizing: content-box; 盒子大小为 width + padding + border (以前默认的)
  2. box-sizing: border-box; 盒子大小为 width

如果盒子模型设置为第二种,那么 padding 和 border 就不会撑大盒子了 (前提是 padding 和 border 不会超过 width 宽度

CSS3 图片模糊处理 filter

filter 属性将模糊或颜色偏移等图形效果应用于元素。

filter: 函数(); 例如:filter:blur(5px); blur模糊处理数值越大越模糊

CSS3 计算盒子宽度 calc 函数

可以使用 calc 函数在声明属性值时执行一些计算。

width: calc(100%-80px);

括号里可以使用 + - * / 来计算

CSS3 过渡

过渡(transition)是 CSS3 中具有颠覆性的特征之一, 我们可以在不使用 Flash 动画或者 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果。

过渡动画:是一个状态 渐可以渐的过度到另一个状态

可以让我们页面更加好看,更动感十足,虽然低版本浏览器不支持(ie9以下版本)但是不会影响页面布局。

我们现在经常和 :hover 一起搭配使用

transition: 要过渡的属性 花费时间 运动曲线 何时开始:

  1. 属性:想要变化的 css 属性,宽度高度 背景颜色 内外边距都可以。如果想要所有的属性都变化过度,写一个 all 就可以。
  2. 花费时间:单位时 秒(必须写单位)比如 0.5s
  3. 运动曲线:默认是 ease(可以省略)
  4. 何时开始:单位时 秒(必须写单位)可以设置延迟触发时间 默认是 0s(可以省略)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>过渡</title>
    <style>
        .box {
            width: 100px;
            height: 100px;
            margin: auto;
            background-color: pink;
            /* transition: width 1s ease-in-out 1s, height 1s ease-in-out 1s; */
            transition: all 0.5s;
        }

        .box:hover {
            width: 200px;
            height: 200px;
        }
    </style>
</head>
<body>
    <div class="box">

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

CSS3 2D转换

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

转换可以简单理解为变形。

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

移动translate

2D移动是2D转换里面的一种功能,可以改变元素在页面中的位置,类似定位

语法:

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

demo:

<style>
    div {
        width: 200px;
        height: 200px;
        background-color: pink;
        /* x就是x轴上移动位置,y就是y轴上移动位置 */
        /* transform: translate(200px, 100px); */
    }
    div:first-child {
        transform: translate(30px, 30px);
    }
    div:last-child {
        background-color: purple;
    }
</style>
<body>
    <div></div>
    <div></div>
</body>

重点:

  • 定义2D转换中的移动,沿着X和Y轴移动元素。
  • translate最大的优点是不会影响其它元素的位置。
  • translate中的百分比单位是相对于自身元素的translate: (50%, 50%)
  • 对行内标签没有效果。

实例:水平垂直居中

在没有transform的时候我们要实现一个盒子在父盒子中水平垂直居中都需要我们用到计算。比如:先用定位将盒子上和坐各移动50%这时盒子并不在最中央,我们还需要让其向上移动自己高度的一半,向左走自己宽度的一半才可实现。

由于transform中的百分比是相对于自身的,所以我们可以使用定位+transform来实现免计算水平垂直居中。

<style>
    .box {
        position: relative;
        width: 600px;
        height: 800px;
        background-color: pink;
    }

    .box>div {
        position: absolute;
        top: 50%;
        left: 50%;
        width: 200px;
        height: 200px;
        background-color: purple;
        transform: translate(-50%, -50%);

    }
</style>
<body>
    <div class="box">
        <div></div>
    </div>
</body>

旋转rotate

2D旋转指的是让元素在2维平面内顺势站或者逆时针旋转。

语法:

transform: rotate(度数);

demo:

<style>
    div {
        width: 100px;
        height: 100px;
        background-color: pink;
        transform: rotate(15deg);
    }
</style>
<body>
    <div></div>
</body>

重点:

  • rotate里面跟度数,单位是deg比如rotate(45deg)。
  • 角度为正时,顺时针;负时,逆时针。
  • 默认旋转的中心点是元素的中心点。

2D转换中心点transform-origin

我们可以设置元素转换的中心点。

transform-origin: x y;

重点:

  • 注意后面的参数x和y用空格隔开。
  • x y默认转换中心是元素的中心点(50% 50%)。
  • 还可以给x y设置像素或者方位名词(top、bottom、left、right、center)。

案例:三角

我们可以利让正方形旋转45度,然后只显示其两个border,省去了导入字体图标的麻烦。

<style>
    div {
        position: relative;
        width: 300px;
        height: 35px;
        margin: 100px auto;
        border: 1px solid #000;
    }
    div::after {
        content: "";
        position: absolute;
        width: 7px;
        height: 7px;
        top: 14px;
        right: 15px;
        border-top: 2px solid #000;
        border-right: 2px solid #000;
        transform: rotate(45deg);
    }
</style>
<body>
    <div></div>
</body>

案例:旋转遮罩显示

<style>
    div {
        width: 200px;
        height: 200px;
        border: 1px solid pink;
        margin: 100px auto;
        overflow: hidden;
    }

    div::before {
        content: "brokyz";
        display: block;
        width: 100%;
        height: 100%;
        background-color: hotpink;
        transform: rotate(180deg);
        transform-origin: left bottom;
        transition: all 0.3s;
    }

    div:hover::before {
        transform: rotate(0deg);
    }
</style>
<body>
    <div></div>
</body>

缩放scale

缩放,顾名思义,可以放大和缩小。只要给元素加上了这个属性就能控制它放大还是缩小。

语法:

transform: scale(x, y);

注意:

  • 注意其中的x和y用逗号分隔
  • transform: scale(1, 1)宽高都放大1倍,等同于没有放大。
  • transform: scale(2, 3)宽放大2倍,高放大3倍。
  • transform: scale(2)宽高都放大2倍。
  • transform: scale(0.5)缩小。78z
  • scale缩放的优势:可以设置中心点缩放,而不影响其它盒子的位置。

demo:

<style>
    div {
        width: 200px;
        height: 200px;
        margin: 300px auto;
        background-color: pink;
        transform-origin: left bottom;
        transition: all 0.3s;
    }

    div:hover {
        /* transform: scale(2, 3); */
        transform: scale(2);
    }
</style>
<body>
    <div></div>
</body>

2D转换综合写法

我们可以将2D转换的变换进行综合。

transform: translate() rotate() scale ...;

注意:

  • 变换的书写顺序会影响转换的效果(先旋转会改变原来的坐标轴方向)。
  • 当我们同时有位移和其它属性的时候,记得要把位移放在最前面

CSS3动画

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

制作动画分为两步:

  1. 先定义动画。
  2. 再使用(调用)动画。

定义动画keyframes

demo:

/* 方法1 */
@keyframes 动画名称 {
    0% {
        width: 100px;
    }
    100% {
        width:200px;
    }
}

/* 方法2 */
@keyframes 动画名称 {
    from {
        width: 100px;
    }
    to {
        width:200px;
    }
}

/* 规定不同阶段  */
@keyframes 动画名称 {
    0% {
        width: 100px;
    }
    50% {
        width: 200px;
    }
    100% {
        width:100px;
    }
}

动画序列

  • 0%是动画的开始,100%是动画的完成。这样的规则就是动画序列。
  • @keyframes中规定某项CSS样式,就能创建当前样式逐渐改为新样式的动画效果。
  • 动画是使元素从一种样式逐渐变化为另一种样式的效果。您可以改变任意多的样式任意多的次数
  • 请用百分比来规定变化发生的时间,或用关键词fromto,等同于0%和100%

调用动画

当有元素想要使用动画时,我们就给那个元素的CSS中加上已经定义好的动画名animation-name和完成动画所需要的时间animation-duration就可以调用我们所定义的动画了。

demo:

div {
                width: 200px;
                height: 200px;
                background-color: pink;
                animation-name: move;
                animation-duration: 3s;
            }

实例:环绕

<style>
    /* 1. 定义动画 */
    @keyframes move {
        /* 开始状态 */
        0% {
            transform: translate(0, 0);
        }
        25% {
            transform: translate(1000px, 0);
        }
        50% {
            transform: translate(1000px, 500px);
        }
        75% {
            transform: translate(0, 500px);
        }
        /* 结束状态 */
        100% {
            transform: translate(0, 0);
        }
    }
    /* 2. 调用动画 */
    div {
        width: 200px;
        height: 200px;
        background-color: pink;
        animation-name: move;
        animation-duration: 3s;
    }
</style>
<body>
    <div></div>
</body>

动画常用属性

Untitled

  • 伴随opicity 使用来调整元素透明度。

动画属性简写

animation: 动画名称 持续时间 运动曲线 何时开始 播放次数 是否反方向 动画起始或动画结束的状态

demo:

animation: myfirst 5s linear 2s infinite alternate;

注意:

  • 前面两个属性name duration一定要写。
  • 其余属性保持默认的可以省略不写。
  • animation-play-state需要单独写,不能写在属性简写里面。

案例:小圆点扩散动画

<style>
    .box {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }

    .dotted {
        margin: auto;
        width: 8px;
        height: 8px;
        background-color: #09f;
        border-radius: 50%;
    }

    .box div[class^="pulse"] {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: 8px;
        height: 8px;
        box-shadow: 0 0 20px #009dfd;
        border-radius: 50%;
        animation: pulse 2.4s linear infinite;
    }
    .box div.pulse2 {
        animation-delay: 0.8s;
    }
    .box div.pulse3 {
        animation-delay: 1.6s;
    }
    @keyframes pulse {
        0% {
        }
        70% {
            width: 40px;
            height: 40px;
            opacity: 1;
        }
        100% {
            width: 70px;
            height: 70px;
            opacity: 0;
        }
    }
</style>
<body>
    <div class="box">
        <div class="dotted"></div>
        <div class="pulse1"></div>
        <div class="pulse2"></div>
        <div class="pulse3"></div>
    </div>
</body>

  • 里面小圆点的扩散不使用scale进行扩散的原因是,scale会将阴影部分也放大,实际效果不好

速度曲线细节

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

Untitled

案例:打字机效果

<style>
    div {
        width: fit-content;
        height: 30px;
        font-size: 20px;
        animation: type 2s steps(8) infinite;
        background-color: antiquewhite;
        overflow: hidden;
    }
    @keyframes type {
        0% {
            width: 0;
        }
        100% {
            width: 160px;
        }
    }
</style>
<body>
    <div>这是打字机效果</div>
</body>

CSS3 3D转换

我们的生活中的环境是3D的,照片就是3D物体在2D平面呈现的例子。

特点

  • 近大远小。
  • 物体后面遮挡不可见。

三维坐标系

三维坐标系其实就是指立体空间,立体空间是由3个轴共同组成的。

  • x轴:水平向右
  • y轴:垂直向下
  • z轴:垂直屏幕向外

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 分别指要移动的方向的距离

透视 perspective

在 2D 平面产生近大远小视觉立体,但是只是二维效果的。

  • 如果想要在网页生成 3D 效果需要透视(可以理解为3D物体投影在2D平面内)。
  • 模拟人类的视觉位置,可以认为安排一只眼睛去看。
  • 透视我们也称为视距:视距就是人的眼睛到屏幕的距离。
  • 距离视觉点越近的在电脑平面成像越大,越远成像越小。
  • 透视的单位是像素。
perspective: 400px;

透视是需要写在观察元素的父盒子里面的(注意只能写在父元素中)

  • 视距:人眼到电脑屏幕的距离。
  • z轴:物体距离屏幕的距离,z轴越大我们看到的物体就越大。

3D旋转roate3d

3D旋转指可以让元素在三维平面内沿着x轴,y轴,z轴或者自定义轴进行旋转。

语法:

  • transform: rotateX(45deg):沿着x轴方向旋转45度。
  • transform: rotateY(45deg):沿着y轴方向旋转45度。
  • transform: rotateZ(45deg):沿着z轴方向旋转45度。
  • transform: rotate3d(x, y, z, 45deg):沿着自定义轴旋转自定义度。

左手法则

左手大拇指指向轴的正方向,四指的指向就是对应轴旋转的正方向。

3D呈现 transform-style

  • 控制子元素是否开启三维立体环境。
  • transform-style: flat子元素不开启3d立体空间。默认。
  • transform-style: preserve-3d子元素开启3d立体空间。
  • 代码写给父级,但是影响子盒子。
  • 这个属性非常重要。

浏览器私有属性

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

私有前缀

  • moz-:代表Firefox浏览器私有属性。
  • ms-:代表ie浏览器私有属性。
  • webkit-:代表safari、chrome私有属性。
  • o-:代表Opera私有属性。

提倡写法

-moz-border-radius: 10px;
-webkit-border-radius: 10px;
-o-border-radius: 10px;
border-radius: 10px;

!important

表示最高权级,不可被覆盖。

color: pink !important;
posted @ 2022-06-29 17:53  brokyz  阅读(68)  评论(0编辑  收藏  举报