紧跟潮流
大前端和全栈是以后前端的一个趋势,懂后端的前端,懂各端的前端更加具有竞争力,以后可以往这个方向靠拢。
这边整理了一个对标“阿里 50W”年薪企业高级前端工程师成长路线,由于图片太大仅展示一小部分
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
height: 200px;
background: rgb(68, 133, 255);
}
初始页面展示效果
![](https://img-blog.csdnimg.cn/08aad90286d641f58ccaaebf2da2d389.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YmN56uv5LiN6YeK5Y23bGVv,size_20,color_FFFFFF,t_70,g_se,x_16)
现在,使用浮动(float),使左边跟右边并列布局
页面展示效果
![](https://img-blog.csdnimg.cn/4b280e7f48994f799fef52b5e8d3a4df.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YmN56uv5LiN6YeK5Y23bGVv,size_20,color_FFFFFF,t_70,g_se,x_16)
此时,再将右边的宽度通过 calc() 方法计算,实现右边自适应
![](https://img-blog.csdnimg.cn/3882c19f38bd4d31a29d9ba319bf1c6f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YmN56uv5LiN6YeK5Y23bGVv,size_20,color_FFFFFF,t_70,g_se,x_16)
缩小窗口,查看效果
![](https://img-blog.csdnimg.cn/50a21cf5c65743ca9143e0b400a7202c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YmN56uv5LiN6YeK5Y23bGVv,size_20,color_FFFFFF,t_70,g_se,x_16)
此时,实现了场景一的需求,效果看起来也还OK。但是有个问题,现在的这个布局使用的是浮动,即代表着这两个块脱离了文档流,如果页面有其他布局区域,如头部导航栏、底部关于栏、甚至是其他主内容区,这时候我们可能就需要花点时间去清除浮动带来的影响,或者是增加更多的浮动来完成其他区域的布局。
那么有没有一种布局是既可以不使用浮动(或者说是不脱离文档流),又能实现上面的布局呢?答案是肯定的,可以使用Flex(弹性布局),且写起来也更简便。
现在,我们将浮动样式去掉,在包含左右两个盒子的父盒子加上 display:flex,表示使用弹性布局
此时查看页面效果
![](https://img-blog.csdnimg.cn/45933a73d5f1468893373669939b02db.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YmN56uv5LiN6YeK5Y23bGVv,size_20,color_FFFFFF,t_70,g_se,x_16)
实现右边部分自适应只需要为右边添加样式 flex:1 即可
.right-content {
box-sizing: border-box;
width: 200px;
height: 200px;
background: rgb(68, 133, 255);
/* 表示该盒子自动占满剩余空间(往下展开) */
flex: 1;
}
![](https://img-blog.csdnimg.cn/b6ec4db0e9a04c7b8257fd1a99498114.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5YmN56uv5LiN6YeK5Y23bGVv,size_20,color_FFFFFF,t_70,g_se,x_16)
此时左右两个盒子并列布局,且右边自适应,why?以下详细展开。
#### **flex-direction**
`flex-direction`属性决定主轴的方向,即项目(或者说是子盒子)的排列方向。
它可能有4个值。
>
> * `row`(默认值):主轴为水平方向,起点在左端。
> * `row-reverse`:主轴为水平方向,起点在右端。
> * `column`:主轴为垂直方向,起点在上沿。
> * `column-reverse`:主轴为垂直方向,起点在下沿。
>
>
>
布局图示
![](https://img-blog.csdnimg.cn/img_convert/6789461ff6ff5e3f5589974b6ded0b7b.png)
上面例子不设置该属性,因此为默认值(row),即主轴水平、从左到右排列。
#### **场景二**
整个页面分为多个部分,我们希望这些部分是并列布局,且宽度自适应。
页面布局如下(以三个部分举例,若更多部分做法一致)
初始样式(同样,父盒子使用flex布局)
<style>
.main-content {
width: 100%;
height:100%;
background: #72f884;
/* 使用flex弹性布局 */
display: flex;
}
.left-content {
box-sizing: border-box;
width: 200px;
height: 200px;
background: rgb(238, 119, 34);
}
.middle-content {
box-sizing: border-box;
width: 200px;
height: 200px;
background: rgb(173, 40, 250);
}
.right-content {
box-sizing: border-box;
width: 200px;
height: 200px;
background: rgb(68, 133, 255);
}
</style>
初始页面效果
现在,我们三个子盒子的宽度是固定的,因此实现不了自适应,我们可以使用 %(百分比)方式设置各个子盒子相对于父盒子所占的百分比
<style>
.left-content {
box-sizing: border-box;
/* 宽度使用 % ,实现自适应 */
width: 30%;
height: 200px;
background: rgb(238, 119, 34);
}
.middle-content {
box-sizing: border-box;
/* 宽度使用 % ,实现自适应 */
width: 40%;
height: 200px;
background: rgb(173, 40, 250);
}
.right-content {
box-sizing: border-box;
/* 宽度使用 % ,实现自适应 */
width: 30%;
height: 200px;
background: rgb(68, 133, 255);
}
</style>
页面展示效果
缩小查看页面展示效果
注意观察,此时三个子盒子的宽度总和等于父盒子的宽度,即30% + 40% + 30% = 100%。
如果三个盒子的宽度占比总和小于100%,即都为30%,页面效果如下
此时页面会多出空的部分,我们可以将这部分利用起来。
justify-content
该属性定义了项目在主轴上的对齐方式。
它可能取5个值,具体对齐方式与轴的方向有关。下面假设主轴为从左到右。
此时主轴(flex-direction
)为默认的row,即水平方向,从左到右。
flex-start
(默认值):左对齐(即上面页面展示效果)flex-end
:右对齐center
: 居中space-between
:两端对齐,项目之间的间隔都相等。space-around
:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
接下来我们一一展示属性达成的效果
flex-start
如上图
flex-end
center
space-between(注意空白部分分配情况)
space-around(注意空白部分分配情况)
以上就是justify-content不同取值的布局效果,最后两个取值就是如何分配剩余的空白部分。
还有一个与justify-content相似的属性是align-items。
align-items
该属性定义项目在交叉轴上如何对齐。(如果主轴为水平,那么交叉轴就是垂直)
它可能取5个值。具体的对齐方式与交叉轴的方向有关,下面假设交叉轴从上到下。
flex-start
:交叉轴的起点对齐。flex-end
:交叉轴的终点对齐。center
:交叉轴的中点对齐。baseline
: 项目的第一行文字的基线对齐。stretch
(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
**flex-start**、**flex-end**、**center与**
justify-content中展示效果类似,只是一个是水平方向一个是垂直方向。各属性布局效果如下:
回到场景二,如果三个盒子的宽度占比总和大于100%,页面效果又是怎样的?
<style>
.left-content {
box-sizing: border-box;
/* 宽度使用 % ,实现自适应 */
width: 40%;
height: 200px;
background: rgb(238, 119, 34);
}
.middle-content {
box-sizing: border-box;
/* 宽度使用 % ,实现自适应 */
width: 40%;
height: 200px;
background: rgb(173, 40, 250);
}
.right-content {
box-sizing: border-box;
/* 宽度使用 % ,实现自适应 */
width: 30%;
height: 200px;
background: rgb(68, 133, 255);
}
</style>
现在,调整父盒子的宽度为1000px
如果子盒子为40%,宽度理应为400px,但是有下图可知,宽度小于400px了
此时宽度被压缩了,其实此时是按照比例缩小了,由之前的按照100份来占比,现在相当于按照1100份来占比(40% 40% 30%),此时的宽度就是1000 * (40/110) 大概就是363.64。
那如果我们就想宽度是那么多,不能有误差,该怎么办呢?
flex-wrap
默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap
属性定义,如果一条轴线排不下,如何换行。在宽度总和超出父盒子的宽度时,希望保持每个子盒子的准确宽度,那就只能分行排列(一行排列会被按比例压缩,如上图)。
它可能有3个值。
nowrap
(默认值):不换行。wrap
:换行。wrap-reverse
:换行,第一行在下方。
分别对应以下图
此时设置flex-wrap:wrap,允许换行
.main-content {
width: 100%;
height:100%;
background: #72f884;
/* 使用flex弹性布局 */
display: flex;
/* 使用flex-wrap,wrap为允许换行,nowrap为不允许换行 */
flex-wrap: wrap;
}
再次查看页面展示效果
换行之后子盒子的宽度正常,不被压缩了。
场景三
现在希望将场景一与场景二结合,即在一个页面中分为左右两大部分,左边部分是菜单栏(宽度固定200px);右边部分是内容展示区,宽度自适应且占满,内容展示区里面又分为三部分,每个部分宽度为该区域的30%。
1、搭建左右两大部分
html
读者福利
========
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
由于篇幅过长,就不展示所有面试题了,想要完整面试题目的朋友(另有小编自己整理的2024大厂高频面试题及答案附赠)