抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

摘要:本文主要介绍了CSS3的一些新特性。

1 简介

1.1 概述

CSS3是CSS2的升级版本,它在CSS2的基础上,新增了很多强大的新功能,从而解决一些实际面临的问题。

CSS3在未来会按照模块化的方式去发展,官方说明:说明文档

CSS3的新特性如下:

  • 新增了更加实用的选择器,例如伪类选择器和伪元素选择器等。
  • 新增了更好的视觉效果,例如圆角、阴影、渐变等。
  • 新增了丰富的背景效果,例如支持多个背景图片,同时新增了若干个背景相关的属性。
  • 新增了全新的布局方案,即弹性盒子。
  • 新增了Web字体,可以显示用户电脑上没有安装的字体。
  • 增强了颜色,例如HSL、HSLA、RGBA几种新的颜色模式,新增控制元素透明度的属性。
  • 增加了2D变形和3D变形,例如旋转、扭曲、缩放、位移等。
  • 增加动画与过渡效果,让变形更平滑。

1.2 私有前缀

W3C标准所提出的某个CSS特性,在被浏览器正式支持之前,需要根据浏览器的内核,通过私有前缀来使用该CSS特性,在浏览器正式支持该CSS特性后,就不需要私有前缀了。

如下代码中的-webkit-就是私有前缀:

css
1
2
3
4
5
div {
width: 400px;
height: 400px;
-webkit-border-radius: 20px;
}

常见浏览器私有前缀:

  • Chrome浏览器:-webkit-
  • Safari浏览器:-webkit-
  • Firefox浏览器:-moz-
  • Edge浏览器:-webkit-
  • Opera浏览器:-o-
  • IE浏览器:-ms-

查询CSS3兼容性的网站:caniuse

注意:

  • 在编码时,不用过于关注浏览器私有前缀,因为主流浏览器都支持常用的CSS3新特性。
  • 即便是为了老浏览器而加前缀,也可以借助现代的构建工具,比如webpack工具,自动添加私有前缀。

2 增强

2.1 新增长度单位

新增长度单位:

  • rem:根元素字体大小的倍数,只与根元素字体大小有关,根元素就是html元素
  • vw:视口宽度的百分之多少,10vw就是视口宽度的10%
  • vh:视口高度的百分之多少,10vh就是视口高度的10%
  • vmax:视口宽高中大的那个的百分之多少
  • vmin:视口宽高中小的那个的百分之多少

2.2 新增颜色表示

CSS3新增了三种颜色设置方式,分别是RGBA、HSL、HSLA,参考:CSS2入门-5-2-颜色

2.3 新增选择器

CSS3新增的选择器有伪类选择器和伪元素选择器,参考:CSS2入门-3-4-高级选择器

2.4 新增盒子属性

2.4.1 盒子宽高

常用属性:

属性名 作用 取值
resize 是否允许用户设置盒子宽高,需要和overflow属性配合使用 none:不允许(默认值)
both:允许用户设置盒子宽高
horizontal:只允许用户设置盒子宽度
vertical:只允许用户设置盒子高度

2.4.2 怪异盒子

常用属性:

属性名 作用 取值
box-sizing 设置盒模型的类型 content-box:widthheight设置的是盒子内容区的大小(默认值)
border-box:widthheight设置的是盒子总大小(怪异盒子)

2.4.3 盒子阴影

常用属性:

属性名 作用 取值
box-shadow 添加阴影 h-shadow:水平阴影的位置,必填,填写数值,可以为负值
v-shadow:垂直阴影的位置,必填,填写数值,可以为负值
blur:可选,模糊距离,填写数值
spread:可选,阴影的外延值,填写数值
color:可选,阴影的颜色,填写颜色代码
inset:可选,将外部阴影改为内部阴影,填写inset固定字符串
none:没有阴影(默认值)

语法:

css
1
box-shadow: 水平位置 垂直位置 模糊距离 外延值 颜色 inset;

注意:

  • 只有先设置blur属性,才能再设置spread属性,只存在spread属性会被当做blur属性。

2.4.4 不透明度

常用属性:

属性名 作用 取值
opacity 添加透明效果 0到1之间的小数,0是完全透明,1表示完全不透明

2.5 新增背景属性

2.5.1 背景尺寸

常用属性:

属性名 作用 取值
background-size 设置背景的尺寸 用长度值指定背景图片宽高,不允许负值
用百分比指定背景图片宽高,不允许负值
auto:背景图片的真实大小(默认值)
contain:将背景图片等比缩放,包含在容器内,保证背景在容器内完整显示
cover:将背景图片等比缩放,覆盖到容器内,保证容器内全都有背景显示

2.5.2 背景原点

常用属性:

属性名 作用 取值
background-origin 设置背景的原点 padding-box:从padding区域开始显示背景图像(默认值)
border-box:从border区域开始显示背景图像
content-box:从content区域开始显示背景图像

2.5.3 背景裁剪

常用属性:

属性名 作用 取值
background-clip 设置背景的向外裁剪的区域 border-box:从border区域开始向外裁剪背景(默认值)
padding-box:从padding区域开始向外裁剪背景
content-box:从content区域开始向外裁剪背景
text:只在文字上显示背景,前提是color属性值为transparent透明色

2.5.4 背景附着

常用属性:

