前言
CSS3是CSS(层叠样式表)技术的升级版本, 对盒子模型、列表模块、超链接方式、语言模块、背景和边框、文字特效、多栏布局等模块进行了规范, 使表现层结果更加可控
基本概念回顾
- 样式表由规则组成
- 规则由选择器与声明块组成
- 声明由CSS属性与键值对组成
- CSS选择器渲染是从右向左寻找
选择器
-
基本选择器
- 通配符
*
- id选择器
#
- 类选择器
.
- 后代选择器
空格
- 元素选择器
元素名
- 分组
,
(结合符)
- 通配符
-
基本选择器扩展
- 子元素选择器
>
- 相邻兄弟选择器
+
- 通用兄弟选择器
~
- 子元素选择器
-
属性选择器
-
存在及值选择器
[attr]
选中存在attr属性的元素[attr=val]
选中值为val的属性[attr~=val]
选中值中以空格分隔时带有val属性的元素 -
子串值属性选择器
[attr|=val]
选中值为val或者以val-开头的元素[attr^=val]
选中以val开头的元素[attr$=val]
选中以val结尾的元素[attr*=val]
选中值包含有val值的元素
-
-
伪类选择器
-
链接伪类 只能给链接标签a使用
:link
:visited
由于隐私问题, 这个伪类只能控制color
,background-color
,border-color
:target
点击a元素, a元素的锚点充当id选择器来选中的某个元素, 锚点会在URL中显示出来 -
动态伪类
:hover
:active
-
表单伪类
:enable
:disable
:checked
:focus
-
结构性伪类
- index从1开始
-
:nth-child(index)
-
例子:
#wrap li:nth-child(1)
找到#wrap
下第一个子元素且这个子元素必须为li
li:nth-child(1)
找到所有标签的第一个子元素且这个子元素必须为li
-
延伸
:first-child
:last-child
:nth-last-child
:only-child
相当于:first-child:last-child
-
-
:nth-of-type(index)
-
例子:
#wrap li:nth-of-type(1)
找到#wrap
下第一个li
子元素li:nth-of-type(1)
, 找到所有标签的第一个li
子元素重要问题:这个属性以元素为中心, 当父元素中有多个不同子元素, 此选择器可能同时选中不同元素
#wrap .inner:nth-of-type(1)
, 找到#wrap
下各种元素中的第一个子元素且类为inner的而不是找到#wrap
下第一个子元素且类为inner的 -
延伸
:first-of-type
:last-of-type
:nth-last-of-type
:only-of-type
相当于:first-of-type:last-of-type
-
-
:empty
不能含有任何内容, 包括空格
-
伪元素选择器, 可以使用单冒号或者双冒号,位于dom树之外, 是由css进行创建
::after
::before
::firstletter
第一个字母::firstline
第一行::selection
光标选中的部分
-
自定义字体与字体图标
CSS3提供, 不能放在声明块中
@font-face{
font-family: "字体名",
src: url(路径)
}
上传矢量图到icomoon转换成字体demo再根据demo修改自己的页面 由于字体图标属于font, 当想修改样式时通过修改font相关的样式来修改字体图标
新增UI样式
-
opacity
性能较visibility高, 不继承但是子元素会应用透明效果
-
rgba
第四个参数是设置
opacity
值, 可以省略0, 例子rgba(0,0,0,.5)
-
text-shadow
默认值为
none
, 不可继承可选值:[(x偏移量, y偏移量, 模糊程度, 颜色)]{1,}
可以添加多层阴影
-
浮雕文字
字体设为白色, 使用字体阴影
-
模糊字体
使用
text-shadow
的第四个参数 -
模糊图片
使用浏览器过滤器
filter: flur(10px)
来对指定元素模糊(不是对元素背景)
-
-
transition
给元素添加指定时长的动画效果, 参数为s
-
direction
设置文字呈现方向
可选值:ltr, rtl等, 配合
unicode-bidi:bidi-override
-
-webkit-text-stroke
非CSS3内容, 由浏览器自主实现文字描边功能
-webkit-text-stroke: <length> <color>;
新增盒模型样式
-
box-shadow
默认值为
none
, 不可继承可选值:[(inset/outset, x偏移量, y偏移量, 模糊程度, 模糊面积, 颜色)]{1,}
-
-webkit-box-reflict
非CSS3内容, 由浏览器自主实现box倒影
*可选值:-webkit-box-reflict: <方向> <间距>*间距>方向>
第三个参数可以设置为渐变
ilnear-gradient/radial-gradient
-
resize
控制块元素伸缩
常用可选值:
vertical
,horizontal
,both
-
box-sizing
border-box
使盒模型在设置宽高时会自动调整内容区使宽高包括内边距与边框content-box
默认值
新增UI样式
-
border-radius
默认值
0
, 不可继承百分数水平参照于盒模型的宽度, 垂直参照盒模型高度, 最高值为
50%
, 超出将被设置为50%
, 在IOS5或者安卓4之前不能使用, 尽量不要使用-
可选值:
当没有
/
时, 内部画的圆按照参数不同分别按顺序应用于左上, 右上, 右下, 左下radius
当有
/
时, 内部画的圆对于4个角来说X轴半径固定, Y轴半径按照参数不同分别按顺序应用于左上, 右上, 右下, 左下(first radius)/radius
-
-
border-image-source
设置边框图片, 参数为url()
必须配合
border-width
与border-style
使用, 但是border-style
的效果不会生效只显示图片配合
border-image-slice
来决定图片在边框的分布, 对图片按照上右下左的顺序根据设定值规定的距离进行切割再放置在边框上例如
border-image-slice:33.3333%
,就是对这个图片距离上右下左33.3333%
的地方切割放置在边框上, 当加上fill
值时才将图片中心内容当做background-imgage
给图填充否则不填充浏览器会将切割好的部分平均分成三部分放置在边框角和边框上, 边框上的图片默认会被拉伸, 由
border-image-repeat
的值决定-
border-image-repeat
1.
repeat
边框上的部分从边框中心开始平铺, 两边可能会被截断 2.round
平铺图像 当不能整数次平铺时, 根据情况放大或缩小图像。 3.stretch
拉伸 4.space
平铺图像 当不能整数次平铺时, 会用空白间隙填充在图像周围(不会放大或缩小图像)
-
-
border-iamge-outset
使边框图片向外扩张, 不能为负值
-
CSS3背景样式
-
background-origin
决定背景从哪里开始绘制,在没设置
no-repeat
或者clip
的情况下其余部分会被平铺占满border-box
padding-box
为默认值content-box
-
background-clip
决定背景从哪里剪去
border-box
为默认值padding-box
content-box
-
background-size
修改图片大小
默认为
auto
- 固定值, px, em, xm等
- 百分比, 背景盒模型的百分比, 根据
background-origin
值决定 - contain 使图片在不改变比例的情况下全部被父元素包含
- cover 使图片在不改变比例的情况下将父元素填充满
-
-
线性渐变(应用给
background-image
)-
background-image: linear-gradient(to right, red,yello,green)
(颜色参数可以是rgba进行透明度渐变)第一个值可以是角度N deg, 正上方为0, 顺时针为正, 逆时针为负
从第二个颜色参数起在每个颜色后可以添加百分比或者固定值表示在这个值后的颜色就是自己写定的颜色, 第一个颜色参数是指这个值前的颜色是自己写定的颜色
-
background-image: repeating-linear-gradient(toright, red 100px,yello 200px)
从第
100px
开始以red开头渐变, 渐变到200px
以yello结束, 剩余像素采用平铺的方式
-
-
径向渐变
background-image: radial-gradient([closest-side|farthest-side|closest-corner|farthest-corner][circle|ellipse][at 渐变圆心X轴的位置, 渐变圆心Y轴的位置], red,yello,green);
(第一个参数默认为farthest-corner ellipse)
过渡
-
transition
存在简写形式, 可以使CSS在可动画化属性发生变化的过程时按照指定时间内产生渐变动画
给元素增加此属性后即便是js改变的属性也会发生动画
-
transition-property
默认值为all, 指定需要产生动画效果的属性, 可以指定多个属性
-
transition-duration
指定动画过程的时间, 单位可以是s与ms, 默认为0s, 不接受负值, 必须加单位 可以指定多个参数, 当此参数数量少于指定的属性时, 整个时长列表会重复放置
-
transition-timing-function
-
ease
先快后慢, 默认值 -
linear
线性 -
ease-in
加速 -
ease-out
减速 -
ease-in-out
先加速后减速, 速度比ease
快 -
cubic-bezier
贝塞尔曲线 -
steps(num, [start|end])
默认为end
,start
意思为触发此状态时立刻前进一步状态,end
指触发此状态后等待一个间隔再前进一步状态可以有多个参数, 当参数数量少于
property
时, 不足的部分使用默认值
-
-
transition-delay
表示延迟时间, 规则与
duration
一致
-
过渡完成事件
-
transitioned
, 只能在dom2事件中触发(addEventListener
)-
transition
难点1:css属性存储在内存中会快于浏览器渲染
-
transition
难点2:transition
在首次渲染未结束前是不会触发的-
css渲染慢于同步下的js引擎, 此时会导致许多可能的预期外影响
在js中直接设置元素样式, 此时不会触发动画
在js中先设置
alert()
后设置元素样式, 会触发动画, 因为alert的异步特点 在js中将样式写在onload
的事件函数中会触发动画在js中将两个不同样式同步地写在
onload
事件函数中只会触发第二个样式的动画使用
settimeout
等待css渲染完后才可以触发动画先修改样式再添加
duration
仍然会触发动画
-
-
-
transition
简写严格遵循书写顺序, 按照
duration
,property
,timing-function
,delay
的顺序书写可以用逗号分隔不同的动画效果, 在遇到第一个可以解析为时间的值时会赋值给
duration
-
2D变换
-
transform
只支持块级元素rotate
旋转, 单位为deg
translate
平移, 可设置单值, 与X轴平移相同translateX
translateY
skew
倾斜, 单位为deg
, 可设置单值, 与X轴倾斜相同skewX
skewY
scale
缩放, 可设置单值, 使X轴与Y轴按同比例缩放scaleX
scaleY
-
基点的变换
transform-origin
设置X轴Y轴上的基点位置, 百分比是基于元素的宽高 对除translate外的属性才产生影响2D变换中所有的变换都是基于矩阵运算
-
变换组合
在变换组合时矩阵运算方式是从右向左的, 感官上可认为坐标系按照从左向右的顺序发生了变换
transition
难点3在绝大多数变换组合进行切换时, 如果两次变换的数量, 顺序不同时, 不会触发过渡动画 因此在涉及到变换组合内的变换改变的时候要注意数量和顺序问题
transition
难点4过渡变换只关注变换起始状态与最终状态, 无法控制中间状态
3D变换
-
perspective
景深景深可以理解为肉眼距离显示屏的距离, 景深越大, 变换效果越不明显
可以使3D效果产生近大远小的功能, 不可继承, 但是效果是作用给后代元素
-
transform: perspective
写在需要作用的元素中, 但必须放在
tranform
所有变换的首位, 其他位置会使变换失效 灭点控制视图的焦点即景深
景深越大灭点越远, 元素变形更小
-
perspective-origin(x, y, z)
景深基点控制视角的位置, 默认值为
50% 50% 50%
, 参照border-box
模型, 常与perspective
结合使用 -
transform-style
preserve-3D
, 常用值none
, 默认值营造有层级的3d舞台, 不可继承属性, 但只作用于子元素
景深叠加
祖先元素增加多个景深会产生景深叠加, 由于叠加规则不可控因此要避免
-
backface-visibility
visible
hidden
隐藏背面
rotate3D(x,y,z,angle)
x, y, z的值只有0,1的区别, 大于1没有影响rotateX()
rotateY()
rotateZ()
translate3D(translateX,translateY,translateY)
-
scaleZ()
单独使用时没有意义, 组合使用会影响到Z坐标轴
-
难点
当对某个元素进行变换时, 这个元素结构内部的所有元素都会发生变换, 而不仅仅只有设置了变换的这个元素会产生变换效果
动画
-
动画内属性
-
animation-name
- 指定关键帧的名字
-
关键帧基本写法:
@keyframes name{ from{} to{} }
-
animation-duration
- 指定动画周期, 无单位与负值无效
-
animation-timing-function
-
指定关键帧周期的运动方式
-
*语法: steps(step, end默认值 start)* 设置
end
时动画的起始位置会占用一步, 否则不会, 即start
看不见第一帧,end
看不见最后一帧
-
-
animation-direction
- 反转关键帧执行顺序, 使顺序为
to-from
, 同时也反转动画运动方式, 即timing-function
normal
默认值reverse
反转alternate
播放顺序为from-to
然后to-from
然后循环alternate-reverse
播放顺序与alternate
相反
- 反转关键帧执行顺序, 使顺序为
-
-
动画外属性
-
animation-delay
- 指定延迟时间
-
animation-literation-count
只影响动画内的属性
infinite
无限次数num
-
animation-fill-mode
管理元素在动画外的状态
none
默认值, 动画外的属性保持在动画之前backwords
from之前的状态保持的和from的状态保持一致forwords
to之后的状态与to的状态保持一致both
包含以上两种情况
-
animation-play-state
控制动画是否暂停或运动
paused
running
默认值
-
关键帧进阶
@keyframes name{ from(0%){ } 百分比{ } 百分比{ } 百分比{ } to(100%){ } }
百分比为
duration
时间的百分比, 整个关键帧中的百分比为一个动画周期, 两个百分比算作一个关键帧周期 -
简写属性
-
animation
与
transition
类似, 前两个能被解析成时间的参数被看做duration
与delay
-
-
flex布局
常用于移动端
安卓4.3及之前版本使用需要-webkit-flex
更老的版本使用flex
的老版本称为box
, 使用时加上-webkit-
前置
-
用法
**display: flex -webkit-flex -webkit-box**
flex布局分为主轴与侧轴, 方向为向右与向下, 整体又分为容器与项目, 容器属性作用于容器, 项目属性作用于项目
表格中没有写属性的表示老版本不存在此属性
老版本box | 新版flex | |
---|---|---|
容器 | ||
决定主轴或侧轴水平或者垂直 | -webkit-box-orient: vertical|horizontal |
flex-direction: column|row |
决定主轴的方向 | -webkit-direction: normal默认值|reverse |
flex-direction: column-reverse|row-reverse |
主轴富裕空间管理 | -webkit-box-pack:start|end|center|justify |
justify-content: flex-start默认值|flex-end|center|space-between|space-around |
侧轴富裕空间管理, 单行/单列有效 | -webkit-box-align:start|end|center|justify |
align-items: flex-start默认值|flex-end|center|baseline|stretch |
控制侧轴的堆砌方向 | flex-wrap: nowrap默认值|wrap|wrap-reverse |
|
控制多行/多列的富裕空间管理 | align-content(把每行/列看成一个整体): flex-start|flex-end|center|space-between|space-around|stretch|normal默认值 |
|
新版本中flex-direction与flex-wrap的简写 | flex-flow: column|row|column-reverse|row-reverse [nowrap默认值|wrap|wrap-reverse] |
-
老版本:
start
表示富裕空间在右边(x轴)或下边(y轴)end
表示富裕空间在左边(x轴)或上边(y轴)center
表示富裕空间在两边justify
表示富裕空间在项目之间老版本不能控制侧轴方向, 因为老版本无法在侧轴堆砌, 想要在侧轴有堆砌效果必须使用多个容器
-
新版本:
flex-start
表示富裕空间在按轴方向的后面flex-end
表示富裕空间在按轴方向的前面center
表示富裕空间在两边space-between
表示富裕空间在所有项目的最中间space-around
表示富裕空间在任意两个项目之间baseline
基线对齐stretch
等长/高布局, 项目不能有高度align-content
中的stretch
侧轴的等长/高布局, 富裕空间会按照1:1的比例填充给每一个项目
项目属性 | 老版本box | 新版flex |
---|---|---|
弹性空间管理, 放大 | -webki-box-flex 默认值为0 |
flex-grow 弹性因子默认值为0 |
弹性空间管理, 缩小 | flex-shrink 收缩因子默认值为1 |
|
决定每一个项目在容器中排列的顺序管理单个项目的富裕空间, 单行/单列有效 | align-self: flex-start|flex-end|center|space-between|space-around|stretch|auto默认值 如果此项目没有父元素即容器时, 默认为stretch |
|
基值 | flex-basis 默认值为height (y轴), width (x轴) |
|
排列顺序 | order |
-
放大的规则
将主轴上的富裕空间按照设定的比例分配个每个项目上, 参数为纯数字
-
计算规则
-
可用空间 = 容器大小 - 所有相邻项目的flex-basis总和(没有设置时默认为height(y轴), width(x轴))
-
可扩展空间 = (可用空间) / 所有相邻项目的flex-grow的总和
-
每个项目伸长后大小 = 每个项目自身的flex-basis(没有设置时默认为height(y轴), width(x轴)) + 可扩展空间 * 每个项目自身的flex-grow
在老版本中没有
flex-basis
因此此值就是每个项目自己的width / height
-
老版本可以控制伸缩, 伸缩的计算规则都与新版本的
flex-grow
相同 -
-
缩小的计算规则
-
需缩减大小 = 容器大小 - 所有相邻项目的flex-basis总和(没有设置时默认为height(y轴), width(x轴))
-
总权重 = 每一个项目flex-basis * flex-shrink 之后求和
-
每个项目的权重 = 每一个项目flex-basis * flex-shrink / 总权重
-
每个项目缩减后大小 = 每一个项目flex-basis - 需缩减大小 * 每个项目的权重
在
flex-wrap
值不是nowrap
时, 此属性失效flex-grow
与flex-shrink
在计算时的区别在于后者要将flex-basis
考虑进权重 -
-
flex应用
-
等分布局
flex-basis: 0
flex-grow: 1
flex-shrink: 1
-
简写属性
flex: 1
等同于上面三行代码
-
-
响应式布局核心
-
CSS2媒体查询
<link rel="stylesheet" type="text/css" href="index.css" media="screen and (min-width: 400px)"/>
指定媒体才引入相应css代码
-
CSS3媒体查询
@media 媒体类型 [关键字 媒体属性: value]{0,} { } @media (媒体属性: value){0,} { }
对声明特殊性没有任何贡献
-
媒体类型
screen|print|all(默认值)
-
媒体属性(常用)
width
可添加min
或max
前缀, 当为min
时表示大于某个值有效height
可添加min
或max
前缀, 当为max
时表示小于某个值有效orientation
指定显示的屏幕,portrait
表示竖屏,landscape
表示横屏 -
关键字
and
代表与, 一般用来连接媒体类型与媒体属性only
老版本浏览器不支持媒体查询会使媒体查询的样式生效, 因此添加后会使老浏览器无法识别而不执行这段查询逗号
,
代表或的意思, 逗号前为一组规则, 后为一组规则, 可以有3组及以上规则not
同样在老浏览器中无法识别且效果是对媒体查询取反
-
-
多列布局
column-width
指定一列宽度, 由于文字间隔等原因一般会比width / column-width
的列数少1column-count
分成指定列数column-gap
指定两列之间间距column-rule
指定每列间的分隔线样式
题外话: 前端规范
- 了解前端规范有助于对各个API兼容性及功能有个大概认识
ECMA262 JS基础规范
DOM0 浏览器厂商自主实现, 非W3C规范
DOM1 开始成为W3C规范, 专注于html与XML文档
DOM2 增加了样式表对象模型, addEventListener等
DOM3 对DOM2增加了内容模型(DTD,schemas)和文档验证