一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
引言
本文对CSS中一些重要问题进行整理汇总。本文章节结构以从易到难进行组织,建议读者按章节顺序进行阅读。希望读者读完本文,有一定的启发思考,也能对自己的CSS掌握程度有一定的认识,对缺漏之处进行弥补,对CSS有更好的掌握。
笔者也会站在面试者的角度对下述问题进行回答,并加以适当的分析。
1. 谈谈CSS盒模型有哪几种
CSS盒模型主要分为标准盒子模型和IE盒子模型,两种盒模型的内容宽度是不同的:
标准盒子模型:内容宽度 = content
IE盒子模型: 内容宽度= content + border + paddin
2. 谈谈CSS选择器的优先级顺序
带!important 标记的样式属性优先级最高; 样式表的来源相同时:!important > 行内样式>ID选择器 > 类选择器 > 标签 > 通配符 > 继承 > 浏览器默认属性
3.谈谈你对BFC的理解
BFC直译为块级格式化上下文,具有BFC特性的元素可以看做是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且BFC具有普通容器所没有的的一些特性。通俗一点来讲,可以把BFC理解为一个封闭的大箱子,箱子内部的元素无论如何翻江倒海,都不会影响到外部。
形成BFC的条件
- 只要元素满足下面任一条件即可触发BFC特性:
- body 根元素
- 浮动元素:float 除 none 以外的值
- 绝对定位元素:position (absolute、fixed)
- display 为 inline-block、table-cells、flex
- overflow 除了 visible 以外的值 (hidden、auto、scroll)
BFC常见作用
- 清除浮动
- 去除边距重叠现象
4.隐藏页面中某个元素的方法
1.visibility:hidden不会改变页面布局,在文档布局中仍保留原来的空间会引起重绘
2.display:none会改变页面布局,在文档布局中不再分配空间会引起回流+重绘
3.opacity:0该元素隐藏起来了,但不会改变页面布局,并且,如果该元素已经绑定 一些事件,如click 事件,那么点击该区域,也能触发点击事件的
5.谈谈你对重排和重绘的理解
- 重排:一般来讲修改元素的宽度,高度等影响元素位置的几何属性均会引起重排
- 重绘:一般来讲如果修改元素的颜色或者背景颜色均会引发重绘
通常使用以下两种方式减少重排和重绘,以达到性能优化的目的:
- 最小化重绘和重排,比如样式集中改变,使用添加新样式类名
.class或cssText。 - 使用
**absolute**或**fixed**使元素脱离文档流,这在制作复杂的动画时对性能的影响比较明显。
6. 谈谈如何用纯CSS画一条0.5px的直线
<div class="half"></div>
<style>
.half {
width: 300px;
background-color: #000;
height: 1px; transform: scaleY(0.5); /* 延Y轴缩小1倍 */
transform-origin: 50% 100%; /* 改变元素变形的原点 *
}
</style>
7. 谈谈如何用纯CSS创建一个三角形
<div class="content"></div>
<style>
.content {
width: 0;
height: 0;
border: 20px solid;
border-color: transparent transparent transparent pink; // 对应上右下左,此处为 左 粉色
}
</style>
8. 谈谈如何使用CSS垂直居中
使用绝对定位和transform(适用于不知道内盒子宽高)
<div id="box">
<div id="child"/>
</div>
#box {
width: 300px;
height: 300px;
background: #ddd;
position: relative;
}
#child {
background: orange;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
使用绝对定位和margin(适用于知道内盒子宽高)
<div id="box">
<div id="child"/>
</div>
#box {
width: 300px;
height: 300px;
background: #ddd;
position: relative;
}
#child {
width: 300px;
height: 300px;
background: orange;
position: absolute;
top: 50%;
left: 50%;
margin-left: -150px;
margin-top: -150px;
}
使用flex布局(适用于任何情况)
<div id="box">
<div id="child"/>
</div>
#box {
display: flex;
background: #ddd;
}
#child {
align-items: center;
justify-content: center;
background: orange;
}
9. 实现两栏布局
利用浮动
<div id="outer">
<div id="left">左侧</div>
<div id="right">右侧</div>
</div>
#outer {
height: 100px;
}
#left {
float: left;
width: 200px;
height: 100%;
background: lightcoral;
}
#right {
margin-left: 200px;
height: 100%;
background: lightseagreen;
}
利用 flex 布局
<div id="outer">
<div id="left">左侧</div>
<div id="right">右侧</div>
</div>
#outer {
display: flex;
height: 100px;
}
#left {
width: 200px;
height: 100%;
background: lightcoral;
}
#right {
flex: 1;
height: 100%;
background: lightseagreen;
}
利用绝对定位
<div id="outer">
<div id="left">左侧</div>
<div id="right">右侧</div>
</div>
#outer {
position: relative;
height: 100px;
}
#left {
position: absolute;
width: 200px;
height: 100%;
background: lightcoral;
}
#right {
margin-left: 200px;
height: 100%;
background: lightseagreen;
}
复制代码
10. 实现圣杯布局和双飞翼布局(三分栏布局)
圣杯布局和双飞翼布局的目的:
- 三栏布局,中间一栏最先加载和渲染(内容最重要,这就是为什么还需要了解这种布局的原因)。
- 两侧内容固定,中间内容随着宽度自适应。
圣杯布局
<div id="container" class="clearfix">
<p class="center"></p>
<p class="left"></p>
<p class="right"></p>
</div>
#container {
padding-left: 200px;
padding-right: 150px;
overflow: auto;
}
#container p {
float: left;
}
.center {
width: 100%;
background-color: lightcoral;
}
.left {
width: 200px;
position: relative;
left: -200px;
margin-left: -100%;
background-color: lightcyan;
}
.right {
width: 150px;
margin-right: -150px;
background-color: lightgreen;
}
.clearfix:after {
content: "";
display: table;
clear: both;
}
双飞翼布局
<div id="main" class="float">
<div id="main-wrap">main</div>
</div>
<div id="left" class="float">left</div>
<div id="right" class="float">right</div>
.float {
float: left;
}
#main {
width: 100%;
height: 200px;
background-color: lightpink;
}
#main-wrap {
margin: 0 190px 0 190px;
}
#left {
width: 190px;
height: 200px;
background-color: lightsalmon;
margin-left: -100%;
}
#right {
width: 190px;
height: 200px;
background-color: lightskyblue;
margin-left: -190px;
}
推荐
如果有想要继续学习浏览器篇的读者,可以观看笔者的另一篇文章【面试宝典】高频前端面试题之浏览器篇 - 掘金 (juejin.cn)
如果有想要继续学习Vue原理篇的读者,可以观看笔者的另一篇文章【面试宝典】高频前端面试题之Vue原理篇 - 掘金 (juejin.cn)
如果有想要继续学习JS原理篇的读者,可以观看笔者的另一篇文章【面试宝典】高频前端面试题之JavaScript原理篇 - 掘金 (juejin.cn)
如果有想要继续学习手写JS常用方法的读者,可以观看笔者的另一篇文章【面试宝典】高频前端面试题之手写常用JS方法 - 掘金 (juejin.cn)
结语
本文为笔者个人学习笔记,如有谬误,还请告知,万分感谢!如果本文对你有所帮助,还请点个关注点个赞~,您的支持是笔者不断更新的动力。