属性名 作用 取值
background-attachment 设置背景在视口内的附着方式,是否跟随页面的滚动条滚动,是否跟随元素的滚动条滚动 scroll:背景相对于元素固定,不跟随元素的滚动条滚动,会跟随页面的滚动条滚动(默认值)
fixed:背景相对于视口固定,不跟随元素的滚动条滚动,不跟随页面的滚动条滚动
local:背景相对于元素内容固定,会跟随元素的滚动条滚动,会跟随页面的滚动条滚动

2.5.5 颜色渐变

常用属性:

属性名 作用 取值
background-image 设置背景的渐变颜色 linear-gradient:线性渐变,沿直线渐变
radial-gradient:径向渐变,沿弧线渐变
repeating-linear-gradient:循环线性渐变,在没有发生渐变的位置,继续进行线性渐变
repeating-radial-gradient:循环径向渐变,在没有发生渐变的位置,继续进行径向渐变

示例:

css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* 线性渐变,默认从上到下渐变 */
background-image: linear-gradient(red,yellow,green);
/* 线性渐变,使用关键词调整渐变方向 */
background-image: linear-gradient(to right top,red,yellow,green);
/* 线性渐变,使用角度调整渐变方向 */
background-image: linear-gradient(30deg,red,yellow,green);
/* 线性渐变,使用像素值调整渐变位置 */
background-image: linear-gradient(red 50px,yellow 100px,green 150px);
/* 径向渐变,默认从圆心四散 */
background-image: radial-gradient(red,yellow,green);
/* 径向渐变,使用关键词调整渐变圆心位置 */
background-image: radial-gradient(at right top,red,yellow,green);
/* 径向渐变,使用像素值调整渐变圆心位置 */
background-image: radial-gradient(at 100px 50px,red,yellow,green);
/* 径向渐变,使用关键字调整渐变形状为正圆 */
background-image: radial-gradient(circle,red,yellow,green);
/* 径向渐变,使用像素值调整渐变半径 */
background-image: radial-gradient(50px 100px,red,yellow,green);
/* 径向渐变,使用像素值调整渐变半径和渐变圆心位置 */
background-image: radial-gradient(50px 100px at 100px 50px,red,yellow,green);
/* 径向渐变,使用像素值调整渐变位置 */
background-image: radial-gradient(red 50px,yellow 100px,green 150px);

2.5.6 复合属性

常用属性:

属性名 作用 取值
background 设置背景复合属性 包含全部背景属性,空格分隔

语法:

css
1
background: 颜色 图片地址 重复方式 定位 / 尺寸 原点 裁剪方式;

注意:

  • 原点和裁剪方式的取值相同,如果只写一个值,则表示都设置,如果写了两个值,前面的是原点,后面的是裁剪方式。
  • 尺寸必须写在定位的后面,并且用/分开。

2.5.7 多背景图

CSS3允许元素设置多个背景图片。

示例:

css
1
2
3
4
background: url(images/bg-lt.png) no-repeat left top,
url(images/bg-rt.png) no-repeat right top,
url(images/bg-lb.png) no-repeat left bottom,
url(images/bg-rb.png) no-repeat right bottom;

2.6 新增边框属性

2.6.1 边框圆角

常用属性:

属性名 作用 取值
border-radius 复合属性,将盒子边框的四个角变为圆角,通过设置半径控制圆角范围 长度值,支持分别设置四个角的不同半径
border-top-left-radius 设置左上角圆角半径 长度值,支持分别设置水平半径和垂直半径
border-top-right-radius 设置右上角圆角半径 长度值,支持分别设置水平半径和垂直半径
border-bottom-left-radius 设置左下角圆角半径 长度值,支持分别设置水平半径和垂直半径
border-bottom-right-radius 设置右下角圆角半径 长度值,支持分别设置水平半径和垂直半径

2.6.2 边框外轮廓

常用属性:

属性名 作用 取值
outline-width 外轮廓的宽度 长度值
outline-color 外轮廓的宽度 颜色代码
outline-style 外轮廓的风格 none:无轮廓(默认值)
dotted:点状轮廓
dashed:虚线轮廓
solid:实线轮廓
double:双线轮廓
outline-offset 设置外轮廓与边框的距离,正负值都可以设置 长度值
outline 复合属性 可以包含除outline-offset之外的其他样式,空格分隔

2.7 新增文本属性

2.7.1 文本阴影

常用属性:

属性名 作用 取值
text-shadow 给文本添加阴影 h-shadow:水平阴影的位置,必填,填写数值,可以为负值
v-shadow:垂直阴影的位置,必填,填写数值,可以为负值
blur:可选,模糊距离,填写数值
color:可选,阴影的颜色,填写颜色代码
none:没有阴影(默认值)

语法:

css
1
box-shadow: 水平位置 垂直位置 模糊距离 颜色;

2.7.2 文本换行

常用属性:

属性名 作用 取值
white-space 设置文本换行方式 normal:文本超出边界自动换行,文本中的换行被浏览器识别为一个空格(默认值)
pre:原样输出,与pre元素的效果相同,超出元素边界不换行
pre-wrap:原样输出,超出元素边界自动换行
pre-line:原样输出,超出元素边界自动换行,只识别文本中的空格,首尾的空格会忽略
nowrap:强制不换行

2.7.3 文本溢出

常用属性:

属性名 作用 取值
text-overflow 设置文本内容溢出时的呈现模式 clip:当内联内容溢出时,将溢出部分裁切掉(默认值)
ellipsis:当内联内容溢出块容器时,将溢出部分替换为...

