这是我参与「第四届青训营」笔记创作活动的第3天
多个选择器对应同一个元素的同一属性值?
根据选择器特异度决定,比如根据id、(伪)类、标签的数量
更特殊的选择器可以覆盖更普遍的选择器的属性值
CSS中元素属性的继承
某些属性会自动继承其父元素的计算值,除非显式指定一个值
一般来说,
和文字相关的属性都可以隐式继承,
和模型相关的属性都不能隐式继承,比如子元素不能隐式继承父元素的宽度
也可以使用inherit显式继承
* {
box-sizing: inherit;
}
如果没有指定也没有显式继承或隐式继承,则使用初始值
可以使用initial 关键字显式重置为初始值
CSS求值过程
- 对应用到该页面的规则用一些条件进行筛选,如选择器匹配、属性有效、符合当前media等等,最终筛选出元素的声明值。一个元素的某属性的声明值可能有零个或多个。
- 按照来源、
!important、选择器特异性、书写顺序等选择出优先级最高的一个属性值,最终筛选出元素的层叠值。层叠值可能是空的。当层叠值为空时,使用继承;没有继承时,使用初始值。 - 将一些相对值或关键字转换成绝对值,比如em转为px,相对路径转为绝对路径,得到计算值(在不进行实际布局时能得到的最具体的值,子元素继承父元素的属性值时继承计算值)。
- 再经过进一步转换,得到使用值,适配属性值的一些限制(比如像素不能是小数,要转换为整数)后,最终得到渲染时实际生效的值。
盒模型
padding
- padding-top
- padding-left
- padding-right
- padding-bottom
border
- 三种属性
- border-width
- border-style
- border-color
- 四个方向
- border-top
- border-right
- border-bottom
- border-left
border: 1px solid #ccc;
border-color: green;
border-top-color: #f00;
- 使用小技巧
可以给四条边框设置不同的颜色
默认一条边框的两边是三角形
所以可以将一条边框设置颜色,其他边框设置为透明,得到一个三角形
效果如下:
#box{
display: block;
width: 50px;
height: 50px;
box-sizing: border-box;
border-top-width: 2em;
border-bottom-width: 2em;
border-left-width: 2em;
border-right-width: 2em;
border-style: solid;
border-top-color: rgba(66, 204, 255, 0.5);
border-bottom-color: rgba(0, 0, 0, 0.0);
border-left-color: rgba(0, 0, 0, 0.0);
border-right-color: rgba(0, 0, 0, 0.0);
}
margin collapse
margin在垂直方向上会合并,取二者间的最大值,
如: 上边的元素设置margin-bottom、下边的元素设置margin-top
块级 Vs. 行级
| 块级盒子 | 行级盒子 |
|---|---|
| 不和其它盒子并列摆放 | 和其它行级盒子一起放在一行或拆开成多行 |
| 适用所有的盒模型属性 | 盒模型中的width、height不适用 |
| 块级元素 | 行级元素 |
|---|---|
| 生成块级盒子 | 生成行级盒子 |
body article div main section h1~h6 p ul li等 | span em strong cite code等 |
| display: block | display: inline |
注:盒子是CSS的概念,元素是HTML的概念
display 属性
可以用display将任意的元素转换为行级盒子或块级盒子
| 属性 | 效果 |
|---|---|
| block | 块级盒子 |
| inline | 行级盒子 |
| inline-block | 本身是行级,可以放在行级盒子中; 可以设置宽高; 作为一个整体不会被拆散成多行 |
| none | 排版时直接忽略 |
常规流 Normal Flow
- 根元素、浮动和绝对定位的元素会脱离常规流
- 其它元素都在常规流之内(in-flow)
- 常规流中的盒子,在某种排版上下文中参与布局
- 行级排版上下文
- 块级排版上下文
- Table排版上下文
- Flex排版上下文
- Grid排版上下文
行级排版上下文
- Inline Formatting Context(IFC)
- 只包含行级盒子的容器会创建一个IFC
- IFC内的排版规则
- 盒子在一行内水平摆放
- 一行放不下时换行显示
text-align决定一行内盒子的水平对齐vertical-align决定一个盒子在行内的垂直对齐- 避开float元素
块级排版上下文
- Block Formatting Context(BFC)
- 某些容器会创建一个BFC,如:
- 根元素
- float元素、绝对定位元素、inline-block元素
- Flex子项和Frid子项
- overflow值不是visible的块盒
display: flow-root;的元素
- BFC内的排版规则
- 盒子从上到下摆放
- 垂直margin合并(margin collapse)
- BFC内盒子的margin不会与外面的合并
- BFC不会与float元素重叠
Flex排版上下文
- Flex Box可以控制子级盒子的:
- 摆放的流向
- 摆放顺序
- 盒子宽高
- 水平垂直对齐
- 是否允许拆行
- Flex流向分为主轴和侧轴
- 主轴属性
justify-content- flex-start
- flex-end
- center
- space-between
- space-around
- space-evenly
- 侧轴属性
align-items- flex-start
- flex-end
- center
- stretch (默认)
- baseline
- 弹性Flexibility
- 可以设置子项的弹性
- 当容器有剩余空间时,会伸展
- 当容器空间不够时,会收缩
| 属性 | 效果 |
|---|---|
| flex-grow | 有剩余空间时的伸展能力 |
| flex-shrink | 容器空间不足时的收缩能力 |
| flex-basis | 没有伸展或收缩时的基础长度 |
position 属性
| 属性值 | 效果 |
|---|---|
| static | 默认值,非定位元素 |
| relative | 相对自身原本位置偏移,不脱离文档流 |
| absolute | 绝对定位,相对非static祖先元素定位 |
| fixed | 相对于视口绝对定位 |
| sticky | 粘性定位 |
学习CSS的几点建议
- 充分利用
MDN和W3C CSS规范 - 保持好奇心,善用浏览器的开发者工具
- 持续学习CSS新特性