前端面试题目—css

769 阅读8分钟

这是我在掘金写得第一篇文章,整理记录自己最近找工作中,面试官常问得最多的css方面的问题,后续还有其他系列,敬请期待哦。根据面试官的水平以及面试官擅长的技术点的不同,每场面试的侧重点会有很多不同,作为一个求职者,我们只能尽我们最大的努力多查、多思、多总结。后续如果有遇到css相关的问题,还会在这里补充。

1. 什么是BFC,解释一下

  • 概念:块格式化上下文,它是一个独立的渲染区域,规定了内部的元素如何布局,与外部区域毫不相干
  • 创建BFC的条件:根元素(html);浮动元素(float不为none);绝对定位元素(position为absolute和fixed);行内块元素(元素的display为inline-block);表格单元格、标题(display:table-cell或者table-caption);overflow计算值不为visible的块元素;弹性元素(display:flex元素的直接子元素);网格元素(display:grid元素的直接子元素)
  • BFC规则:属于同一个BFC的两个相邻的Box的margin会发生重叠;BFC的区域不会与float的元素区域重叠;计算BFC的高度时,浮动子元素也参与计算;文字层不会被浮动层覆盖,环绕于周围
  • BFC应用:防止margin重叠, 使两个box属于不同的BFC可以包含浮动元素;防止父元素高度坍塌;阻止元素被浮动的元素覆盖,自适应成两栏布局

2. 元素水平垂直居中

  • 文本、行内元素、行内块级元素、图片: text-align+line-height+vertical-align
  • 弹性盒子:flex+justify-content+align-items
  • 绝对定位:position+margin(定宽定高);position+transform(兼容transform);
  • 绝对居中:position+margin:auto;
/* 方案1——文本、行内元素、行内块级元素、图片 */
#parent{ 
  height: 150px; 
  line-height: 150px; /*行高的值与height相等*/ 
  text-align: center; 
  font-size: 0; /*消除幽灵空白节点的bug*/ 
}
#son{ 
/*display: inline-block;*/ /*如果是块级元素需改为行内或行内块级才生效*/    
  vertical-align: middle; 
}
/* 方案2——弹性盒子 */ 
#parent{ 
  display: flex; 
} 
#son{ 
  margin: auto; 
}
或 
#parent{ 
  display: flex; 
  justify-content: center;
  align-items: center;
}
或 
#parent{ 
  display: flex; 
  justify-content: center;
}
#son{ 
  align-self: center; 
}
/* 方案3—— 绝对定位*/ 
#parent{ 
  position: relative;
} 
#son{ 
  position: absolute;
  top: 50%; 
  left: 50%; 
  /*定宽高时等同于margin-left:负自身宽度一半;margin-top:负自身高度一半;*/ 
  transform: translate(-50%,-50%); 
}
/* 方案4—— 绝对居中*/ 
#parent{ 
  position: relative;
} 
#son{ 
  position: absolute;
  margin: auto; 
  width: 100px; 
  height: 50px; 
  top: 0; 
  bottom: 0; 
  left: 0; 
  right: 0; 
}

3. 清除浮动

  • 清除浮动的原因:文字围绕浮动元素排版;父元素高度坍塌,浮动元素会遮住正常的元素;
  • 清除浮动的方式:
  1. 在浮动元素后面添加clear:both的空div元素,解决文字围绕浮动元素排版的问题;
  2. 给父元素添加overflow:hidden或auto,触发BFC,解决高度坍塌的问题;
  3. 使用伪元素,也是在元素末尾添加一个点并带有 clear: both 属性的元素实现的。

4. 什么是物理像素、设备独立像素

  • 像素概念:像素即一个小方块,它具有独立的位置和颜色;
  • 屏幕分辨率:一个屏幕具体由多少个像素点组成;
  • 图像分辨率:图像含有的像素数,同一尺寸的图片,分辨率越高越清晰;
  • 物理像素:任何设备的物理像素都是固定的,设备上真实的物理单元;
  • 设备独立像素:一个抽象像素概念,允许不同分辨率的设备以抽象像素为单位进行测量,来保持视觉效果的一致。
  • 设备像素比:dpr = 物理像素/设备独立像素;
  • 设计师给到的设计图都是根据物理像素为单位制作的;
  • 开发过程中使用css像素,css像素是很容易改变的,页面缩放系数 = css像素/设备独立像素;

5. 伪类以及伪元素

  • 伪元素:用于创建一些不在文档树中的元素,并为其添加样式,或者对被选择元素的特定部分修改样式。常见伪元素:::before、::after、::first-line、::first-letter、::placeholder、::selection等
  • 伪类:css选择器的一类,通过伪类找到那些不存在DOM树中的信息以及不能被常规css选择器获取到的信息。常见伪类如下图所示: 1.png