注意:

  • 要使得text-overflow属性生效,块容器必须显式定义overflow属性值为非visible的其他值,同时设置white-space属性值为nowrap

2.7.4 文本修饰

常用属性:

属性名 作用 取值
text-decoration 复合属性,升级了文本修饰 包含其他样式,空格分隔
text-decoration-line 设置文本装饰线的位置 none:指定文字无装饰(默认值)
underline:指定文字的装饰是下划线
overline:指定文字的装饰是上划线
line-through:指定文字的装饰是贯穿线
text-decoration-style 设置文本装饰线条的形状 solid:实线(默认)
double:双线
dotted:点状线条
dashed:虚线
wavy:波浪线
text-decoration-color 设置文本装饰线条的颜色 颜色代码

2.7.5 文本描边

常用属性:

属性名 作用 取值
-webkit-text-stroke-width 设置文字描边的宽度 长度值
-webkit-text-stroke-color 设置文字描边的颜色 颜色代码
-webkit-text-stroke 复合属性,设置文字描边宽度和颜色 包含其他样式,空格分隔

注意:

  • 文字描边功能仅webkit内核浏览器支持。

2.8 新增字体属性

2.8.1 基本用法

可以通过@font-face指定字体的具体地址,浏览器会自动下载该字体,这样就不依赖用户电脑上的字体了。

基础语法:

css
1
2
3
4
@font-face {
font-family: "定制字体";
src: url('webfont.ttf');
}

兼容语法:

css
1
2
3
4
5
6
7
8
9
10
@font-face {
font-family: "定制字体";
font-display: swap;
src: url('webfont.eot'); /* IE9 */
src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('webfont.woff2') format('woff2'),
url('webfont.woff') format('woff'), /* Chrome, Firefox */
url('webfont.ttf') format('truetype'), /* Chrome, Firefox, Opera, Safari, Android*/
url('webfont.svg#webfont') format('svg'); /* IOS 4.1- */
}

2.8.2 定制字体

中文的字体文件很大,使用完整的字体文件不现实,通常针对某几个文字进行单独定制。

可使用阿里Web字体定制工具:阿里Web字体定制

2.8.3 字体图标

好处:

  • 相比图片更加清晰,因为字体图标是矢量图,不会在放大后失真。
  • 灵活性高,更方便改变大小、颜色、风格等。
  • 兼容性好,IE也能支持。

常用字体图标库:

  • Font Awesome,优点是版权清晰,缺点是数量比较少,官网地址:Font Awesome
  • 阿里图标,优点是数量多,种类多,缺点是版权不清晰,并且需要登录,官网地址:阿里图标官网

Font Awesome字体图标使用步骤:

  1. 下载并解压。
  2. 将css和webfonts移动到项目中,css用于声明字体图标名称使用的字体,webfonts中包含了实现图标样式的字体文件。
  3. 将all.css引入到网页中:
    html
    1
    <link rel="stylesheet" href="./fa/css/all.css">
  4. 使用图标字体。

Font Awesome字体图标使用方式:

  • 方式一:在元素(通常是i元素)中使用class属性,通过样式和名称使用,样式支持简写:
    html
    1
    2
    <i class="fa-solid fa-car"></i>
    <i class="fas fa-car"></i>
  • 方式二:通过CSS样式选择器选中元素后,通过伪元素设置编码和字体使用,支持颜色和外边距等其他样式:
    css
    1
    2
    3
    4
    5
    6
    7
    li::before{
    content: '\f1b9';
    font-family: 'Font Awesome 5 Free';
    font-weight: 900;
    color: blue;
    margin-right: 10px;
    }
  • 方式三:还可以通过实体的方式使用,不过不太常用:
    html
    1
    <div class="fas">&#xf1b9</div>

Font Awesome字体图标说明:

  • 免费版的样式有solidbrands,分别代表实心图标和品牌图标,solid样式同类的高级样式还有regular等样式,不过这些高级样式是收费的。
  • solid样式对应Font Awesome 5 Free字体,brands对应Font Awesome 5 Brands字体。
  • 名称和编码可以在官网查到,每个图标的名称和编码一般是不同的。

阿里图标使用方式:

  • 方式一:下载到本地,参考下载后的说明文档使用即可,方法和Font Awesome类似,也有三种方式。
  • 方式二:在线使用,引入阿里服务器上的文件,其他和下载到本地类似。

2.9 新增对象属性

2.9.1 元素位置

常用属性:

属性名 作用 取值
object-position 设置对象元素的原点 使用两个维度定位,空格分隔,有多种方式:
1. 使用关键字(水平 垂直)设置位置:
水平:left、center、right
垂直:top、center、bottom
如果只写一个值,另一个方向的值取center
2. 使用坐标(x y)设置图片左上角的位置,以元素左上角为坐标原点:
如果只写一个值,会被当做x坐标,y坐标取center
3. 使用边缘距离设置图片位置,必须有四个值,分为前后两组:
一组代表上下,另一组代表左右,顺序没有要求
每组第一个值代表方向,第二个值代表边距

2.5.3 元素裁剪

常用属性:

属性名 作用 取值
object-fit 设置对象元素的向外裁剪的区域 fill:对象被填充,对象将被拉伸以适应内容框(默认值)
contain:对象被包含,对象将被保持比例缩放以适应内容框,宽高比不匹配时被添加黑边
cover:对象被覆盖,对象将被保持比例缩放以适应内容框,宽高比不匹配时被裁剪
none:被替换的内容将保持其原有的尺寸

