# HTML_CSS **Repository Path**: guanghua_pan/html_css ## Basic Information - **Project Name**: HTML_CSS - **Description**: 本项目内置了基础的html、css常见面试题场景 - **Primary Language**: HTML - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-08-04 - **Last Updated**: 2023-08-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HTML_CSS #### 介绍 本项目内置了基础的html、css常见面试题场景 # HTML + CSS 专题 ## 1.什么是 BFC ?如何触发?有何特点?如何解决 margin "塌陷"? BFC 指的是块级格式上下文(Block Formatting Context),是一个页面布局的一部分。BFC 决定了元素如何在页面中布局及相互作用。 BFC 可以通过以下方式触发: 1. 根元素(html) 2. 浮动元素(float 不为 none) 3. 绝对定位元素(position 为 absolute 或 fixed) 4. 行内块元素(display 为 inline-block) 5. 表格单元格(display 为 table-cell) 6. 表格标题(display 为 table-caption) 7. overflow 的值不为 visible 的元素 BFC 的特点包括: 1. 内部的块级盒子在垂直方向上一个接一个地放置,每个盒子的左边与包含块的左边对齐,垂直方向上的间距由 margin 决定。 2. 在同一个 BFC 内,两个相邻的块级盒子的上下外边距会发生重叠(margin “塌陷”)。 3. BFC 区域不会与浮动元素重叠。 4. BFC 是页面上一个独立的布局单位,其内部的元素不会影响到外部元素。 要解决 margin “塌陷” 问题,可以通过触发元素的 BFC 来实现。例如,可以给父元素设置 overflow: hidden 或者 float: left/right 来触发 BFC,这样就可以避免上下外边距重叠的问题。 ## 2.CSS 如何出来溢出?说一下 overflow 不同值的区别? 在CSS中,当元素的内容超过其指定的尺寸时就会出现溢出。针对这种情况,在CSS中提供了`overflow`属性来控制并处理溢出。 `overflow`属性有以下几个值: 1. `visible`:默认值,不剪裁溢出的内容,可能会超出父元素显示。 2. `hidden`:剪裁溢出的内容,超出的部分将被隐藏。 3. `scroll`:显示滚动条,即使内容没有超出。 4. `auto`:自动显示滚动条,仅当内容溢出时才显示。 5. `inherit`:继承父元素的`overflow`属性的值。 除了这些值之外,还可以分别设置`overflow-x`和`overflow-y`属性来控制溢出在水平方向和垂直方向的表现。这两个属性可以使用上述相同的值,也可以单独使用`visible`、`hidden`和`scroll`。 总结一下各个值的区别: - `visible`:内容溢出时不做任何处理,会超出父元素显示。 - `hidden`:剪裁溢出的内容,超出的部分会被隐藏。 - `scroll`:显示滚动条,无论内容是否溢出。 - `auto`:自动显示滚动条,仅当内容溢出时显示。 - `inherit`:继承父元素的`overflow`属性的值。 使用这些属性,可以根据具体需求来控制溢出内容的显示效果。 ## 3.三栏布局有什么实现方式? 三栏布局的实现方式有以下几种: 1. 使用浮动:将左栏和右栏设置为浮动,将中间栏设置为自适应宽度,通过控制浮动方向和宽度比例来实现三栏布局。但是在使用浮动布局时需要注意清除浮动的问题,以避免影响其他元素的布局。 2. 使用绝对定位:将左栏和右栏设置为绝对定位,通过设置左栏和右栏的左右位置和宽度来实现三栏布局。这种方式相对较为简单,但是需要注意父元素的定位方式必须是相对定位或绝对定位。 3. 使用flexbox弹性布局:通过设置父容器的display属性为flex,再设置子元素的flex属性来实现三栏布局。这种方式比较灵活且兼容性较好,但是需要注意一些浏览器的兼容性问题。 4. 使用grid网格布局:通过设置父容器的display属性为grid,再设置子元素的grid-area属性来实现三栏布局。这种方式是最现代化的布局方式,但是需要注意一些浏览器的兼容性问题。 每种实现方式都有其各自的特点和适用场景,根据具体的需求和兼容性要求选择合适的方式来实现三栏布局。 ## 4.css calc 属性作用是什么?主要用于解决什么问题? CSS的`calc()`属性用于执行动态计算,它可以在CSS中使用数学表达式来设置元素的尺寸、位置和其他样式属性的值。`calc()`函数能够接受任意的数学表达式作为参数,并返回计算结果。 主要用途和解决的问题包括: 1. 动态尺寸调整:`calc()`可用于根据视口大小或其他元素的尺寸来计算元素的宽度、高度或其他尺寸属性。例如,可以使用`calc(50% - 20px)`来计算一个元素的宽度为其父容器宽度的50%,再减去20像素。 2. 响应式设计:通过结合`calc()`和媒体查询(media queries),可以实现响应式布局。例如,可以根据设备屏幕的宽度调整元素的尺寸或间距。 3. 自适应布局:`calc()`使得布局更加灵活,可以自动适应不同内容的长度或宽度。它可以用于计算列的宽度,以确保多个列总宽度等于容器的宽度。 4. 解决盒模型计算问题:当使用CSS的盒模型时,元素的实际尺寸可能与所设置的尺寸不一致,因为边框和内边距会影响实际的可用空间。`calc()`可以用于准确计算元素的尺寸,减去边框和内边距的影响。 总而言之,`calc()`属性为开发人员提供了一种在CSS中执行动态计算的方式,使得样式更加灵活和适应不同的布局需求。 ## 5.有一个固定长宽 div ,怎么实现在屏幕上垂直水平居中 当需要将一个固定长宽的`div`在屏幕上垂直水平居中时,可以使用以下三种方案: **方案一:使用 Flexbox** ```css body { display: flex; justify-content: center; align-items: center; height: 100vh; } div { width: 300px; height: 200px; } ``` 这段CSS样式将`body`元素设置为 Flex 容器,并使用`justify-content: center; align-items: center;`将其内容水平和垂直居中。通过设置`height: 100vh;`使得`body`元素占满整个视口高度。最后,给`div`元素设置固定的宽度和高度。 **方案二:使用绝对定位和 transform** ```css body { position: relative; height: 100vh; } div { width: 1000px; height: 500px; background: #b0b0b0; position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%,-50%); /*Chrome、Safari 和 Opera 浏览器的兼容前缀*/ -moz-transform: translate(-50%,-50%); /*Firefox 浏览器的兼容前缀*/ -ms-transform: translate(-50%,-50%); /*Internet Explorer 浏览器的兼容前缀*/ -o-transform: translate(-50%,-50%); /*旧版 Opera 浏览器的兼容前缀*/ transform: translate(-50%,-50%); } ``` 这段CSS样式将`body`元素设置为相对定位,通过设置`height: 100vh;`使得`body`元素占满整个视口高度。然后,将`div`元素设置为绝对定位,使用`top: 50%; left: 50%;`将其顶部边缘和左侧边缘分别定位到父容器的垂直和水平中心。最后,使用`transform: translate(-50%, -50%);`将`div`元素向左和向上平移自身宽度和高度的一半,从而实现垂直和水平居中。 **方案三:使用 Grid 布局** ```css body { display: grid; /*place-items: center;*/ height: 100vh; } div { width: 300px; height: 200px; } ``` 这段CSS样式将`body`元素设置为格子布局(Grid Layout),使用`place-items: center;`将其内容居中对齐。通过设置`height: 100vh;`使得`body`元素占满整个视口高度。然后,给`div`元素设置固定的宽度和高度。 以上是三种常用的方法将一个固定长宽的`div`在屏幕上垂直水平居中。每种方法都有其优缺点,可以根据具体的需求选择最合适的方案。 ## 6.描述一下渐进增强( progressive enhancement )和优雅降级( graceful degradation ) 渐进增强(Progressive Enhancement)和优雅降级(Graceful Degradation)是两种不同的前端开发理念,旨在提供更好的用户体验,并确保网站或应用程序能够在各种浏览器和设备上正常工作。 **渐进增强(Progressive Enhancement)**是一种设计和开发方法,它从基本功能和内容开始构建网页或应用程序,然后逐步添加更高级的功能和样式,以满足现代浏览器和设备的能力。核心思想是以最简单的形式构建可访问性和可用性良好的基础版本,然后通过逐步增强来提升用户体验。这意味着无论用户使用什么设备或浏览器,他们都能够获得基本的功能和内容,而高级功能仅在支持它们的环境中可用。例如,在构建一个网页时,可以首先使用标准的HTML元素和语义化标记来创建内容,然后通过CSS样式和JavaScript来增加交互性和动态效果。 **优雅降级(Graceful Degradation)**是一种设计和开发方法,它首先针对现代浏览器和设备构建完整的功能和富有交互性的网页或应用程序,然后通过在旧版浏览器或不支持某些功能的设备上提供替代方案来降低用户体验的损失。核心思想是确保所有用户都能够访问和使用网站或应用程序,即使它们可能无法享受到最新的功能和效果。例如,通过使用浏览器功能检测和兼容性技术,可以在旧版浏览器上提供基本的功能和内容,并根据用户的环境逐步增强体验。 渐进增强和优雅降级都是为了实现跨浏览器和设备的可访问性和可用性。它们的主要区别在于关注点的不同。渐进增强从简单的基础版本开始,并根据现代浏览器和设备的能力逐步增加功能和样式。而优雅降级则从完整的功能和交互性出发,并通过提供替代方案来降低对旧版浏览器和不支持功能的设备的依赖。 无论选择哪种方法,目标都是提供一致且可访问的用户体验,同时尽可能地利用现代浏览器和设备的功能。开发人员应该根据目标用户、预算和项目需求来决定使用哪种策略或两者的结合方式。 ## 7.iframe 有哪些优点?哪些缺点?用它来解决过什么问题? 使用 `