常见CSS面试题汇总

262 阅读16分钟

1、盒模型

1.1 分类: IE盒模型和标准盒模型。

1.2 区别: 最大的区别就是width的包含范围。 标准盒模型的width = content部分的宽度, 怪异盒模型的width = contentWidth + padding + border

1.3 标准盒和怪异盒的宽度计算: 标准盒子宽度:左右border+左右padding+width

怪异盒子宽度:width

1.4 box-sizing属性有三个值哦 box-sizing:border-box(怪异)/padding-box(这个属性值的宽度包含了左右padding和width)/content-box(标准)

2、BFC

2.1 概念

块级格式化上下文,是一个独立的渲染区域,有一定的布局规则。用于清除浮动,防止margin重叠。

2.2 BFC的计算规则

  1. BFC就是一个块级元素,在垂直方向上一个接着一个的排列。
  2. 垂直方向的距离由margin决定,属于同一个BFC的两个相邻的标签外边距会发生重叠。
  3. 计算BFC高度时,浮动元素参与计算。

2.3 触发BFC的条件

  • 根元素
  • float不为none的元素
  • position为fixed和absolute的元素
  • display为flex、inline-flex、inline-block、table-cell、table-caption的元素
  • overflow不为visible的元素,比如hidden

2.4 实际应用场景

  • 解决高度塌陷:让父级元素也触发BFC区域
  • margin边距重叠:可以给其中一个元素包裹一个标签解决。要么一个元素设margin,另外一个元素设置padding

3、清除浮动

首先要明白为什么要清除浮动,一般是遇到了高度塌陷问题等

3.1 方法一:在最后一个浮动元素后添加空标签(不推荐)

在浮动元素最后加一个空元素,比如 <div class="clear"></div>,并添加选择器.clear{clear:both;}

3.2 方法二:给父元素添加overflow:hidden或者overflow:auto

3.3 方法三:使用:after伪元素(最常用)

与方法一类似,只是方法一使用的是真实的标签,