3 变形

3.1 2D变形

3.1.1 坐标系

在学习2D变形和3D变形之前,需要先了解CSS中的坐标系。

原点:

  • 默认在盒子的左上角,包括边框但不包括外边距。

中心:

  • 默认在盒子的几何中心,即两条对角线的交点。

维度:

  • 坐标原点的横向被看作X轴,正值在坐标原点往右,负值在坐标原点往左。
  • 坐标原点的纵向被看作Y轴,正值在坐标原点往下,负值在坐标原点往上。
  • 坐标原点垂直于屏幕的方向被看作Z轴,正值是从坐标原点向屏幕外的方向,负值是从坐标原点向屏幕里的方向。

注意:

  • 因为行内元素不存在宽度和高度,所以2D和3D对行内元素无效。
  • 在3D场景下,因为无法观察Z轴,元素也不存在厚度,所以看到的是元素从3D到2D的投影。

3.1.2 位移

常用属性:

属性名 作用 取值
transform 改变元素的位置,参考坐标原点 translateX:设置X轴位移,支持指定长度值和百分比,百分比参考的是自身宽度
translateY:设置Y轴位移,支持指定长度值和百分比,百分比参考的是自身宽度
translate:一个值代表X轴,两个值分别代表X轴和Y轴,逗号分隔

示例:

css
1
2
transform: translateX(30px) translateY(40px);
transform: translate(50%,50%);

和相对定位的比较:

  • 位移与相对定位的相同:都不脱离文档流,不会影响到其它元素。
  • 位移与相对定位的区别:位移的百分比值参考的是其自身,相对定位的百分比值参考的是其父元素。
  • 浏览器针对位移有优化,处理位移的效率比相对定位更高。

位移配合定位,可实现子元素在父元素中同时水平居中和垂直居中。示例:

css
1
2
3
4
5
6
7
8
9
.parent {
position: relative;
}
.child {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}

3.1.3 缩放

常用属性:

属性名 作用 取值
transform 改变元素的大小,参照中心默认是元素的中心 scaleX:设置X轴的缩放比例,1表示不缩放,大于1表示放大,小于1表示缩小
scaleY:设置Y轴的缩放比例,1表示不缩放,大于1表示放大,小于1表示缩小
scale:一个值代表X轴和Y轴,两个值分别代表X轴和Y轴,逗号分隔

示例:

css
1
2
transform: scaleX(50%) scaleY(50%);
transform: scale(50%,50%);

注意:

  • 支持负数,如果设为-1会将原来的元素镜像显示,但几乎不用,因为容易产生误解。
  • 借助缩放,可实现小于12px的文字。

3.1.4 旋转

常用属性:

属性名 作用 取值
transform 让元素发生旋转,参照中心默认是元素的中心 rotateZ:设置2D旋转的角度值,绕Z轴旋转,正值顺时针,负值逆时针
rotate:一个值代表2D旋转,正值顺时针,负值逆时针

示例:

css
1
2
transform: rotateZ(30deg);
transform: rotate(30deg);

3.1.5 扭曲

常用属性:

属性名 作用 取值
transform 让元素发生拉扯变形 skewX:设置元素在X轴扭曲的角度值,不改变宽度,正值左上角向左同时右下角向右,负值左上角向右同时右下角向左
skewY:设置元素在Y轴扭曲的角度值,不改变高度,正值左上角向上同时右下角向下,负值左上角向下同时右下角向上
skew:一个值代表X轴和Y轴,两个值分别代表X轴和Y轴,逗号分隔

示例:

css
1
2
3
transform: skewX(30deg);
transform: skewY(30deg);
transform: skew(30deg,30deg);

3.1.6 多重变形

常用属性:

属性名 作用 取值
transform 复合属性,支持多种变形 包含其他样式,空格分隔

示例:

css
1
transform: translate(50%,50%) scale(50%,50%) rotate(30deg) skew(30deg,30deg);

注意:

  • 如果位移前有缩放,位移的距离需要乘以缩放的倍数,尽量将位移写在前面。
  • 如果位移前有旋转,旋转的参照中心不会受位移影响,尽量将旋转写在后面。

3.1.7 变形原点

常用属性:

属性名 作用 取值
transform-origin 设置变形的原点,对于缩放和旋转来说,改变的是参照中心 支持长度值、百分比、关键字,一个值跟类型有关,另一个取中间点,两个值分别代表X轴和Y轴,空格分隔

示例:

css
1
transform-origin: left top;

注意:

  • 变形原点对位移的影响是看不出来效果的,对缩放和旋转的影响是能看出来的,将设置的原点作为参照中心。
  • 如果只设置了长度值或百分比,则表示X轴,Y轴取中间点,如果只设置了关键字,则根据关键字表示X轴或Y轴,另一个取中间点。

3.2 3D变形

3.2.1 开启3D空间

常用属性:

属性名 作用 取值
transform-style 开启3D空间,元素进行3D变形的前提是父元素开启3D空间 flat:让子元素位于此元素的二维平面内,即2D空间(默认值)
preserve-3d:让子元素位于此元素的三维空间内,即3D空间

示例:

css
1
2
3
.parent {
transform-style: preserve-3d;
}

3.2.2 设置景深

景深指的是观察者与z=0平面的距离,能让发生3D变形的元素产生透视效果,让元素的投影看起来更加立体。

