CSS
# 1. CSS盒子模型
把 CSS 盒子模型分为content、padding、border 和 margin 四部分,可当成生活中的盒子去理解。content 即是盒子的内容,padding 是包裹在内容外边的填充物,border是盒子的边框,margin是盒子与其他盒子之间的距离。
盒子模型可分为两种:标准盒子模型(W3C盒模型)和怪异盒模型(IE盒模型)
标准盒:设定的 height 和 width 表示的是内容的大小;
怪异盒:设定的 height 和 width 表示的是内容+内边距(padding)+边框(border)的大小
可通过 CSS3 中的属性 box-sizing 指定盒子模型
box-sizing: content-size; ———— 标准盒
box-sizing: border-size; ———— 怪异盒
# 2. 选择器类型 (opens new window)
# 3. CSS优先级、权重计算
# 4. link 和 @important 的区别
1)link属于HTML标签,而@important是由CSS提供的;
2)页面加载时,link会被同时加载,而@important引用的CSS会在页面加载完成后再加载;
3)link无兼容问题,@important 在IE5以上才支持;
4)link方式引入的样式优先级高于@important
# 5. 为什么要初始化 CSS 标签
因为浏览器的兼容问题,不同浏览器对一些标签的默认值是不同的,如果不进行初始化,会导致页面显示出现问题。
# 6. CSS3 新增特性 (opens new window)
# 7. CSS动画和 JS 动画的区别
渲染线程分为main thread和compositor thread,如果css动画只改变transform和opacity,这时整个CSS动画得以在compositor trhead完成(而js动画则会在main thread执行,然后出发compositor thread进行下一步操作),特别注意的是如果改变transform和opacity是不会layout或者paint的。
区别:
1)功能涵盖面,js比css大
2)实现/重构难度不一,CSS3比js更加简单,性能跳优方向固定
3)对帧速表现不好的低版本浏览器,css3可以做到自然降级
4)css动画有天然事件支持
5)css3有兼容性问题
# 8. CSS 动画相关
硬币旋转、绘制三角形、绘制正方体
# 9. CSS的刻度
# 10. CSS 定位(position)
- static 默认值,不脱离正常的文档流
- relative 相对定位,相对自己原先位置,原来的位置仍会占据空间
- absolute 绝对定位,相对第一个不为 static 的祖先节点偏移,脱离正常文档流
- fixed 固定定位,相对于浏览器窗口偏移,脱离正常文档流
- sticky 根据滚动位置在相对定位和固定定位转换,起初是相对定位,但窗口滚动到定义的偏移位置后则变成固定定位
# 11. CSS 布局 (opens new window)
# 12. 盒子塌陷是什么?
本应该在父盒子内部的元素跑到了外部。
关于盒子塌陷的几种解决方法
(1)最简单,直接,粗暴的方法就是盒子大小写死,给每个盒子设定固定的width和height,直到合适为止,这样的好处是简单方便,兼容性好,适合只改动少量内容不涉及盒子排布的版面。缺点是非自适应,浏览器的窗口大小直接影响用户体验。
(2)给外部的父盒子也添加浮动,让其也脱离标准文档流,这种方法方便,但是对页面的布局不是很友好,不易维护。
(3)给父盒子添加overflow属性。
overflow:auto; 有可能出现滚动条,影响美观。
overflow:hidden; 可能会带来内容不可见的问题。
(4)父盒子里最下方引入清除浮动块。最简单的有:
<br style="clear:both;"/>
有很多人是这么解决的,但是我们并不推荐,因为其引入了不必要的冗余元素 。
(5)用after伪元素清除浮动
给外部盒子的after伪元素设置clear属性,再隐藏它
这其实是对空盒子方案的改进,一种纯CSS的解决方案,不用引入冗余元素。
.clearfix {*zoom: 1;}
.clearfix:before,.clearfix:after {
display: table;
line-height: 0;
content: "";
}
.clearfix:after {clear: both;}
这也是bootstrap框架采用的清除浮动的方法。
这是一种纯CSS的解决浮动造成盒子塌陷方法,没有引入任何冗余元素,推荐使用此方法来解决CSS盒子塌陷。
备注:第五种方法虽好,但是低版本IE不兼容,具体选择哪种解决方法,可根据实际情况决定。
(6) 给父盒子添加border
(7) 给父盒子设置padding-top
为什么会出现盒子塌陷?
当父元素没设置足够大小的时候,而子元素设置了浮动的属性,子元素就会跳出父元素的边界(脱离文档流),尤其是当父元素的高度为auto时,而父元素中又没有其它非浮动的可见元素时,父盒子的高度就会直接塌陷为零, 我们称这是CSS高度塌陷。
# 13. BFC
BFC (Block Formatting Context) 即块级格式化上下文,决定元素如何对其内容进行定位,以及和其他元素的关系和相互作用。也就是 BFC 是一个独立的布局空间,里面的内容不会影响到外部的布局。
触发 BFC 的条件:
- float 的值不为 none;
- position 的值不为 static 或 relative;
- display 的值为 table、fix、inline-block;
- overflow 的值不为 visible
BFC 规则:
- 内部的 Box 会在垂直方向一个接着一个放置;
- 内部的元素不会影响外部布局;
- 计算 BFC 高度时浮动元素也会被计算;
- 同一个 BFC 内的 margin 会出现重叠现象
# 14. Flex 与 Grid
flex
即弹性布局,是一种一维的布局方式,容器中默认存在两条轴,主轴和交叉轴,呈90度关系。项目默认沿主轴排列,通过 flex-direction
来决定主轴的方向。
- 容器属性
flex-direction:
row/ row-reverse/ column/ column-reverse
定义主轴的方向justify-content:
center/ flex-start/ flex-end/ space-between/ space-around/ space-evenly
定义主轴方向上的对齐方式align-items:
stretch/ center/ flex-start/ flex-end/ baseline
定义交叉轴方向上的对齐方式flex-wrap:
nowrap/ warp/ wrap-reverse
定义项目如何换行,默认项目都排列在一条线上不换行flex-flow:
是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap
- 项目属性
order:
项目排列顺序,数字越小排越前,默认为0flex-grow:
定义项目放大比例flex-shrink:
定义项目缩小比例flex-basis:
定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小flex:
flex-grow + flex-shrink + flex-basisalign-self:
默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
利用 flex 可以很简单地实现元素居中对齐,两列、三列自适应布局。flex 多用于移动端和小程序。
Grid
布局即网格布局,是一个二维的布局方式,由纵横相交的两组网格线形成的框架性布局结构,能够同时处理行与列。
擅长将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系。
IE10 以下不支持,手机端适配性较差
# 15. 回流和重绘
回流(重排): 当页面布局、元素的几何属性或元素内部的文字结构发生变化,导致页面需要重新构建,就会发生回流;
重绘: 当页面的布局、元素几何结构不变,而其他如颜色等样式发生变化时,就会发生重绘;
页面第一次构建时一定会触发一次回流和重绘
回流一定会触发重绘,重绘不一定会触发回流
如何避免重绘或者重排?
- 集中改变样式,不要一条一条地修改 DOM 的样式。
- 不要把 DOM 结点的属性值放在循环里当成循环里的变量。
- 为动画的 HTML 元件使用 fixed 或 absoult 的 position,那么修改他们的 CSS 是不会 reflow 的。
- 不使用 table 布局。因为可能很小的一个小改动会造成整个 table 的重新布局。
- 尽量只修改position:absolute或fixed元素,对其他元素影响不大
- 动画开始GPU加速,translate使用3D变化
- 提升为合成层 将元素提升为合成层有以下优点:
- 合成层的位图,会交由 GPU 合成,比 CPU 处理要快
- 当需要 repaint 时,只需要 repaint 本身,不会影响到其他的层
- 对于 transform 和 opacity 效果,不会触发 layout 和 paint
# 16. 最小字体?怎么设置更小
问题:使用font-size设置字体,最小只到12px,设置小于12字体也不会再缩小了。
原因:Chrome 以及 Chromium 内核的浏览器在中文语言下最小字体只能是12px
解决方案:使用 transform: scale()
缩放属性实现
.d1{
font-size: 12px;
transform: scale(0.5); /* 缩放为0.5,即6px */
transform-origin: 0 0; /* 左对齐 */
}