.clearfix:after{ /*父元素选择器*/
  content: '';
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

3.4 方法四:给父元素也添加浮动。但是会影响布局(不推荐)

3.5 方法五:使用before和after双伪元素清除浮动

.clearfic:after,.clearfix:before{
    content:"";display:table;
}
.clearfix:after{
    clear:both
}

4、请解释一下CSS3的Flexbox(弹性盒布局模型),以及适用场景?

flex弹性布局可以简便、完整、响应式的实现各种页面布局。flex容器中默认有两条轴,主轴和交叉轴,呈90度,通过flex-direction控制轴的方向。

4.1 常见容器属性和容器成员属性

容器属性:

  • flex-direction(主轴方向)row | row-reverse | column | column-reverse;
  • flex-wrap(一条轴线排不下,是否换行)nowrap | wrap | wrap-reverse;
  • flex-flow(flex-direction和flex-wrap属性的简写,默认值row nowrap)
  • justify-content(项目在主轴上对齐方式)flex-start | flex-end | center | space-between | space-around;
  • align-items(项目在交叉轴上如何对齐)flex-start | flex-end | center | baseline | stretch(默认);
  • align-content(定义了多根轴线的对齐方式,如果项目只有一根轴线,该属性不起作用)flex-start | flex-end | center | space-between | space-around | stretch;

容器成员属性:

  • order:项目的排列顺序,数值越小,排列越靠前,默认为0
  • flex-grow:当容器的flex-wrap:nowrap的时候,有时宽度不够分,这是就由该属性决定,默认为0.如果所有项目的flex-grow:1;则它们将等分剩余空间。
  • flex-shrink:定义了项目的缩小比例。如果所有项目flex-shrink:1;当空间不足时,都等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小
  • flex-basis:元素在主轴上的初始尺寸
  • flex:flex-grow;|flex:shrink|flex:basis的简写。默认值0 1 auto。
  • align-self:允许单个项目与其他项目有不一样的对齐方式,可覆盖align-items属性。默认auto。

5、两栏布局,左栏固定宽,右边自适应

结构:

<div class="box">
    <div class="left">左边宽度固定</div>
    <div class="right">右边宽度自适应</div>
</div>

基础样式:

.box{
    border:1px solid red;
}
.left{
    width:200px;
    height:200px;
    background-color:rgb(97,143,204)
}
.right{
    height:200px;
    background-color:rgb(165,103,207)
}

方法一:利用浮动 左侧div浮动脱离文档流,右侧盒子设置左外边距拉开距离

.box{
    border:1px solid red;
}
.left{
    width:200px;
    height:200px;
    background-color:rgb(97,143,204);
    float:left;
}
.right{
    height:200px;
    background-color:rgb(165,103,207);
    margin-left:200px;
}

方法二:利用绝对定位. 绝对定位也可以让元素脱离文档流,右侧盒子同样设置左外边距拉开

.box{
    border:1px solid red;
}
.left{
    width:200px;
    height:200px;
    background-color:rgb(97,143,204);
    position:absolute;
}
.right{
    height:200px;
    background-color:rgb(165,103,207);
    margin-left:200px;
}

方法三:利用浮动+BFC 左侧浮动元素脱离文档流,为了不影响右侧元素,应该让右侧元素也触发BFC

.box{
    border:1px solid red;
}
.left{
    width:200px;
    height:200px;
    background-color:rgb(97,143,204);
    float:left;
}
.right{
    height:200px;
    background-color:rgb(165,103,207);
    overflow:hidden;
}

方法四:利用flex。 首先,父容器设置为弹性容器,然后让右侧div自动放大,给右侧盒子设置flex:1 1 auto属性,也可简写为flex:auto。或者是给右侧盒子设置felx-grow:1;

.box{
    border:1px solid red;
    display:flex;
}
.left{
    width:200px;
    height:200px;
    background-color:rgb(97,143,204);
}
.right{
    height:200px;
    background-color:rgb(165,103,207);
    flex: 1 1 auto
}

方法五:使用calc方法。

.left{
    width:330px;
}
.right{
    width:calc(100% - 330px);
}

方法六:使用grid布局

.box {
    display:grid;
    grid-template-columns:200px auto;/*设置每一列的宽度,左200px,右自适应*/
}

6、红色区域的宽度是多少?

.test{
  width: 100px;
  height: 80px;
  border: 20px solid red;
  background: red;
  padding: 20px;
  margin: 20px;
  box-sizing: border-box;(如果是content呢?)
}

box-sizing:border-box;为怪异盒子,红色区域宽度就是100px. 当box-sizing:content-box;为标准盒子,红色区域宽度就是100px+40px+40px=180px

7、垂直居中布局的实现方式

基础结构:

<body>
    <div class="box">
    </div>
</body>

这里主要分为元素定宽高和不定宽高的情况:

7.1 定宽高

7.1.1 绝对定位+负margin值

        .box {
            width: 300px;
            height: 300px;
            background-color: red;
	    position: absolute;
            left: 50%;
            top: 50%;
            margin-left: -150px;
            margin-top: -150px;
        }

7.1.2 绝对定位+transform:translate()

		.box {
		    width: 300px;
		    height: 300px;
		    background-color: red;
                    position: absolute;
                    left: 50%;
                    top: 50%;
                    transform: translate(-150px,-150px);
		}

7.1.3 绝对定位+top/bottom/left/right为0+margin:auto

		.box {
		    width: 300px;
		    height: 300px;
		    background-color: red;
                    position: absolute;
                    left: 0;
                    right: 0;
                    top: 0;
                    bottom: 0;
                    margin: auto;
		}

7.1.4 flex布局

将要居中的元素的父元素设置为弹性盒

/*父元素*/
html,body {
            height: 100%;
            display: flex;
            justify-content: center;
            align-items: center;
            width: 100%;
        }
/*子元素*/
.box{
	width: 100px;
        height: 100px;
	background-color: aqua;
	}

7.1.5 flex布局或grid布局+子元素margin:auto

html,body {
            height: 100%;
            width: 100%;
            display: flex;
          /*display:grid;*/
        }
/*子元素*/
.box{
	width: 100px;
        height: 100px;
	background-color: aqua;
        margin:auto
	}

7.2 不定宽高

7.2.1 绝对定位+transform

		.box {
		    width: 300px;
		    height: 300px;
		    background-color: red;
                    position: absolute;
                    left: 50%;
                    top: 50%;
                    transform: translate(-50%,-50%);
		}

7.2.2 table-cell

<!-- 结构 -->
<div class="box">
    <div class="box1">wvevebeb</div>
</div>
 /* 样式 */
.box{
	width: 200px;
	height: 200px;
	display: table-cell;
        text-align: center;
        vertical-align: middle;
        border: 1px solid red;
       }
 .box1{
	background: yellow;
	display: inline-block;
}

7.2.3 flex布局,同7.1.4

7.2.4 flex变异布局,同7.1.5(要求父元素必须有宽高)

7.2.5 grid+flex

.box{
	width: 200px;
	height: 200px;
	border: 1px solid red;
	display: grid;
}
.children{
	background: yellow;
	align-self: center;
	justify-self: center;
}

8、实现一个三角形

.box {
	width: 0;
	height: 0;
	border: 50px solid red;
	border-color: red transparent transparent transparent; 
}

同理可以实现一个扇形,只需要添加一行代码:

border-radius:50%;

同理可以实现一个梯形,将元素设置一个宽度值即可,此时宽度值代表的是梯形的较短边

9、CSS的position有哪些属性?分别相对于谁定位?

9.1 六种属性值

absolute\relative\fixed\static\sticky\inherit

9.1.1 static 默认值

该属性值代表没有定位,元素处于正常的文档流中

9.1.2 relative 相对定位

相对于自己原本的位置进行定位,不脱离文档流,元素原本的位置会被保留,其它的元素位置不受影响。

9.1.3 absolute 绝对定位

相对于设置了position属性为relative或absolute的父级元素进行定位,如果没有这样的父级元素,则相对于body进行定位。 脱离文档流,常常结合relative使用

9.1.4 fixed 固定定位

脱离文档流,相对于body定位

9.1.5 sticky 粘性定位

可以说是相对定位relative和fixed的结合体,一开始没有脱离文档流,但是当元素距离其父元素的距离达到粘性定位的要求时,此时的效果相当于fixed,固定到适当位置,脱离文档流。

9.1.6 inherit 继承父元素的position属性

10、CSS常用单位

常用单位:px\em\rem\vw\vh\in\cm\ch\mm\ex\pt\pc\vmin\vmax

10.1 绝对长度单位

px像素 in英寸 mm毫米 pt磅等

10.2 相对长度单位

em rem vw vh

11、如何实现一个loading动画

svg标签+animation实现方案: animation:dash 2s linear 0s infinite;代表的意思分别是动画的名称、动画完整执行的时长、从开始到结束以同样的速度执行、延迟0s、动画无限次播放 svg标签中的viewbox="25 25 50 50"属性值代表的是,起点从(0,0)变为(25,25),元素大小长和宽为50

12、如何实现3D效果的正方体

一个大盒子包着六个小盒子,小盒子通过平移旋转拼凑成正方体

13、有没有使用过css variable(自定义变量)?

概念: css自定义变量(css variable)又叫自定义属性。 变量的声明: 声明变量的时候,变量名前面要加两个中横线(--),--主要是用来区分默认属性

body { --foo: #7F583F; --bar: #F7EFD2; }

变量的获取和使用:

/*var()函数用于读取*/
a { 
    color: var(--foo); 
    text-decoration-color: var(--bar); 
  }

解决了什么问题:

  • 减少了重复定义,比如同一个颜色多地方使用,只定义一次就可以了,方便维护,提高可读性
  • 在媒体查询中使用,精简代码,减少冗余
  • 方便在js中使用,减少js中对DOM的介入,制作性能更高的动画

兼容性处理: 主流浏览器都支持,但是对于不支持css自变量的浏览器可以采用以下写法:

  /*css*/
   @supports ( (--a: 0)) {
  /* supported */
  }
  @supports ( not (--a: 0)) {
  /* not supported */
  }
  // Js
  if (window.CSS && window.CSS.supports && window.CSS.supports('--a', 0)) {
  alert('CSS properties are supported');
  } else {
  alert('CSS properties are NOT supported');
  }

14、谈谈你对styled-component的看法

styled-component是一个常用的css in js类库,通过js赋能解决了原生css所不具备的能力,比如变量、循环、函数等。 优点: 可维护性高,易读性好,可抽象,可扩展性好 缺点: runtime对性能有一定的影响,不能直接用postcss

15、display:inline的元素设置margin和padding会生效吗

行内元素的padding和margin左右都会生效,margin的上下不会生效。 只有padding的上下比较奇怪,比如span标签的上下padding会将span背景颜色撑开。但是当span内的元素开始换行的时候,会发现上下行之间的字并不会互相影响,并不会撑大父元素。

16、如何实现表格的单双行样式

利用css3中的伪类:nth-child来实现单双行样式的不同

tr:nth-child(2n){
    background-color:red;
}
tr:nth-child(2n+1){
    background-color:blue;
}

17、+和~选择器有什么不同?

+ 选择器匹配紧邻的兄弟元素。 ~ 选择器匹配随后的所有兄弟元素

        div+p {
            background-color: aqua;
        }
        div~p {
            background-color: blueviolet;
        }

18、为什么会发生样式抖动?

因为当前抖动的模块并没有指定宽度和高度。比如当加载页面的时候,数据还未加载出来的时候元素高度是100px,当数据加载完成时元素会瞬间被撑大,所以才出现了抖动。

19、position:sticky如何工作?适合怎样的场景?

粘性定位相当于绝对定位和固定定位的结合体,当没有到达sticky要求的值时,相当于relative定位,不会脱离文档流。但是当到达指定值的时候,就会和固定定位效果一样,黏在指定位置并且脱离文档流。

适用场景:固定导航栏、页脚固定、表格表头固定等。

20、你用css实现过什么不错的效果?

酷炫的文字渐变:

/* 文字渐变:先将元素背景设置为渐变色,最后两句代码是只让文字显示渐变色,背景渐变色去除 */
        span {
            font-size: 48px;
            background: -webkit-linear-gradient(#eee,#fad,purple,#333);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
        }  

渐变.png

3D文字效果: [代码片段](https://code.juejin.cn/pen/7146860616404172831)

20、伪类和伪元素有什么区别?

  1. 伪类是用单冒号,伪元素使用双冒号。比如:hover是伪类,::before是伪元素。
  2. 伪元素会在文档流生成一个新的元素,并且可以使用content属性设置内容。
  3. 常见的伪类::hover :nth-child() :visited :first-child :last-child等,常见的伪元素:::after ::before ::selection ::placeholder :: marker

21、css隐藏页面中某个元素的几种方法

方法一:display:none,移出文档流 方法二:opacity:0,透明度为0,但仍在文档中,但作用于其上的事件(如点击)仍有效 方法三:visibility:hidden,仍在文档流中,但作用于其上的事件(如点击)无效 方法四:content-visibility:hidden;移除文档流,再次显示时消耗性能低 方法五:绝对定位于当前页面不可见位置

position:absolute;
top:-9000px;
left:-9000px;

方法六:字体大小设置为0

22、css如何实现响应式布局,大屏幕三等分,中屏幕二等分,小屏幕一等分

基本结构布局:

    <div class="container">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>

样式布局:

        @media (min-width:768px) {
            .container {
                /* 网格布局划分为2列,每列的宽度一致 */
                grid-template-columns: repeat(2,minmax(0,1fr));
            }
        }
        @media (min-width: 1024px){
            .container {
                grid-template-columns: repeat(3,minmax(0,1fr));
            }
        }
        .container {
            display: grid;
        }
        .container {
            gap: 1rem;
        }
        .container div {
            height: 900px;
            background-color: aqua;
        }

23、网站设置字体时,如何设置优先使用系统默认字体

直接设置样式font-family:system-ui;

24、css如何设置方格背景?

采用background和background-size属性配合形成

    background: linear-gradient(90deg,rgba(67, 15, 189, 0.15) 3%,transparent 0),linear-gradient(rgba(14, 226, 102, 0.15) 3%,transparent 0);
    background-size: 20px 20px;

25、实现一个方框,文字可以正常换行,文字过多显示滚动条

主要使用word-wrap:break-word;和overflow:scroll;实现

        .last {
            width: 200px;
            height: 200px;
            word-wrap: break-word;
            overflow: scroll;
        }

26、css如何设置一行和多行超出显示省略号

单行文本溢出显示省略号:

         .box{
		width: 100px;
		border: 1px solid black;
		overflow: hidden;
		text-overflow: ellipsis;
		white-space: nowrap;
	    }

多行文本溢出省略号:

        div{
            width: 200px;
            /*将盒子作为弹性伸缩盒子模型显示*/
            display: -webkit-box;  
            /*设置盒子的元素排列方式*/
            -webkit-box-orient: vertical;
            /*超出3行多余的用省略号*/
            -webkit-line-clamp: 3;
            word-break: break-all;
            overflow: hidden;
        }

27、flex布局中align-content和align-items有何区别?

align-content作用于纵轴多行元素,一行不起作用 align-items作用于纵轴单行元素

28、实现一个子元素垂直居中并且长和宽为父元素一半的正方形

使用一个最新的属性aspect-ratio:1/1;代表长宽比的意思。

    <!-- html结构 -->
    <div class="container">
        <div class="item"></div>
    </div>
    /* 样式 */
        .container {
            display: grid;
            place-items: center;
            width: 200px;
            height: 200px;
            background-color: rebeccapurple
        }
        .item {
            width: 50%;
            aspect-ratio: 1/1;
            border: 1px solid red;
        }

29、rem\em\vw\vh的值各是什么意思?

rem:根据根元素(即html)的font-size

em:根据自身元素的font-size

vw:窗口的宽度

vh:视窗的高度

30、line-height的值分别取[2,2em,200%]有什么区别?

line-height是相对于自身的字体大小来取值,但同时会被继承。

31、某元素的fontSize:2rem;lineHeight:1.5em;此时lineHeight为多少像素?

默认情况下,fontSize为16px;2rem = 32px;em相对于自身元素的font-size,则line-height:1.5*32===48px;

32、如何实现三列均分布局

两种方法:使用flex和使用grid

/*使用calc(100% / 3)设置flex-basis*/
.container {
    display:flex;
    flex-wrap:wrap;
}
.item {
    flex:0 0 calc(100%/3)
}
/*使用grid直接操作容器即可,对于子元素之间的间隙可以很好地控制*/
.container {
    display:grid;
    grid-template-columns:1fr 1fr 1fr;
    gap:1rem;
}

33、z-index值大的元素一定在值小的上面吗?

z-index大的元素不一定在z-index值小的元素上面,因为z-index它不一定生效。 z-index是需要一个position值不为static才会生效。即便z-index生效之后,也不是单纯的比较大小,因为这个数在层叠上下文中才有意义。如果想要实现父元素覆盖子元素,给父元素设置非常大的z-index值是不管用的,因为按照层叠上下文的规律,子元素始终会显示在父元素上。正确的做法就是将子元素的z-index设置为负值,因为负值的z-index层级是小于父元素的。所以父元素就在上面。

34、css加载会阻塞DOM树的解析和渲染吗?

答:css加载会阻塞DOM树的解析和渲染,因为只有css加载完毕构建完CSSOM之后,渲染树(Render Tree)才会构建,然后渲染成位图。如果html中有加载script的话。会间接影响DOM树的解析,因为js的下载、解析和执行会阻塞DOM树的解析,而js中有可能访问CSSOM,比如Element.getBoundingClientRect,因此CSSOM构建完毕后才开始js的执行,间接阻塞DOM树的解析。

35、浏览器页面渲染的过程

  1. html代码解析成dom树。
  2. css代码解析成cssom树。
  3. 结合dom树和cssom树形成一个render树。
  4. 布局。将渲染树的所有dom节点进行平面合成。
  5. 绘制到屏幕上。