勇闯秋招提前批:面试中的css大盘点
在面试中,全面且有条理地回答问题是展现自己专业能力的重要方式。当感到有思路但难以清晰表达时,采用以下“三步走”策略来扩充回答,可以帮助更饱满地呈现想法。
1.xx是什么
2.xx的特点
3.xx的应用场景
一:说说你对盒子模型的理解
下面以这个问题为例,展示一下如何回答
- 是什么
- 盒子模型是浏览器在渲染页面时,会将浏览器渲染成包含content,padding,border,margin四部分的矩形
- 特点
- 标准盒模型:width = content
- IE盒模型: width = content + padding + border
- 应用场景
-
切换方法: box-sizing: content-box||border-box;
border-box: 转换为IE盒模型
content-box: 转换为标准盒模型(默认值)
-
二:css中的选择器有哪些?优先级?
- id选择器
#id
:选择具有指定 ID 的元素,ID 应该在一个文档中是唯一的 - 类选择器
.classname
:选择具有指定类的所有元素,一个元素可以拥有多个类 - 属性选择器
div[class="foo"]
:选择具有指定属性或属性值的元素 - 伪类选择器
div::last-child
:选择处于特定状态的元素,如第一个子元素、最后一个子元素等 - 标签选择器
div
:选择所有指定类型的元素 - 伪元素选择器
div:after
:选择元素的某个部分,如第一个字母或元素后面的内容 - 兄弟选择器
div+span
:选择紧接在另一个元素后的元素,且二者拥有共同的父元素 - 子选择器
ui>li
:选择作为指定父元素直接子元素的元素 - 后代选择器
div span
:选择作为指定祖先元素的后代元素 - 通配符选择器
*
:选择文档中的所有元素 - 群组选择器:使用逗号
,
分隔不同的选择器
优先级: !important > 行内样式 > id选择器 > 类选择器 > (属性选择器, 伪类选择器, 伪元素选择器, 后代选择器,子集选择器,兄弟选择器)>标签选择器 > 通配符选择器
三:说说em,rem,vw,vh,px 的区别?
-
css3之前:px, em, %
-
css3新增:rem, vw, vh
-
区别:
-
- px:绝对单位,不随浏览器的缩放比例而改
-
- em, % ,rem, vw, vh:相对单位,随浏览器的缩放比例而改
-
em
是相对于父元素的单位,会随着父元素变化而变化,rem
是相对于根元素html
,它会随着html
元素变化而变化
四:css中有哪些方式可以隐藏一个元素
display:none
:完全移除元素及其占据的空间。visibility:hidden
:隐藏元素,但保留其在页面布局中的空间。opacity:0
:设置元素的透明度为 0,元素变得完全透明,但仍然占用空间。position:absolute
:定位元素,使其相对于最近的非 static 定位的祖先元素进行定位,定位到可视区域以外width:0;height:0
:元素的水平尺寸和垂直属性变为 0clip-path:polygon(0px 0px,0px 0px)
:将元素全部裁剪掉,但仍占用空间
区别:
display:none
:无文档流,不触发事件,会触发回流重绘visibility:hidden
:有文档流,不触发事件,不会回流,会重绘opacity:0
:有文档流,会触发事件,不会回流,会重绘position:absolute
:无文档流,会触发事件,会触发回流重绘width:0;height:0
:无文档流,不触发事件,会触发回流重绘clip-path:polygon(0px 0px,0px 0px)
:有文档流,不触发事件,不会回流,会重绘
五:谈谈你对BFC的理解
BFC是块级格式上下文,是一种特殊的容器,拥有一套自己的渲染规则
规则:
- BFC容器,内部子容器依旧遵从块级,行内块,行内的排列
- BFC容器在计算高度时,会将浮动元素的高度也计算在内
- BFC容器的
margin-top
不会跟子容器的margin-top
重叠
触发条件:
- overflow:hidden || xxx
- folat: right || left
- display: table-xxx || inline-xxx || flex || grid
- position: absolute || fixed
应用场景:
- 清除浮动
- 防止margin重叠
六: 元素水平垂直居中的方法有哪些
-
已知父子容器宽高: 使用
margin: auto;
将元素水平居中;使用top: 50%; left: 50%; transform: translate(-50%, -50%);
将元素垂直居中。 -
未知父容器,已知子容器:
- 使用
margin: auto;
和calc()
函数结合,
margin: 0 auto; top: calc(50% - (element-height / 2));
-
使用
position: absolute;
和负margin
position: absolute; left: 50%; margin-left: -50px;
- 使用
position: absolute;
和 `margin: auto;
position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto;
- 使用
-
未知父子容器宽高:
- 使用
position: absolute;
和transform
position: absolute; top: 50%; left: 50%; transform:translate(-50%, -50%);
- 使用
display: flex;
和align-items: center; justify-content: center;
。 - 使用
display: grid;
和align-items: center; justify-content: center;
。 - 使用
display: table-cell;
和vertical-align: middle;
。
- 使用
七: 说说 flexbox
-
是什么 弹性布局是CSS中的一种简便高效的布局方式,它提供了强大的容器与子元素间的空间分配机制。弹性容器中有主轴(默认沿x轴)和交叉轴(默认沿y轴)的概念,可以通过属性调整这些轴的方向。
-
属性
-
父容器属性:
flex-direction
: 定义主轴的方向(默认为row
)。justify-content
: 控制主轴上的子元素对齐方式。align-items
: 控制交叉轴上的子元素对齐方式。align-content
: 当有多行子元素时,控制行之间的对齐方式。flex-wrap
: 决定子元素是否换行(默认为nowrap
)。
-
子容器属性:
order
: 定义子元素在容器中的顺序。flex-grow
: 定义子元素如何分配剩余空间。flex-shrink
: 定义子元素在空间不足时如何缩小。flex-basis
: 定义子元素在主轴上的初始大小。align-self
: 覆盖align-items
设置,让单个子元素自定义对齐方式。
-
-
应用场景
- 三栏布局
- 水平垂直居中
八: 如何实现三栏布局
- 使用弹性布局 (
flex
)
.container {
display: flex;
}
.column {
flex: 1;
border: 1px solid #ccc;
padding: 10px;
}
.middle {
flex: 2;
}
- 使用浮动(圣杯、双飞翼)
.container {
overflow: auto;
}
.column {
float: left;
width: 25%;
border: 1px solid #ccc;
padding: 10px;
}
.middle {
width: 50%;
}
.clearfix::after {
content: "";
display: table;
clear: both;
}
- 使用网格布局 (
grid
)
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.column {
border: 1px solid #ccc;
padding: 10px;
}
.middle {
grid-column: 2 / span 2;
}
- 使用表格 (
table
)
.table-layout {
display: table;
width: 100%;
}
.cell {
display: table-cell;
border: 1px solid #ccc;
padding: 10px;
}
.middle {
width: 50%;
}
- 使用定位 (
position
)
.container {
position: relative;
min-height: 100%;
}
.left, .right {
position: absolute;
width: 200px;
top: 0;
border: 1px solid #ccc;
padding: 10px;
}
.left {
left: 0;
}
.right {
right: 0;
}
.middle {
margin-left: 200px;
margin-right: 200px;
border: 1px solid #ccc;
padding: 10px;
}
九: CSS3 新增了哪些属性
-
border-radius
: 创建圆角边框。 -
box-shadow
: 为元素添加阴影效果。 -
border-image
: 为边框添加背景图片。 -
背景:
background-size
: 控制背景图像的大小。background-origin
: 控制背景图像的绘制范围。background-clip
: 控制背景图像的绘制范围。
-
动画:
transition
: 控制元素过渡效果。animation
: 控制元素动画效果。@keyframes
: 定义动画的关键帧。
-
transform
: 控制元素变形,包括2D和3D变换。 -
渐变:
linear-gradient
: 线性渐变。radial-gradient
: 径向渐变。
-
布局:
flex
: 弹性布局。grid
: 网格布局。
-
其他:
text-shadow
: 为文本添加阴影效果。box-sizing
: 控制元素的盒子模型。filter
: 为元素添加各种视觉效果,如模糊、灰度、饱和度等。backdrop-filter
: 为元素背后的元素添加滤镜效果。mask
: 使用蒙版遮罩效果。mix-blend-mode
: 混合模式,控制元素与其背后内容的混合方式。will-change
: 提前优化性能,准备动画效果。
十: CSS画一个三角形,梯形
-
三角形
- 使用伪元素和边框,通过设置宽度和高度为0,以及不同的边框宽度来形成三角形。
- 使用
clip-path
,利用polygon()
函数裁剪出三角形形状。
.triangle-down {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
-
梯形
- 使用伪元素和边框,调整不同边框宽度和颜色来形成梯形。
- 使用
clip-path
,利用polygon()
函数裁剪出梯形形状。
.trapezoid {
width: 100px;
height: 50px;
background-color: blue;
overflow: hidden;
}
.trapezoid:before {
content: "";
display: block;
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 50px solid white;
position: relative;
top: -50px;
}
十一: 画一个0.5px的线
- 缩放 (
transform: scaleY(0.5);
) - SVG (
<line>
元素和 CSS 样式) - CSS Gradients (利用背景色渐变模拟细线效果)
转载自:https://juejin.cn/post/7398378565182832666