常用属性:

属性名 作用 取值
perspective 设置景深,需要给父元素设置 none:不指定透视(默认值)
长度值:指定观察者距离z=0平面的距离,负数会被认为是默认值none,最小值是0,趋近于0表示观察者贴近平面

示例:

css
1
2
3
.parent {
perspective: 200px;
}

注意:

  1. 如果设置了X轴或Y轴的旋转,可以看到子元素投影受父元素景深的影响。
  2. 如果未设置X轴或Y轴的旋转,并且Z轴的位移等于0,相当于2D平面的子元素,不受父元素景深的影响。
  3. 如果未设置X轴或Y轴的旋转,并且Z轴的位移大于0,此时子元素在投影前面,随着景深的减少:
    3.1 当景深大于位移时,观察者贴近子元素,子元素投影变大。
    3.2 当景深等于或者小于位移时,观察者贴合子元素,子元素投影消失。
    3.3 当景深小于0时,取值无效,不指定景深,子元素投影相当于2D平面的子元素。
  4. 如果未设置X轴或Y轴的旋转,并且Z轴的位移小于0,此时子元素在投影后面,随着景深的减少:
    4.1 当景深大于0时,观察者贴近子元素,子元素投影变小。
    4.2 当景深等于0时,观察者贴合2D平面,子元素投影相当于2D平面的一个点。
    4.3 当景深小于0时,取值无效,不指定景深,子元素投影相当于2D平面的子元素。

3.2.3 设置透视点位置

透视点位置就是观察者位置,默认的透视点在元素的中心。

常用属性:

属性名 作用 取值
perspective-origin 设置透视点位置,需要给父元素设置 支持长度值、百分比、关键字,一个值跟类型有关,另一个取中间点,两个值分别代表X轴和Y轴

示例:

css
1
2
3
.parent {
perspective-origin: left top;
}

3.2.4 位移

常用属性:

属性名 作用 取值
transform 在2D位移的基础上让元素沿Z轴位移,参考坐标原点 translateZ:设置Z轴位移,只支持长度值,正值向屏幕外,负值向屏幕里
translate3d:三个值分别代表X轴、Y轴、Z轴,逗号分隔,三个值必须同时设置,否则无效

示例:

css
1
2
transform: translateZ(30px);
transform: translate3d(50%,50%,30px);

注意:

  • 在X轴和Y轴的设置支持长度值和百分比,在Z轴的设置只支持长度值,因为元素没有厚度的概念,无法通过百分比确定具体长度值。
  • 只有在父元素的perspective属性值存在且大于0的情况下,才能设置Z轴的位移。
  • 当Z轴的位移大于perspective属性值的时候,元素位移到了观察者后面,即观察者看不到元素。

3.2.5 缩放

常用属性:

属性名 作用 取值
transform 在2D缩放的基础上让元素沿Z轴缩放,参考坐标原点 scaleZ:设置Z轴的缩放比例,1表示不缩放,大于1表示放大,小于1表示缩小
scale3d:三个值分别代表X轴、Y轴、Z轴,逗号分隔,三个值必须同时设置,否则无效

示例:

css
1
2
transform: scaleZ(0.5);
transform: scale3d(0.5,0.5,0.5);

注意:

  • 在Z轴进行缩放,理论上是对元素的厚度进行缩放,但是元素没有厚度的概念,所以其实是让元素更贴近观察者,效果上类似调整景深。
  • 在Z轴放大的效果,类似景深缩小相同倍数的效果,在Z轴缩小的效果,类似景深放大相同倍数的效果。

3.2.6 旋转

常用属性:

属性名 作用 取值
transform 在2D旋转的基础上让元素沿X轴和Y轴旋转,参照中心默认是元素的中心 rotateX:设置X轴旋转的角度值,正值顺时针,负值逆时针
rotateY:设置Y轴旋转的角度值,正值顺时针,负值逆时针
rotate3d:前三个值分别代表X轴、Y轴、Z轴,第四个值代表旋转的角度,四个值必须同时设置,否则无效

示例:

css
1
2
transform: rotateX(30deg) rotateY(30deg);
transform: rotate3d(1,1,1,30deg);

注意:

  • 通过rotate3d设置的前三个值描述的是坐标轴的矢量定义,取值是从0到1的矢量值。
  • 即使rotate3d的前三个值超过1的数值,也会进行内部隐式标准化:
    比如rotate3d(9,9,9,30deg)相当于rotate3d(1,1,1,30deg)的效果。
    比如rotate3d(10,1,0.5,30deg)相当于rotate3d(1,0.1,0.05,30deg)的效果。

3.2.7 多重变形

同2D多重变形类似,支持3D参数,建议将位移写前面同时将旋转写后面。

3.2.8 背部可见性

将元素在X轴旋转或者Y轴旋转前显示的一面称为正面,将元素在X轴旋转或者Y轴旋转后显示的一面称为背面。

常用属性:

属性名 作用 取值
backface-visibility 设置元素背面在面向用户时是否可见 visible:设置元素背面可见,允许显示正面的镜像(默认值)
hidden:设置元素背面不可见

示例:

html
1
2
3
4
5
6
<body>
<div class="box">
<div class="front">前面的图片在下层</div>
<div class="back">后面的图片在上层</div>
</div>
</body>
css
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
body {
perspective: 500px;
}
.box {
position: relative;
width: 300px;
height: 300px;
margin: 100px auto;
transform-style: preserve-3d;
}
.box:hover {
transform: rotate3d(0,1,0,180deg);
}
.box>div {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
text-align: center;
line-height: 300px;
}
.front {
background-color: pink;
}
.back {
background-color: coral;
/* 预先旋转显示下层元素 */
transform: rotateY(180deg);
/* 给上层元素设置背面不可见 */
backface-visibility: hidden;
}

注意:

  • 父元素作为盒子,两个子元素分别表示前面和后面,开启定位让两个子元素在同一位置,后面元素在前面元素上层,并且不会随父元素旋转而改变。
  • 上层元素预先旋转:上层元素在父元素旋转前显示正面,上层元素在父元素旋转后显示背面。所以先将上层元素进行旋转显示背面,这样在父元素旋转后就能显示正面。
  • 上层元素背面不可见:将上层元素进行旋转,并且上层元素的背面不可见后,显示下层元素的正面,父元素旋转后,上层元素显示正面,挡住了下层元素,所以下层元素背面是否可见是不影响的。

4 过渡

过渡可以在不使用Flash动画,不使用JavaScript的情况下,让元素从一种样式平滑过渡为另一种样式。

常用属性:

属性名 作用 取值
transition-property 定义过渡的属性,只有定义的属性才会有过渡效果 none:不过渡任何属性
all:过渡所有能过渡的属性
属性名:逗号分隔的多个属性名
transition-duration 定义过渡的时间,完成过渡需要的时间,时间越长过渡越平滑 0:没有过渡时间,即不过渡(默认值)
单个时间:所有属性设置相同时间,单位是s或者ms,表示秒或者毫秒
多个时间:给不同的属性设置不同的时间,逗号分隔,过渡时间和过渡属性对应
transition-delay 定义过渡的延迟,触发过渡后多久开始过渡 单位是s或者ms,表示秒或者毫秒
transition-timing-function 定义过渡的类型 ease:平滑过渡(默认值)
linear:线性过渡
ease-in:过渡由慢到快
ease-out:过渡由快到慢
ease-in-out:过渡由慢到快再到慢
steps(integer,?):接受两个参数的步进函数
step-start:等同于steps(1,start)
step-end:等同于steps(1,end)
cubic-bezie(number,number,number,number):特定的贝塞尔曲线类型
transition 复合属性,支持多种过渡 包含其他样式,空格分隔,如果时间只有一个,则表示过渡时间,如果时间有两个,则最后一个表示过渡延迟

注意:

  1. 不是所有的属性都能过渡,值为数字,或者值能转为数字的属性,都支持过渡,否则不支持过渡。
  2. 常见的支持过渡的属性有:
    颜色
    长度值
    百分比
    z-index
    opacity
    2D变形属性
    3D变形属性
    阴影

步进函数:

  • 第一个参数是正整数,指定函数的步数。
  • 第二个参数是start或end,指定每一步的值发生变化的时间点,默认值为end。

贝塞尔曲线:

  • 英文名是Bezier Curve,又称贝兹曲线或贝济埃曲线,可以通过二维坐标系描述曲线。
  • 在线制作贝赛尔曲线:cubic-bezier

5 动画

5.1 帧和关键帧

一段动画,就是一段时间内连续播放多个画面,每一张画面称为一帧。同样时间内,播放的帧数越多,画面看起来越流畅。

关键帧指的是,在构成一段动画的若干帧中,起到决定性作用的2-3帧,可以理解为和前后有明显差别的帧。

早期要求1秒内最低24帧,现在主流使用的是60帧,对延迟要求高的应用要求120帧或者更高。

5.2 基本使用

5.2.1 定义动画

定义动画实际上指的是定义一组关键帧,使用@keyframes设置动画名,可以定义多个动画名,但动画名不可以重复。

有两种方式:

  1. 简单方式定义:
    css
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @keyframes 动画名 {
    from {
    /*property1:value1*/
    /*property2:value2*/
    }
    to {
    /*property1:value1*/
    /*property2:value2*/
    }
    }
  2. 完整方式定义:
    css
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    @keyframes 动画名 {
    0% {
    /*property1:value1*/
    }
    20% {
    /*property1:value1*/
    }
    40% {
    /*property1:value1*/
    }
    60% {
    /*property1:value1*/
    }
    80% {
    /*property1:value1*/
    }
    100% {
    /*property1:value1*/
    }
    }

5.2.2 给元素应用动画

常用属性:

属性名 作用 取值
animation-name 给元素指定具体的动画 动画名
animation-duration 设置动画所需时间 单位是s或者ms
animation-delay 设置动画延迟 单位是s或者ms

示例:

css
1
2
3
4
5
6
7
8
.box {
/* 指定动画 */
animation-name: testKey;
/* 设置动画所需时间 */
animation-duration: 5s;
/* 设置动画延迟 */
animation-delay: 0.5s;
}

5.3 动画的其他属性

常用属性:

属性名 作用 取值
animation-timing-function 设置动画的类型 ease:平滑过渡(默认值)
linear:线性过渡
ease-in:过渡由慢到快
ease-out:过渡由快到慢
ease-in-out:过渡由慢到快再到慢
steps(integer,?):接受两个参数的步进函数
step-start:等同于steps(1,start)
step-end:等同于steps(1,end)
cubic-bezie(number,number,number,number):特定的贝塞尔曲线类型
animation-iteration-count 设置动画的播放次数 数值:动画循环次数
infinite:无限循环
animation-direction 设置动画方向 normal:正常方向(默认)
reverse:反方向运行
alternate:动画先正常运行再反方向运行,并持续交替运行,要求动画播放至少两次
alternate-reverse:动画先反运行再正方向运行,并持续交替运行,要求动画播放至少两次
animation-fill-mode 设置动画之外的状态 forwards:设置对象状态为动画结束时的状态,要求动画播放有限次数
backwards:设置对象状态为动画开始时的状态,要求动画播放有限次数
animation-play-state 设置动画的播放状态 running:运动(默认)
paused:暂停

5.4 复合属性

常用属性:

属性名 作用 取值
animation 设置动画复合属性 包含其他样式,空格分隔,如果时间只有一个,则表示动画时间,如果时间有两个,则最后一个表示动画延迟

注意:

  • 设置动画的播放状态的animation-play-state属性一般单独使用,复合使用会导致动画重新播放。

和过渡的区别:

  1. 动画不需要事件触发,过渡需要触发。
  2. 过渡只有开始和结束两个关键帧,动画可以设置多个关键帧,可以进行更细力度的控制。

6 多列布局

专门用于实现类似于报纸的布局。

分列数量相关属性:

属性名 作用 取值
column-count 指定列数 数值
column-width 指定列宽,自动计算列数 长度值
columns 同时指定列宽和列数,复合属性,取列数少的效果(不推荐使用) 包含列宽和列数,空格分隔

分列边框相关属性:

属性名 作用 取值
column-rule-style 设置列与列之间边框的风格 none:无(默认值)
solid:实线
dashed:虚线
dotted:点线
double:双实线
column-rule-width 设置列与列之间边框的宽度 长度值
column-rule-color 设置列与列之间边框的颜色 颜色代码,默认黑色
column-rule 设置列与列之间边框,复合属性 包含边框样式,空格分隔

分列其他属性:

属性名 作用 取值
column-gap 设置列边距 长度值
column-span 设置是否跨列 none:不跨列(默认值) all:跨列

注意:

  • 除了column-span属性要在跨列的元素上设置,其他属性都是在父元素上设置的。

7 弹性盒子

7.1 简介

2009年,W3C提出了一种新的盒子模型,即弹性盒子(Flexible Box),也称为伸缩盒模型,它可以轻松的控制:元素分布方式、元素对齐方式、元素视觉顺序、等等。

截止目前,除了在部分IE浏览器不支持,其他浏览器均已全部支持。

弹性盒子的出现,逐渐演变出了一套新的布局方案,即弹性布局,也称为Flex布局。

布局方式:

传统模型布局分三种模型,并且这三种模型紧密联系:

  • 流动模型(Flow):默认的网页布局模式,块级元素宽度总是100%,并且自上而下垂直分布,行内元素在包含元素内从左到右水平分布。
  • 浮动模型(Float):当元素设置了float属性,就会依照浮动的位置进行特定的定位。
  • 层模型(Layer):当元素设置了position属性,就会依照定位类型进行特定的定位。

因此,传统模型布局主要基于传统盒子模型、display属性、float属性、position属性。

弹性布局可以为盒状模型提供最大的灵活性,目前在移动端应用比较广泛,因为传统布局不能很好的呈现在移动设备上。

7.2 弹性容器和弹性项目

将元素的display属性设为flex或者设为inline-flex就可以将该元素变为弹性容器,其子元素(不包括后代元素)会变为弹性项目。

无论原来是哪种元素(块、行内块、行内),一旦成为了弹性项目,全都会块状化,如果没有设置宽度和高度,默认由内容撑开。

7.3 主轴与侧轴

概念:

  • 主轴:项目沿主轴排列,默认方向是水平从左到右。
  • 侧轴:与主轴垂直的就是侧轴,默认方向是垂直从上到下。

主轴换行相关属性:

属性名 作用 取值
flex-direction 设置主轴方向,同时也会影响侧轴方向 row:主轴方向水平从左到右(默认值)
row-reverse:主轴方向水平从右到左
column:主轴方向垂直从上到下
column-reverse:主轴方向垂直从下到上
flex-wrap 设置主轴换行方式 nowrap:主轴不换行,允许项目的高度超出容器,不允许项目的宽度超出容器,宽度超出时会压缩容器(默认值)
wrap:主轴自动换行,允许项目的高度超出容器,不允许项目的宽度超出容器,宽度超出时会换行
wrap-reverse:主轴自动反转换行,每一行的项目还是从左到右,但是每行的项目是从下到上排列,向上超出容器
flex-flow 复合属性 包含方向和换行,空格分隔

水平对齐相关属性:

属性名 作用 取值
justify-content 设置主轴对齐方式,控制项目水平位置 flex-start:主轴起点对齐(默认值)
flex-end:主轴终点对齐
center:水平居中对齐
space-between:主轴水平分散对齐,中间均匀分布,项目紧贴两端(最常用)
space-around:中间均匀分布,项目到两端距离与项目之间距离的一半相同
space-evenly:中间均匀分布,项目到两端距离与项目之间距离相同

垂直对齐相关属性:

属性名 作用 取值
align-items 设置侧轴对齐方式,以单个项目作为控制目标,控制项目在单行的垂直位置 flex-start:侧轴起点对齐
flex-end:侧轴终点对齐
center:垂直居中对齐
baseline:每行项目的第一行文字的基线对齐,后面的大字体项目会向上超出容器高度
stretch:如果项目设置了高度,按照起点对齐,如果项目没有设置高度,将占满整个容器的高度(默认值)
align-content 设置侧轴对齐方式,以一行项目作为控制目标,控制一行项目在容器的垂直位置,设置换行后有效 flex-start:侧轴起点对齐
flex-end:侧轴终点对齐
center:垂直居中对齐
space-between:侧轴垂直分散对齐,中间均匀分布,项目紧贴两端
space-around:中间均匀分布,项目到两端距离与项目之间距离的一半相同
space-evenly:中间均匀分布,项目到两端距离与项目之间距离相同
stretch:如果项目设置了高度,按照起点对齐,如果项目没有设置高度,将占满整个容器的高度(默认值)

垂直对齐显示逻辑:

  • 对于设置换行但是没有超出容器的项目,将容器高度减去每行项目的最大高度,得到的剩余高度按照行数平均分开,和每行项目的最大高度一起作为行高。
  • 使用align-items属性将每行最大高度和剩余平均高度作为行高,可以控制项目在行高里的垂直对齐,不能控制每行在容器里的垂直对齐。
  • 使用align-content属性将每行最大高度作为行高,可以控制每行在容器里的垂直对齐,不能控制项目在行高里的垂直对齐。并且只有设置换行,该属性才会生效,即单行无效。

同时水平居中和垂直居中:

  1. 在父元素开启弹性布局后,在父元素中设置水平居中和垂直居中。示例:
    css
    1
    2
    3
    4
    5
    6
    .outer {
    display: flex;
    justify-content: center;
    align-items: center;
    align-content: center;
    }
  2. 在父元素开启弹性布局后,在子元素中设置外边距自动。示例:
    css
    1
    2
    3
    4
    5
    6
    7
    8
    9
    .outer {
    display: flex;
    justify-content: center;
    align-items: center;
    align-content: center;
    }
    .inner {
    margin: auto;
    }

7.4 基准长度

常用属性:

属性名 作用 取值
flex-basis 设置项目主轴方向的基准长度,主轴横向会让宽度失效,主轴纵向会让高度失效 0:无(默认值)
solid:实线
dashed:虚线
dotted:点线
其他长度值:指定长度
flex-grow 设置项目的放大权重,默认为0,即使主轴存在剩余空间,该项目也不放大,前提是主轴存在剩余空间,否则无效 放大权重
flex-shrink 设置项目的缩小权重,默认为1,如果空间不足,该项目将会缩小 缩小权重
flex 复合属性 包含上述属性按照顺序设置,空格分隔:
1. 不放大,缩小,默认基准(默认值):
flex: 0 1 auto;
简写:flex: 0 auto;
2. 不放大,不缩小,默认基准
flex: 0 0 auto;
简写:flex: none;
3. 放大,缩小,默认基准
flex: 1 1 auto;
简写:flex: auto;
4. 放大,缩小,最小长度:
flex: 1 1 0px;
简写:flex: 1;

基准长度显示规则:

  • 默认情况下,以内容作为宽度显示。
  • 如果设置项目宽度,以项目宽度显示。
  • 如果设置项目宽度,又设置基准长度,如果内容长度小于基准长度,以基准长度显示,如果内容长度大于基准长度,比较项目宽度和内容长度,以最小值显示。

按权重放大规则:

  • 默认为0,表示不放大。
  • 如果所有项目设置为1,计算公式:
    css
    1
    项目放大的长度=剩余长度×(1÷项目数量)
  • 如果项目设置的不同,计算公式:
    css
    1
    项目放大的长度=剩余长度×(当前权重÷{(每个项目权重)求和})

按权重缩小规则:

  • 默认为1,表示如果项目长度超出,就按权重缩小项目长度,计算公式:
    css
    1
    项目缩小的长度=超出长度×[(1×项目长度)÷{(1×每个项目长度)求和}]
  • 如果项目设置的不同,计算公式:
    css
    1
    项目缩小的长度=超出长度×[(当前权重×项目长度)÷{(每个项目权重×每个项目长度)求和}]

7.5 单独对齐

常用属性:

属性名 作用 取值
align-self 设置单独项目的对齐方式 参考align-items属性,默认值为auto,表示继承父元素的align-items属性

7.6 项目排序

常用属性:

属性名 作用 取值
order 设置项目的排列顺序,数值越小,排列越靠前,默认为0,支持负值 数值

8 BFC

BFC,即块级格式化上下文(Block Formatting Context),可以理解为一种功能,当某些情况下元素满足条件时开启。

开启BFC的元素所具有的特点:

  • 元素开启BFC后,其子元素不会再产生外边距塌陷问题。
  • 元素开启BFC后,元素自身不会被其他浮动元素所覆盖。
  • 元素开启BFC后,就算其子元素浮动,元素自身高度也不会塌陷。

开启BFC的方式:

  • 根元素默认开启。
  • 表格相关的元素默认开启。
  • 行内块元素默认开启。
  • 块元素overflow属性设置不为visible的值后自动开启。
  • 将元素改为浮动元素后自动开启。
  • 给元素设置绝对定位或固定定位,称为定位元素后自动开启。
  • 弹性布局中的弹性项目自动开启。
  • 多列布局中的多列容器自动开启。
  • 多列布局中的多列项目,将元素的column-span属性的值设置为all后自动开启。
  • 将元素的display属性的值设置为flow-root后自动开启。

评论