一、盒模型
两种盒模型的比较,
- content-box的宽高=内容的宽高
- border-box的宽高=内容宽高+border+padding
默认情况下是content-box,当指定border、padding的时候,border-box更好用。通过box-sizing:border-box来指定。
二、外边距合并
有两种情况会合并:
- 父子
margin合并 - 兄弟
margin合并
只有上、下margin会合并,左、右margin不会合并。并且合并后的高度等于两者中的最大值。
如何阻止合并:
- 父子合并可以用过设置padding、设置border、设置display:flex、设置overflow:hidden来阻止合并
- 兄弟合并可以用inline-block消除
三、position属性
通过定位可以将元素摆放在任意位置
可选值:
- static:默认值,元素是静止的,没有开启定位
- relative:开启元素的相对定位
- absolute:开启元素的绝对定位
- fixed:开启元素的固定定位
- sticky:开启元素的粘滞定位
1、相对定位(relative)
特点:
- 从元素开启相对定位之后,如果不设置偏移量元素不会发生任何的变化
- 相对定位是参照于元素在文档流中的位置进行定位的
- 相对定位会提升元素的层级
- 相对定位不会使元素脱离文档流
- 相对定位不会改变元素的性质,块还是块,行内还是行内
偏移量:
当元素开启相对定位之后,可以通过偏移量来改变元素的位置
- top:定位元素和定位位置上边的距离
- bottom:定位元素和定位位置下边的距离
- left:定位元素和定位位置左边的距离
- right:定位元素和定位位置右边的距离
2、绝对定位(absolute)
特点:
- 开启绝对定位后,如果不设置偏移量,元素的位置不会发生变化
- 开启绝对定位后,元素会从文档流中脱离
- 绝对定位会改变元素的性质,行内会变成块,块的宽高被内容撑开
- 绝对定位会使元素提升一个层级
- 绝对定位元素时相对于其包含块进行定位的
- 包含块正常情况下,就是离当前元素最近的祖先块元素
- 开启绝对定位后,包含块就是离它最近的开启了定位的祖先元素,如果所有祖先元素都未开启定位,则相对于根元素
html进行定位
3、固定定位
也是一种绝对定位,大部分特点都和绝对定位一样
不同的是,固定定位永远参照于浏览器的视口(可视窗口)进行定位
固定定位不会随网页的滚动条滚动
4、粘滞定位
特点:
- 可以说是relative和fixed的结合
- 它主要用在对scroll事件的监听上,简单说在滑动过程中,某个元素的距离其父元素的距离达到 sticky 粘性定位要求时;position:sticky 这时的效果就相对于 fixed 定位,固定到适当的位置。
- 不会脱离文档流
使用条件:
-
父元素不能设置 overflow:hidden; 或者 overflow:auto; 属性;
-
必须制定 top、bottom 、left 、 right 4个值之一,否则只会处于相对定位;
-
父元素的高度不能低于sticky 元素的高度;
-
sticky 元素仅在其父元素内生效;
5、绝对定位布局
开启绝对定位之后,水平方向的布局等式就需要添加left和right两个值,当发生过度约束时,
- 如果9个值(left,margin-left,border-left,padding-left,width,padding-right,border-right,margin-right,right)中没有auto,则自动调整right值,以使等式成立
- 如果有auto,则自动调整auto的值以使等式满足
- 等式:left+margin-left+border-left+padding-left+width+padding-right+border-right+margin-right+right=包含块width
- 可以设置auto值的有:margin,left,right,width
- 因为left和right默认值为auto,所以如果不指定left和right,则等式不满足时,会自动调整这两个值
垂直方向布局等式也必须要满足
6、元素的层级
对于开启定位的元素,可以通过z-index来指定元素的层级,值越大,元素层级越高,优先显示
如果元素层级一样,则优先显示靠下的元素
祖先元素层级再高,也不会盖住后代元素
四、float属性
使元素浮动,脱离文档流
可选值:
- none:默认值,元素默认在文档流中排列
- left:元素会立即脱离文档流,向页面左侧浮动
- right:元素会立即脱离文档流,向页面右侧浮动
特点:
- 元素会脱离文档流,下边的元素会立即向上移动
- 元素浮动后,会尽量向页面的左上或右上漂浮,直到遇到父元素边框或者其它浮动元素
- 如果浮动元素上面是一个没有浮动的元素,则浮动元素不会超过块元素
- 浮动的元素不会超过它上边的兄弟元素,最多一边齐
- 块元素脱离文档流后,高度和宽度都被内容撑开
- 行内元素脱离文档流后,会变成块元素
- 浮动元素不会盖住文字,文字会自动环绕在浮动元素的周围,可以通过浮动来设置文字环绕图片的效果
清除浮动:
clear属性:
可选值:
- none:默认值,不清楚浮动
- left:清除左侧浮动元素对当前元素的影响
- right:清除右侧浮动元素对当前元素的影响
- both:清除两侧浮动元素对当前元素的影响
五、选择器
1、元素选择器
作用:根据标签名来选中指定的元素
语法:标签名{}
例子:p{} h1{} div{}
2、ID选择器
作用:根据元素的id属性值选中一个元素
语法:#id属性值{}
例子:#box{} #red{}
3、类选择器
作用:根据元素的class属性值选中一组元素
语法:.class属性值{}
例子:.box{}
4、通配选择器
作用:选中页面中的所有元素
语法:*{}
5、交集选择器
作用:选中同时复合多个条件的元素
语法:选择器1选择器2选择器3选择器n{}
例子:.a.b.c{}
注意点:交集选择器中如果有元素选择器,必须使用元素选择器开头
6、并集选择器分组
作用:同时选择多个选择器对应的元素
语法:选择器1,选择器2,选择器3,选择器n{}
例子:#b1,.p1,h1,span,div.red{}
7、子元素选择器
作用:选中指定父元素的指定子元素
语法:父元素 > 子元素 {}
例子:.box1 >.box2 {}
8、后代元素选择器
作用:选中指定元素内的指定后代元素
语法:祖先 后代 {}
例子:div p {}
9、相邻的兄弟选择器
作用:选中指定元素的相邻同级元素,具有相同的父元素
语法:前一个 + 后一个 {}
例子:div + p {}
10、一般同级选择器
作用:选中指定元素的所有同级元素
语法:兄 ~ 弟 {}
例子:div ~ p {}
11、属性选择器
-
[属性名] 选择含有指定属性的元素
p[title] {}选择含有属性值title的元素
-
[属性名=属性值] 选择含有指定属性和属性值的元素
p[title="abc"] {}选择属性值为abc的元素
-
[属性名^=属性值] 选择属性值以指定值开头的元素
p[title^="abc"] {}选择属性值以abc开头的元素
-
[属性名$=属性值] 选择属性值以指定值结尾的元素
p[title$="abc"] {}选择属性值以abc结尾的元素
-
[属性名*=属性值] 选择属性值中含有某值的元素的元素
p[title*="abc"] {}选择属性值中包含abc的元素
-
[attr~=value] 匹配带有一个名为attr的属性的元素 ,其值正为value,或者匹配带有一个attr属性的元素,其值有一个或者更多,至少有一个和value匹配。
li[class~="a"] {}会匹配一个
a类,不过也可以匹配一列用空格分开、包含a类的值。 -
[attr|=value] 匹配带有一个名为attr的属性的元素,其值可正为value,或者开始为value,后面紧随着一个连字符。
12、选择器的优先级
选择器的权重
- 内联样式 1,0,0,0
- id选择器 0,1,0,0
- 类和伪类选择器 0,0,1,0
- 元素选择器 0,0,0,1
- 通配选择器 0,0,0,0
- 继承的样式 没有优先级
比较优先级时,需要将所有的选择器的优先级进行相加计算,最后优先级越高,则越优先显示(分组选择器是单独计算的),选择器的累加不会超过其最大的数量级,类选择器在高也不会超过id选择器,如果优先级计算后相同,此时则优先使用靠下的样式
可以在某一个样式的后边添加 !important ,则此时该样式会获取到最高的优先级,甚至超过内联样式,注意:在开发中这个玩意一定要慎用!
六、单位
-
像素(px)
-
屏幕(显示器)实际上是由一个一个的小点点构成的
-
不同屏幕的像素大小是不同的,像素越小的屏幕显示的效果越清晰
-
所以同样的200px在不同的设备下显示效果不一样
-
-
百分比
-
也可以将属性值设置为相对于其父元素属性的百分比
-
设置百分比可以使子元素跟随父元素的改变而改变
-
-
em
-
em是相对于元素的字体大小来计算的
-
1em = 1font-size(默认是16px)
-
em会根据字体大小的改变而改变
-
-
rem
- 与em类似,rem是相对于根元素
<html>的字体大小来计算
- 与em类似,rem是相对于根元素
七、高度塌陷问题
1、问题
在文档流中,父元素高度默认是被子元素撑开的,也就是子元素多高,父元素就多高
但是,当子元素设置浮动之后,子元素完全脱离文档流,此时将会导致子元素无法撑起父元素的高度,导致父元素的高度丢失
父元素高度丢失之后,其下的元素会自动上移,导致页面的布局混乱
2、解决方法
-
可以将父元素高度写死,但一旦写死,父元素高度不能自动适应于子元素高度(不推荐)
-
在W3C标准中,页面中元素都有一个隐含属性叫
Block Formatting Context(BFC)。该属性可以设置打开或关闭,默认是关闭的。关于BFC的详细内容见下面。 -
clear属性用来清除其他浮动元素对当前元素的影响
- none:默认不清楚浮动
- left:清除左侧浮动元素对当前元素的影响
- right:清除右侧浮动元素对当前元素的影响
- both:清除两侧中最大影响的那侧
原理是:设置清除浮动以后,浏览器会自动为元素添加一个上外边距,以使其位置不受其他元素的影响
-
终极解决方案:
利用clearfix来解决
.clearfix::before, .clearfix::after { content: ''; display: table; clear: both; }before可以用来解决父子外边距重叠问题,after可以用来解决高度塌陷问题
3、BFC相关内容
开启BFC以后,元素会有如下特点:
- 开启BFC的元素不会被浮动元素所覆盖
- 开启BFC的元素子元素和父元素外边距不会重叠
- 开启BFC的元素可以包含浮动的子元素
开启BFC的方式:
-
设置元素浮动,使用这种方式,随可以撑开父元素,但会导致父元素宽度丢失,会导致下边的元素上移(不推荐)
-
设置元素为inline-block,虽可以解决,但也会丢失父元素的宽度(不推荐)
-
将元素的overflow设置为一个非visible的值
--常用方式为元素设置overflow:hidden,开启其BFC以使其可以包含浮动元素