6. 说一下回流与重绘

  • 前言:
  1. 浏览器使用流式布局:在页面上显示"块"和"内联"元素的方式。
  2. 第一步:浏览器处理HTML标记并构造DOM树;第二步:处理CSS并构建CSSOM树;第三步:将DOM树与CSSOM树组合成一个Render树,然后计算每个节点在页面上的大小和位置,最后把节点绘制到页面上。
  • 回流:当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程。
  • 导致回流的因素:页面首次渲染;元素尺寸或位置发生改变;元素内容变化(文字数量等);元素字体大小变化;添加、删除可见的DOM元素;查询某些属性或调用某些方法:offset类、client类、scroll类等属性,getComputedStyle()、scrollIntoView()、scrollTo()等方法。
  • 重绘:改变节点的样式,但没有影响到节点的几何属性的时候,会导致重绘(repaint):例如修改color、background-color等元素属性。
  • 如何避免回流与重绘:
  1. 避免使用table布局;
  2. 避免使用css表达式 calc();
  3. 将动画效果应用到position属性为absolute和fixed的元素上;
  4. 避免频繁操作样式,最好一次性重写style属性,或者使用class方式一次性更改样式;
  5. 对于resize,scroll等操作进行防抖、节流处理;
  6. 避免频繁重复读取会引发回流、重绘的属性(client,scroll,offset类),如果确实需要,就用一个变量缓存起来。

7. 如何画一个0.5px的直线

  • 在高清屏下(dpr>=2)可以直接设置0.5px,但是这种方式Chrome把0.5px四舍五入变成1px了;
  • 采用transform: scale()缩放的方式(最为常用的方式);
.hr { 
  height: 1px;
  transform: scaleY(0.5); 
  transform-origin: 50% 100%; 
}
  • 采用linear-gradient线性渐变的方式,线条不清晰,有点虚化;
.hr.gradient {
  height: 1px;
  background: linear-gradient(0deg, #fff, #000); 
}
  • 采用boxshadow阴影的方式;
.hr.boxshadow { 
  height: 1px; 
  background: none; 
  box-shadow: 0 0.5px 0 #000; 
}
  • 使用SVG:SVG中的1px是物理像素,而不是设备独立像素;
.hr.svg {
  background: none;
  height: 1px; 
  background: url("data:image/svg+xml;utf-8,<svg xmlns='http://www.w3.org/2000/svg' width='100%' height='1px'><line x1='0' y1='0' x2='100%' y2='0' stroke='#000'></line></svg>"); 
}
  • 采用border-image的方式;
  • 采用meta viewport的方式:设置缩放比例即可。 几种方式兼容性: 2.png

8. opacity与rgba的区别是什么?

  • opacity作用于元素以及元素内的所有内容;
  • rgba只作用于元素,元素内部的子元素不会继承透明效果;

10. css盒模型

  • 盒模型:元素的内容+内边距+边框+外边距
  • w3c标准模型:box-sizing属性为content-box(默认值)时,width=元素的内容区;
  • IE模型:box-sizing属性为border-box时,width=元素的内容区+padding+border;

11. 怎样实现两栏布局

  • 绝对定位(position:absolute)
  • 弹性盒子(display:flex)
  • 行内块(display:inline-block)
  • 一个浮动元素加一个BFC元素(float:left + overflow:hidden)

12. 弹性盒子 flex:0 1 auto代表什么?

  • flex-grow():当子元素的空间小于父元素的空间时,如何处理剩余空间;
  1. 默认为0,表示不占有剩余空间;
  2. 当子元素都为1,表示平均分配剩余空间;
  3. 当一个子元素为2其余子元素为1的时候,为2的子元素占据的剩余空间比其他子元素多一倍;
  4. 当一个子元素为1其余为0的时候,为1的子元素占据全局剩余空间;
  • flex-shrink():当子元素的空间大于父元素的空间时,如何缩小子元素;
  1. 默认值为1,表示等比收缩;
  2. 当所有子元素都设置为1时,所有子元素都会等比例缩小;
  3. 当一个子元素为0其余子元素为1时,为0的子元素不会缩小;
  • flex-basis:指定了flex元素在主轴方向的初始大小,如果一个元素同时设置了flex-basis(auto以外)和width,flex-basis具有更高的优先级;
  1. 默认值为auto,表示项目占据的主轴大小等于项目的实际内容大小;
  2. 设置为固定值表示项目占据的主轴大小为固定值;

13. 层叠上下文、层叠等级、层叠顺序、z-index

  • 层叠上下文概念:层叠上下文是对html元素的一个三维构想,如果一个元素含有层叠上下文,就可以理解这个元素在Z轴上就离屏幕观察者更近。
  • 创建层叠上下文:文档根元素(html);position为absolute或relative且z-index不为auto的元素;position值为fixed或者sticky的元素;flex容器的子元素,且z-index的值不为0;grid容器的子元素,且z-index的值不为0;opcity属性值小于1;具备如下css属性且值不为none的元素:transform;filter(滤镜);mask(遮罩);prespective(透视);
  • 层叠等级概念:在同一个层叠上下文中,html元素在Z轴的上下顺序。
  • 层叠等级:在统一层叠上下文中,层叠等级; 3.png