前端面试官问『你会造火箭吗』,我答『会的』,结果…
面试造火箭
离职了找新工作,前端面试好不容易过了几轮,终于轮到终面了,内心紧张。面试官略微有距离感坐在对面,严肃的看着我。
面试官:据说你前面的几轮反馈都不错哦。
我:没有没有。要感谢前面的面试官的客气。
面试官:那开始了哦。你知道 Promise 怎么实现的吗?
我(内心想,你太小瞧我了):balabala,侃侃而谈,此处略去500字。
面试官:童鞋,那你知道 Webpack 的原理吗?
我(内心:还好有所准备,不然就挂了):balabala,此处省去吹牛逼800字。
面试官:那你知道从输入 url 地址到页面渲染出来,浏览器发生了什么吗?
我(内心:妈嘞,还好昨天晚上突击背诵了):balabala,此处略去经典答案1000字。
中间再经过六七个来回的问答,『模块化知道不』、『了解过事件循环机制吗』、『晓得 Babel 否』,不一一列举,还好自己不打无准备之仗。
但不知道为什么面试官随着我的对答如流,脸色已经由云淡风轻而变得越来越凝重。
最终面试官沉思了几十秒,抛出了一个意外的问题,『小伙子,你前面的问题都回答的还可以,但你会造火箭吗?』
我目瞪口呆,弱弱的问了句,『用 css 画的算吗』。
面试官看着我略微慌张的表情,嘴角扬起了不容易被人发现的笑。
我搜索找出了这样一张图。
问『可以是这样的火箭吗』,面试官不置可否,那我就只好用笔记本继续下去。
我是如何造火箭的
1. 搭建 🚀 初始结构
HTML 主体结构分为左中右三栏,🚀整体在屏幕居中
<div class="wrapper">
<div class="rocket">
<div class="body side left"></div>
<div class="body main"></div>
<div class="body side right"></div>
</div>
</div>
CSS 样式如下:
/* 全局样式 */
:root {
--rocket-size: 10vw;
--sky-color: #1C1740;
--rocket-color: #F9E2FE;
}
/* 背景样式 */
body {
display: flex;
overflow: hidden;
background-color: var(--sky-color);
}
/* 容器居中 */
.wrapper {
position: absolute;
top: 50%;
left: 50%;
will-change: transform;
transition: transform 0.4s ease;
transform: translate(-50%, -50%);
}
/* 火箭三列水平布局 */
.rocket {
display: flex;
}
/* 火箭三列通用样式 */
.rocket .body {
position: relative;
background-color: var(--rocket-color);
}
/* 火箭中列宽高 */
.rocket .main {
width: var(--rocket-size);
height: calc(var(--rocket-size) * 1.5);
}
/* 火箭边列宽高 */
.rocket .side {
width: calc(var(--rocket-size) / 3);
height: var(--rocket-size);
}
/* 火箭左列位置 */
.rocket .left {
margin-right: 10px;
}
/* 火箭右列位置 */
.rocket .right {
margin-left: 10px;
}
预览效果大致如下:
2. 润色 🚀主体
开始润色主体,新增以下样式:
:root {
...
--rocket-cap-color: crimson;
}
.rocket .body {
...
border-radius: 0 0 50% 50% / 76% 76% 15% 15%;
/* 为左中右三列的尾部都添加好圆角 */
}
/* 为左中右三列的突出部都添加好圆角 */
.rocket .body:before {
content: '';
position: absolute;
border-radius: 50% 50% 50% 50% / 76% 76% 25% 25%;
}
/* 火箭主体突出部的大小、位置 */
.rocket .main:before {
bottom: 80%;
width: 100%;
height: 75%;
background-color: inherit;
}
/* 火箭左右列突出部的大小、位置及颜色 */
.rocket .side:before {
bottom: 90%;
width: 100%;
height: 35%;
background-color: var(--rocket-cap-color);
}
预览效果大致如下:
3. 添加 🚀 Logo
/* 新增定义火箭 logo 颜色 */
:root {
...
--rocket-logo-color:
}
/* logo 的具体位置及样式 */
.rocket .main:after {
content: '';
position: absolute;
bottom: 75%;
left: 0;
right: 0;
margin: auto;
border: calc(var(--rocket-size) / 15) solid var(--rocket-logo-color);
width: calc(var(--rocket-size) / 1.8);
height: calc(var(--rocket-size) / 1.8);
box-shadow: inset rgba(0, 0, 0, 0.075) -2vw -2vw 0 0, inset rgba(0, 0, 0, 0.1) -1vw -1.5vw 0 0;
border-radius: 100%;
}
预览效果如下:
4. 添加 🚀 翅膀
在 dom .body.main 下面新增两个 dom,leftWing rightWing 分别对应左右翅膀。
<div class="wrapper">
<div class="rocket">
<div class="body side left"></div>
<div class="body main">
<div class="wing leftWing"></div>
<div class="wing rightWing"></div>
</div>
<div class="body side right"></div>
</div>
</div>
/* 添加火箭翅膀颜色 */
:root {
...
--rocket-wing-color: #4C3198;
}
/* 火箭左右两栏回到正确位置 */
.rocket .left {
/* margin-right: 10px; */
left: 1px;
}
.rocket .right {
/* margin-left: 10px; */
right: 1px;
}
/* 火箭翅膀的样式 */
.rocket .wing {
position: absolute;
bottom: 2vmin;
background-color: var(--rocket-wing-color);
width: calc(var(--rocket-size) / 2);
height: calc(var(--rocket-size) / 1.5);
z-index: 1;
box-shadow: inset rgba(0, 0, 0, 0.1) -0.5vmin 1vmin 1vmin 0, inset rgba(255, 255, 255, 0.1) 0.5vmin 1vmin 1vmin 0;
}
/* 火箭左翅膀位置 */
.rocket .wing.leftWing {
right: 100%;
border-radius: 100% 0 10% 10%;
}
/* 火箭右翅膀位置 */
.rocket .wing.rightWing {
left: 100%;
border-radius: 0 100% 10% 10%;
}
效果如下:
5. 添加 🚀 助推器
在 .rightWing 后面添加 <div class="booster"></div> 助推器
<div class="wrapper">
<div class="rocket">
<div class="body side left"></div>
<div class="body main">
<div class="wing leftWing"></div>
<div class="wing rightWing"></div>
<div class="booster"></div>
</div>
<div class="body side right"></div>
</div>
</div>
:root {
/* 助推器颜色 */
--rocket-booster-color: #C38382;
}
/* 助推器样式及位置 */
.rocket .booster {
position: absolute;
top: 80%;
left: 0;
right: 0;
margin: auto;
width: calc(var(--rocket-size) / 1.2);
height: calc(var(--rocket-size) / 2.5);
background-color: var(--rocket-booster-color);
border-radius: 0 0 50% 50% / 76% 76% 35% 35%;
z-index: -1;
box-shadow: inset rgba(0, 0, 0, 0.3) -0.5vmin 1vmin 1vmin 0, inset rgba(255, 255, 255, 0.3) 0.5vmin 1vmin 1vmin 0, black 0 0 2vmin;
}
预览效果如下:
6. 添加 🚀 尾巴 🔥
在 .booster 后面添加 <div class="fire"></div> 火焰
<div class="wrapper">
<div class="rocket">
<div class="body side left"></div>
<div class="body main">
<div class="wing leftWing"></div>
<div class="wing rightWing"></div>
<div class="booster"></div>
<div class="fire"></div>
</div>
<div class="body side right"></div>
</div>
</div>
添加火焰相关的 CSS
/* 火焰样式及动画 */
.rocket .fire {
position: absolute;
top: 100%;
left: 0;
right: 0;
margin: auto;
width: calc(var(--rocket-size) / 1.4);
height: 80%;
border-radius: 0 0 100% 100%;
background-image: linear-gradient(to bottom, yellow, transparent 70%);
z-index: -2;
transform-origin: 50% 0;
animation: fire 0.1s linear alternate infinite;
}
@keyframes fire {
to {
transform: scaleX(0.98) translateY(-1vmin);
}
}
大功告成,最终的效果如下:
整体效果可以通过 code pen demo: css only rocket (https://codepen.io/SunLn/pen/xxqaLRa) 预览。
面试结果
轮到我神气的看着面试官了,心想,『都这样了,等下Offer谈薪资的时候就轮到我霸道了』。
面试官这个时候也露出了迷之微笑,『小伙子造火箭有一手,但我司这庙小,只招拧螺丝的,你还是另谋高就吧』
我震惊了,时光仿佛停滞一般,沉默之后更是可怕的沉默。
再之后的事情唯一想说的是,健身房练就的一身力气真好使。
ps: 本文纯属虚构,希望面试官求职者和谐相处,共创美好社会。
如果有开心一下,希望点个赞。感恩。
作者:对马弹琴
推荐阅读:
恭喜你又在前端道路上进步了一点点。
点个“在看”和“赞”吧!