下面整理下自己觉得比较重要的css相关的面试题,欢迎查看~~
一、flex布局
flex属性是flex-grow、flex-shrink、flex-basis的简写,默认值是0 1 auto
| 标题 | 默认值 | 含义 |
|---|---|---|
| flex-grow | 0 | 定义项目放大比例,默认不放大,即即使存在剩余空间,也不会放大 |
| flex-shink | 1 | 定义项目缩小比例,默认缩小,即如果空间不足,则将该项目缩小 |
| flex-basis | auto | 定义在分配多余空间之前,项目占据的主轴空间,浏览器根据该属性计算主轴是否有多余空间 |
flex:1代表什么?
flex: 1 = flex: 1 1 0% 即自动增大缩小
flex:auto = flex: 1 1 auto
flex:0 = flex: 0 1 0%
flex:none = flex: O O auto
二、BFC
BFC是一个独立的布局环境,里面元素的布局不受外面布局的影响,也不会影响外部元素。BFC学习文章。
创建方式
- 根元素:body
- float:left/right
- overflow:hidden、auto、scroll
- display: inline-block/table-cell/grid/flex
- position: absolute/fixed
解决问题
- margin重叠:利用以上特性变为bfc。
- 高度塌陷:子元素float,父元素高度为0,通过设置父元素是overflow:hidden。
- 自适应两栏布局:左边宽度固定,右边自适应。
设置了以上属性的元素就会触发BFC,BFC特性有:
- BFC中上下相邻的两个容器margin会重叠
- BFC高度的计算会包括浮动元素的计算
- BFC区域不会与浮动容器发生重叠 这个就是利用的这个特性
- 容器内部元素不会影响外部元素
- 每个元素的左margin和容器的左border相接触
三、margin重叠
- 浮动的元素和绝对定位这种脱离文档流的元素的外边距不会折叠,重叠只出现在垂直方向。
- 如果两个都是负值时,用0减去两个钟绝对值大的那个。
解决办法
- 兄弟之间折叠
- 底部元素变为行内盒子,display:inline-block
- 底部元素设置浮动:float
- 底部元素的position值为absulte/fixed
/* 兄弟元素消除margin重叠 */
.div1 {
width: 100px;
height: 100px;
background-color: yellow;
margin-bottom: 50px;
border: 1px solid black;
}
.div2 {
width: 100px;
height: 100px;
background-color: red;
margin-top: 100px;
border: 1px solid black;
/* 方法1: */
display: inline-block;
/* 方法2: 设置浮动 */
/* float: left; */
/* 方法3: 设置absolute/fixed,设置该定位不设置top和left时,是默认的位置,但是脱离了文档流 */
/* position: fixed;
position: absolute; */
}
- 父子之间重叠
表现为父子之间的margin没了。
- 父元素:overflow:hidden
- 父元素添加边框:border:1px solid transparent
- 子元素变为行内盒子:display:inline-block
- 子元素加入浮动属性或者定位
<div class="outer">
<div class="inner">
</div>
</div>
/* 父子元素margin重叠 */
.outer {
width: 200px;
height: 200px;
background-color: yellow;
margin-top: 100px;
/* 1. 父元素设置border */
/* border: 1px solid #000; */
/* 2. 父元素设置 overflow:hidden */
/* overflow: hidden; */
border: 1px solid blue;
}
.inner {
width: 100px;
height: 100px;
background-color: red;
margin-top: 50px;
/* 子元素设置inline-block或者fleat,或者fixed/absolute,和同级元素处理方法相同 */
/* display: inline-block; */
/* float: left; */
/* position: fixed; */
/* position: absolute; */
}
四、css优化和提高性能方法
加载性能
- css压缩
- css单一样式:例如设置margin-bottom:bottom;margin-left:left执行效率比margin: 0 0 bottom left更高。
- 减少@import,使用link,因为@import是等待页面加载完再加载。
选择器性能
css选择器是从右向左进行匹配的。
- 如果有id选择器,则无需再增加标签
- 尽量少使用后代选择器,降低选择器的权重值。后台选择器开销是最高的,尽量将选择器深度降到最低,最高不超过三层,更多的使用类来关联每一个标签元素。
渲染性能
- 慎重使用高性能属性:浮动、定位
- 尽量减少页面重排、重绘。
- 属性为0时,不加单位
- 属性为浮点小数0.xx时,省略小数点之前的0
- 带浏览器前缀的在前,标准属性在后。
- 优化嵌套,避免层级过深。
五、postcss
用于处理css,类似babel将高版本js转化为低版本js代码,postcss可以编译尚未被浏览器支持的先进的css,借助autoprefixer自动增加浏览器前缀。
webpack的css相关插件
- css-loader:导入css
- style-loader:创建style标签,把css内容写入标签
- less-loader、sass-loader,预处理器定义了一套css之上的超集,如Ts与js的关系。
- post-css:增强原生css的能力,没有定义一门新的语言,而是将css解析为ast结构,并传入postcss插件做处理,具体功能都由插件实现,就像babel和js。
顺序:less-loader、postcss、css-loader、style-loader,但插件解析顺序是从右到左的,所以写的时候是先style-loader=>css-loader=>less-loader
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
"style-loader",
{
loader: "css-loader",
options: {
importLoaders: 1
}
},
{
loader: "postcss-loader",
options: {
postcssOptions: {
// 添加 autoprefixer 插件
plugins: [require("autoprefixer")],
},
},
},
"less-loader"
],
},
],
}
};
六、如何实现响应式布局
一个页面如何实现同时兼容H5和pc页面的
1. 媒体查询:
选择屏幕分割点,bootstrap的断点方案,移动端优先时使用min-width,pc优先时使用max-width。
2. 百分比布局
这里面比较迷惑的就是,各种css计算中子元素的百分比到底是相当于谁?
- width、height的百分比是相对于父元素的width、height
- top、bottom百分比相对于非static定位的父元素的高度
- left、right百分比相对于非static父元素的宽度
- padding、margin:无论垂直还是水平都是相等于父元素的width
- border-radius、translate、background-size百分比都是相对于自身的宽度。
3. rem布局
屏幕分成100份,font-size根据屏幕大小动态的设置成clientWidth/100,元素的大小就是 元素PX/视觉稿宽度 * 100,pc的话会有一个最大值限制。需要重新设置font-size
假如是750的视觉稿,2倍的视觉稿,则html的font-size=750/100 = 7.5px,1rem = 7.5px 那200px的宽度,px的rem转换就是px直接除以1rem,而因为是二倍搞,所以需要200 / 2 / 7.5就是对应的rem值。
4. vh、vw
- vh:1vh是屏幕高度的1%,视窗高度是100vh
- vw是视口宽度的1%,即视窗宽度是100vw
按照上面的定义,上面rem设置为clientWidth的1/100,那就是vw呢,所以可以直接将html根节点的font-size设置为1vw,其他元素宽度还是用rem。例如以下种效果等价。
/* rem方案 */
html {fons-size: width / 100}
p {width: 15.625rem}
/* vw方案 */
p {width: 15.625vw}
但是用rem时font-size不能用rem,应该用px,再加上媒体响应来适配不同的屏幕大小。
html {fons-size: width / 100}
body {font-size: 16px}
@media screen and (min-width: 320px) {
body {font-size: 16px}
}
@media screen and (min-width: 481px) and (max-width:640px) {
body {font-size: 18px}
}
@media screen and (min-width: 641px) {
body {font-size: 20px}
}
5. flex、grid布局
七、css盒模型
内敛元素的width、height生效吗?设置margin和padding呢?
- 块级元素可以设置width,height,margin和padding属性.
- 行内元素设置宽高无效,但是水平方向的padding-left,padding-right,margin-left,margin- right都产生边距效果,但竖直方向的padding-top,padding-bottom,margin-top,margin-bottom却不会产生边距效果.
八、css层级
css层叠上下文概念、图层?
-
如何形成层叠上下文
- 文档根元素
- position属性的值不为static且z-index值不为auto
- opacity属性值小于1
- flex/grid布局且z-index不为auto
- will-change值设定任意属性,且值为非初始化值
- transform不为none
- filter不为none
-
zindex判断
- 如果处于同一层级,按照css层叠顺序来
- 如果处于不同的层叠上下文,则按照顶层元素的z-index判断。
-
层叠上下文和图层不是一个概念 层叠上下文 渲染图层 复合图层(硬件加速)区别与联系,某些特殊的渲染层会被提升为复合成层(Compositing Layers),复合图层拥有单独的 GraphicsLayer,而其他不是复合图层的渲染层,则跟随第一个拥有 GraphicsLayer 的父层。
-
如何开启复合图层
- 3d转换 translate3d、translateZ
- video、canvas、iframe
- will-change
- filter
- 等等