选择器的特异度(Specificity)
继承
某些属性会自动继承其父元素的计算值,除非显示指定一个值
显式继承
初始值
- CSS中,每个属性都有一个初始值
background-color的初始值为transparentmargin-left的初始值为0
- 可以使用
initial关键字显示重置为初始值background-color:initial
CSS求值过程
布局 (Layout)是什么?
- 确定内容的大小和位置的算法
- 根据元素、容器、兄弟节点和内容等信息来计算
布局相关技术:
- 常规流
- 块级
- 行级
- 表格布局
- Grid网格布局
- flex弹性布局
- 浮动
- 定位
width
- 指定
content box宽度 - 取值为
长度、百分数、auto auto由浏览器根据其他属性确定- 百分数相对于容器的
content box宽度
height
- 指定
content box高度 - 取值为
长度、百分数、auto auto取值由内容计算而来- 百分数相对于容器的
content box宽度 容器有指定的高度时,百分数才生效
padding
- 指定元素四个方向的内边距
- 百分数相对于容器
宽度
border
- 指定容器边框样式、粗细和颜色
border-width:属性可以设置盒子模型的边框宽度,设置四个方向的宽度。border-style:是一个 CSS 简写属性,用来设定元素所有边框的样式。关键字用于描述边框样式。none:和关键字hidden类似,不显示边框。在这种情况下,如果没有设定背景图片,border-width计算后的值将是0,即使先前已经指定过它的值。在单元格边框重叠情况下,none值优先级最低,意味着如果存在其他的重叠边框,则会显示为那个边框。hidden:和关键字none类似,不显示边框。在这种情况下,如果没有设定背景图片,border-width计算后的值将是0,即使先前已经指定过它的值。在单元格边框重叠情况下,hidden值优先级最高,意味着如果存在其他的重叠边框,边框不会显示。dotted:显示为一系列圆点。标准中没有定义两点之间的间隔大小,视不同实现而定。圆点半径是border-width计算值的一半。dashed:显示为一系列短的方形虚线。标准中没有定义线段的长度和大小,视不同实现而定。solid:显示为一条实线。double:显示为一条双实线,宽度是border-width。groove:显示为有雕刻效果的边框,样式与ridge相反。ridge:显示为有浮雕效果的边框,样式与groove相反。inset:显示为有陷入效果的边框,样式与outset相反。当它指定到border-collapse为collapsed的单元格时,会显示为groove的样式。outset:显示为有突出效果的边框,样式与inset相反。当它指定到border-collapse为collapsed的单元格时,会显示为ridge的样式。
border-colorcolor:使用<color>来表示四个边框的颜色,仅用于单值语法。horizontal:使用<color>来表示水平(左边框和右边框)边框的颜色,仅用于双值语法。vertical:使用<color>来表示垂直(上边框和下边框)边框的颜色,仅用于双值或三值语法。top:使用<color>来表示上边框的颜色,仅用于三值或四值语法。bottom:使用<color>来表示下边框的颜色,仅用于三值或四值语法。right:使用<color>来表示右边框的颜色,仅用于四值语法。left:使用<color>来表示左边框的颜色,仅用于四值语法。inherit:这是一个关键词,用于指示四边的颜色值均继承自父元素的计算值。
该CSS属性可以用于生成各种各样的三角形
margin
- 指定元素四个方向的外边距
- 取值可以是
长度、百分数、auto - 百分数相对于容器宽度
实现容器的水平居中:
margin:auto
overflow
overflow 是 CSS 的简写属性,其设置了元素溢出时所需的行为——即当元素的内容太大而无法适应它的块级格式化上下文时。
visible:内容不能被裁减并且可能渲染到边距盒(padding)的外部。hidden:如果需要,内容将被裁减以适应边距(padding)盒。不提供滚动条,也不支持允许用户滚动(例如通过拖拽或者使用滚轮)。内容可以以编程的方式滚动(例如,通过设置scrollLeft等属性的值或scrollTo()方法), 因此该元素仍然是一个滚动的容器。clip:类似于hidden,内容将以元素的边距(padding)盒进行裁剪。clip和hidden之间的区别是clip关键字禁止所有滚动,包括以编程方式的滚动。该盒子不是一个滚动的容器,并且不会启动新的格式化上下文。如果你希望开启一个新的格式化上下文,你可以使用display: flow-root来这样做。scroll:如果需要,内容将被裁减以适应边距(padding)盒。无论是否实际裁剪了任何内容,浏览器总是显示滚动条,以防止滚动条在内容改变时出现或者消失。打印机可能会打印溢出的内容。auto:取决于用户代理。如果内容适应边距(padding)盒,它看起来与visible相同,但是仍然建立了一个新的块级格式化上下文。如果内容溢出,则浏览器提供滚动条。overlay(弃用):行为与auto相同,但是滚动条绘制在内容之上,而不是占据空间。
overflow 选项包括裁减、显示滚动条,或者显示从容器流向周围区域的内容。
指定 visible(默认)或 clip 以外的值,会创建一个新的块级格式化上下文。由于技术原因,这是必要的——如果浮动包含滚动元素,它将在每个滚动步骤后强制重新包装内容,从而导致一个缓慢的滚动体验。
为使 overflow 具有效果,块级水平的容器必须有一个设定的高度(height 或 max-height)或 white-space 设置为 nowrap。
设置一个轴为 visible(默认值),而设置另一个轴为不同的值时,visible 的行为会像 auto 一样。
JavaScript 的 Element.scrollTop 属性可用于滚动 HTML 元素,即使当 overflow 设置为 hidden 时。
块级 VS 行级
- 块级元素:生成块级盒子
- body、article、div、main、section、h1-6、p、ul、li等
- display:block
- 行级元素
- 生成行级盒子
- 内容分散在多个行盒(line box)中
- span、em、strong、cite、code等
- display:inline
display属性
block:该元素生成一个块级元素盒,在正常的流中,该元素之前和之后产生换行。inline:该元素生成一个或多个内联元素盒,它们之前或者之后并不会产生换行。在正常的流中,如果有空间,下一个元素将会在同一行上。- 内部表现:
<display-inside>这些关键字规定了元素的内部显示类型,其定义了该内容布局时的格式上下文的类型(假设它是一个非替换元素): - 列表元素:
<display-listitem>该元素为内容生成一个块级盒子和一个单独的列表元素内联盒子。list-item的单独值将导致元素的行为类似于一个列表元素。其可以与list-style-type和list-style-position一起使用。
list-item 也可以与任意的 <display-outside> 关键字和 <display-inside> (en-US) 中的 flow 或 flow-root 关键字组合。
常规流 Normal Flow
- 根元素、浮动和绝对定位的元素会脱离常规流
- 其他元素都在常规流之内(in-flow)
- 常规流中的盒子,在某种排版上下文中参与布局
行级排版上下文
- Inline Formatting Context(IFC)
只包含行级盒子的内容会创建一个IFC- IFC内的排版规则
- 盒子在一行内水平摆放
- 一行放不下时,换行显示
- text-align决定一个盒子的水平对齐
- vertical-align决定一个盒子在行内的垂直对齐
- 避开浮动(float)元素
块级排版上下文
- Block Formatting Context(BFC)
- 某些容器会创建一个BFC
- 根元素
- 浮动、绝对定位、inline-block
- Flex子项和Grid子项
- overflow值不是visible的块盒
- display:flow-root;
BFC 内的排版规则
- 盒子从上到下摆放
- 垂直margin合并
- BFC内盒子的marign不会与外面的合并
- BFC不会和浮动元素重叠
Flex Box
- 一种新的排版上下文
- 它可以控制子级盒子的:
- 摆放的流向
- 摆放顺序
- 盒子宽度和高度
- 水平和垂直方向的对齐
- 是否允许折行
flex-direction
属性指定了内部元素是如何在 flex 容器中布局的,定义了主轴的方向 (正方向或反方向)。
justify-content
属性定义了浏览器之间,如何分配顺着弹性容器主轴 (或者网格行轴) 的元素之间及其周围的空间。
当 length 属性和自动外边距属性(margin: auto)生效之后,对齐已经完成了。也就是说,如果存在至少一个弹性元素,而且这个元素的 flex-grow 属性不等于 0,那么对齐方式不会生效,就像没有多余空间的情况。
align-items
属性将所有直接子节点上的 align-self 值设置为一个组。align-self 属性设置项目在其包含块中在交叉轴方向上的对齐方式。 目前,Flexbox 和 CSS 网格布局支持此属性。在 Flexbox 中,它控制十字轴上项目的对齐方式,在网格布局中,它控制块轴上项目的对齐方式。
Flexibility
- 可以设置子项的弹性:当容器有剩余空间时,会延展;容器空间不够时,会收缩。
flex-grow有剩余空间时的伸展能力flex-shrink容器空间不足时收缩的能力flex-basis没有伸展或收缩时的基础长度
Grid 布局
display:grid- 使元素生成一个块级的Grid容器
- 使用grid-template相关属性将容器划分为网格
- 设置每一个子项占哪些行/列
- grid line 网格线
- grid area 网格区域
position属性
static:默认值,非定位元素relative:相对自身原本位置偏移,不脱离文档流absolute:绝对定位,相对非static祖先元素定位fixed:相对于视口绝对定位