*内容参考整理自牛客网
简介:就是用来装页面上的元素的矩形区域。CSS中的盒子模型包括IE盒子模型和标准的W3C盒子模型。
在标准的盒子模型中,width
指content
部分的宽度,在IE盒子模型中,width
表示content+padding+border
这三个部分的宽度 。
link
属于html标签,而@import
是css提供的。
页面被加载时,link会同时被加载,而@import引用的css会等到页面加载结束后加载。
link是html标签,因此没有兼容性,而@import只有IE5以上才能识别。
link方式样式的权重高于@import的。
Animation
和transition
大部分属性是相同的,他们都是随时间改变元素的属性值,他们的主要区别是transition需要触发一个事件才能改变属性,而animation不需要触发任何事件的情况下才会随时间改变属性值,并且transition为2帧,从from … to,而animation可以一帧一帧的。
Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
容器的属性:
flex-direction
:决定主轴的方向(即子item的排列方法);
flex-wrap
:决定换行规则;
flex-flow
:反序;
justify-content
:对其方式,水平主轴对齐方式;
align-items
:对齐方式,竖直轴线方向。
块级格式化上下文,用于清除浮动,防止margin重叠等。
父元素固定宽高,利用定位及设置子元素margin
值为自身的一半。
父元素固定宽高,子元素设置position: absolute
,margin:auto
平均分配margin。
css3属性transform
,子元素设置position: absolute
;left: 50%
; top: 50%
;transform: translate(-50%,-50%)
;即可。
将父元素设置成display: table
,子元素设置为单元格 display: table-cell
。
弹性布局display: flex
,设置align-items: center
; justify-content: center
。
渲染线程分为main thread
和compositor thread
,如果css动画只改变transform和opacity,这时整个CSS动画得以在compositor trhead完成(而js动画则会在main thread执行,然后出发compositor thread进行下一步操作),特别注意的是如果改变transform和opacity是不会layout或者paint的。
区别:
功能涵盖面,js比css大;
实现/重构难度不一,CSS3比js更加简单,性能跳优方向固定;
css动画有天然事件支持;
css3有兼容性问题。
块元素:独占一行,并且有自动填满父元素,可以设置margin和pading以及高度和宽度。
行元素:不会独占一行,width和height会失效,并且在垂直方向的padding和margin会失。
opacity=0
,该元素隐藏起来了,但不会改变页面布局,并且,如果该元素已经绑定一些事件,如click事件,那么点击该区域,也能触发点击事件的。
visibility=hidden
,该元素隐藏起来了,但不会改变页面布局,但是不会触发该元素已经绑定的事件。
display=none
,把元素隐藏起来,并且会改变页面布局,可以理解成在页面中把该元素删除掉一样。
多个相邻(兄弟或者父子关系)普通流的块元素垂直方向marigin会重叠。
折叠的结果为:
两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值。
两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值。
两个外边距一正一负时,折叠结果是两者的相加的和。
固定定位fixed
:元素的位置相对于浏览器窗口是固定位置,即使窗口是滚动的它也不会移动。Fixed定位使元素的位置与文档流无关,因此不占据空间。 Fixed定位的元素和其他元素重叠。
相对定位relative
:如果对一个元素进行相对定位,它将出现在它所在的位置上。然后,可以通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动。 在使用相对定位时,无论是否进行移动,元素仍然占据原来的空间。因此,移动元素会导致它覆盖其它框。
绝对定位absolute
:绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于。 absolute 定位使元素的位置与文档流无关,因此不占据空间。 absolute 定位的元素和其他元素重叠。
粘性定位sticky
:元素先按照普通文档流定位,然后相对于该元素在流中的flow root(BFC)和 containing block(最近的块级祖先元素)定位。而后,元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。
默认定位Static
:默认值。没有定位,元素出现在正常的流中(忽略top, bottom, left, right 或者 z-index 声明)。
一:使用带clear
属性的空元素;
二:使用CSS的overflow
属性;
三:给浮动的元素的容器添加浮动;
四:使用邻接元素处理;
五:使用CSS的:after
伪元素。
CSS3的新特性中,在布局方面新增了flex
布局,在选择器方面新增了例如first-of-type
,nth-child
等选择器,在盒模型方面添加了box-sizing
来改变盒模型,在动画方面增加了animation
,2d变换,3d变换等,在颜色方面添加透明,rbga等,在字体方面允许嵌入字体和设置字体阴影,最后还有媒体查讯等 。
id 选择器,class 选择器,标签选择器,伪元素选择器,伪类选择器等。
同一元素引用了多个样式时,排在后面的样式属性的优先级高;
样式选择器的类型不同时,优先级顺序为:id 选择器 > class 选择器 > 标签选择器;
带有!important
标记的样式属性的优先级最高;
样式表的来源不同时,优先级顺序为:内联样式> 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式。
创建动画序列,需要使用animation
属性或其子属性,该属性允许配置动画时间、时长以及其他动画细节,但该属性不能配置动画的实际表现,动画的实际表现是由 @keyframes
规则实现,具体情况参见使用keyframes定义动画序列小节部分。
transition
也可实现动画。transition强调过渡,是元素的一个或多个属性发生变化时产生的过渡效果,同一个元素通过两个不同的途径获取样式,而第二个途径当某种改变发生(例如hover)时才能获取样式,这样就会产生过渡动画。
text-overflow
属性,值为clip
是修剪文本;ellipsis
为显示省略符号来表被修剪的文本;string
为使用给定的字符串来代表被修剪的文本。
三列布局又分为两种,两列定宽一列自适应,以及两侧定宽中间自适应。
两列定宽一列自适应:
1、使用float+margin
:
给div设置float:left,left的div添加属性margin-right:left和center的间隔px,right的div添加属性margin-left:left和center的宽度之和加上间隔。
2、使用float+overflow
:
给div设置float:left,再给right的div设置overflow:hidden。这样子两个盒子浮动,另一个盒子触发bfc达到自适应。
3、使用position
:
父级div设置position:relative,三个子级div设置position:absolute,这个要计算好盒子的宽度和间隔去设置位置,兼容性比较好。
4、使用table
实现:
父级div设置display:table,设置border-spacing:10px//设置间距,取值随意,子级div设置display:table-cell,这种方法兼容性好,适用于高度宽度未知的情况,但是margin失效,设计间隔比较麻烦。
5、flex
实现:
parent的div设置display:flex;left和center的div设置margin-right;然后right 的div设置flex:1;这样子right自适应,但是flex的兼容性不好。
6、grid
实现:
parent的div设置display:grid,设置grid-template-columns属性,固定第一列第二列宽度,第三列auto,
对于两侧定宽中间自适应的布局,对于这种布局需要把center放在前面,可以采用双飞翼布局:圣杯布局,来实现,也可以使用上述方法中的grid,table,flex,position实现。
display:table和本身table是相对应的,区别在于,display:table
的css声明能够让一个html元素和它的子节点像table元素一样,使用基于表格的css布局,是我们能够轻松定义一个单元格的边界,背景等样式,而不会产生因为使用了table
那样的制表标签导致的语义化问题。
之所以现在逐渐淘汰了table系表格元素,是因为用div+css编写出来的文件比用table边写出来的文件小,而且table必须在页面完全加载后才显示,div则是逐行显示,table的嵌套性太多,没有div简洁。
block
:块级元素,其前后都会有换行符,能设置宽度,高度,margin/padding水平垂直方向都有效。
Inline
:设置width和height无效,margin在竖直方向上无效,padding在水平方向垂直方向都有效,前后无换行符。
Inline-block
:能设置宽度高度,margin/padding水平垂直方向 都有效,前后无换行符。
DOM的变化影响到了预算内宿的几何属性比如宽高,浏览器重新计算元素的几何属性,其他元素的几何属性也会受到影响,浏览器需要重新构造渲染书,这个过程称之为重排,浏览器将受到影响的部分重新绘制在屏幕上 的过程称为重绘,引起重排重绘的原因有:
添加或者删除可见的DOM元素;
元素尺寸位置的改变;
浏览器页面初始化;
浏览器窗口大小发生改变,重排一定导致重绘,重绘不一定导致重排。
减少重绘重排的方法有:
不在布局信息改变时做DOM查询;
使用csstext,className一次性改变属性;
使用fragment;
对于多次重排的元素,比如说动画。使用绝对定位脱离文档流,使其不影响其他元素。
当元素设置了overflow
样式且值部位visible
时,该元素就构建了一个BFC,BFC在计算高度时,内部浮动元素的高度也要计算在内,也就是说技术BFC区域内只有一个浮动元素,BFC的高度也不会发生塌缩,所以达到了清除浮动的目的 。
box-sizing规定两个并排的带边框的框,语法为box-sizing:content-box/border-box/inherit
。
content-box
:宽度和高度分别应用到元素的内容框,在宽度和高度之外绘制元素的内边距和边框;
border-box
:为元素设定的宽度和高度决定了元素的边框盒;
inherit
:继承父元素的box-sizing。
六种布局方式总结:圣杯布局、双飞翼布局、Flex布局、绝对定位布局、表格布局、网格布局。
圣杯布局是指布局从上到下分为header
、container
、footer
,然后container部分定为三栏布局。这种布局方式同样分为header、container、footer。圣杯布局的缺陷在于 center 是在 container 的padding中的,因此宽度小的时候会出现混乱。
双飞翼布局给center
部分包裹了一个 main 通过设置margin主动地把页面撑开。
Flex布局是由CSS3提供的一种方便的布局方式。
绝对定位布局是给container
设置position: relative
和overflow: hidden
,因为绝对定位的元素的参照物为第一个postion不为static的祖先元素。 left 向左浮动,right 向右浮动。center 使用绝对定位,通过设置left和right并把两边撑开。 center 设置top: 0和bottom: 0使其高度撑开。
表格布局的好处是能使三栏的高度统一。
网格布局可能是最强大的布局方式了,使用起来极其方便,但目前而言,兼容性并不好。网格布局,可以将页面分割成多个区域,或者用来定义内部元素的大小,位置,图层关系。