前幾日去B站面試了一次前端,不算資深B站用戶,日常也蠻喜歡在B站觀看視頻的,能得到這樣的面試機會,實在是受寵若驚。但無奈實力有限加上雜事纏身,並無作好充足的準備,致使面試失敗。javascript
(ps:屬實仍是有點緊張,發揮也受到影響)css
此次面試過程我思前想後以爲有必要總結一下,但願本身下次再有這樣的機會的時候可以把握的更好。html
因內容比較多,因此準備可能分多篇博客更新內容,這裏給出傳送門前端
ps:這是大綱,後續可能有變化。好比服務器端知識,我沒有接觸過,面試官就沒問,但確實是面試過程當中的一個大類的問題。vue
面試過程總體感受很舒服,面試官頗有耐心,面試題由淺入深,面試打分的話,我會給5顆星。java
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style> * { margin: 0; padding: 0; } html, body, #app { margin: 0; padding: 0; height: 100%; } #header, #footer { height: 50px; line-height: 50px; text-align: center; background: #555; color: #fff; } #side { width: 200px; background: #eee; } /* css here */ </style>
</head>
<body>
<div id="app">
<header id="header">header</header>
<aside id="side">side</aside>
<div id="main">
<ul>
<li><a href="https://www.bilibili.com/1">Link1</a></li>
<li><a href="https://www.bilibili.com/1">Link2</a></li>
<li><a href="https://www.bilibili.com/1">Link3</a></li>
<br>
<li><a href="https://www.bilibili.com/1">Link4</a></li>
<li><a href="https://www.bilibili.com/1">Link5</a></li>
</ul>
</div>
<footer id="footer">footer</footer>
</div>
<script> // JS here </script>
</body>
</html>
複製代碼
不考慮兼容性且不能更改dom結構,需求以下:react
這道面試題是基礎題,我應該要多向面試官展現一下個人基本功,同時也要告訴面試官,我是有關注前端最新的動態的,既然不考慮兼容性,我得先用 Grid 的方案實現一遍,而後在告訴面試官我大概還有108種不一樣的解法,😃哈哈哈...。而後 Grid 除了 display: grid 外,很久沒有寫了,我都忘記的差很少了吧。在思考 Grid 的時候,時間浪費了過久,我得趕忙找個簡單的寫法先提交,否則基礎題都得作這麼久,印象確定不行。css3
/** * calc 是 css的一個函數 * 不明白的同窗我附上連接 * https://developer.mozilla.org/zh-CN/docs/Web/CSS/calc */
#side {
/* 設置 側邊欄 左浮動 */
float: left;
height: calc(100% - 100px);
}
#main {
height: calc(100% - 100px);
}
複製代碼
#app {
/* 父級元素 設置 相對定位 */
position: relative;
}
#side {
/* 左邊欄 設置 絕對定位 */
position: absolute;
top: 50px;
bottom: 50px;
left: 0;
}
#main {
/* 內容區 設置 絕對定位 */
position: absolute;
top: 50px;
right: 0;
bottom: 50px;
left: 200px;
}
#footer {
/* footer 設置 絕對定位 */
position: absolute;
bottom: 0;
width: 100%; /* 設置浮動後,補上寬度 */
}
複製代碼
❌受限於沒法更改 DOM 結構,我以爲難以使用 Flex 去實現這個需求。或者請求高人指點一二。web
晚上吃飯的時候忽然有了 Flex 解決這個問題的思路,感謝評論區同窗給的幫助。面試
#app {
display: flex;
flex-wrap: wrap;
}
#header {
flex-basis: 100%;
}
#side {
height: calc(100% - 100px);
}
#main {
flex: 1;
height: calc(100% - 100px);
}
#footer {
flex-basis: 100%;
}
複製代碼
參考資料
本文不贅述Grid的全部內容,有須要的朋友能夠傳送門詳細瞭解。下面我會介紹我用到的部分。
#app {
/* app 爲 grid 佈局的容器,因此在此處建立 grid 佈局 */
display: grid;
/** 這是一種縮略的寫法 等價於 grid-template-rows: 50px auto 50px; grid-template-columns: 200px auto; 建立了一個 3 * 2 的格子 高度是 50px 自動 50px 寬度是 200px 自動 */
grid: 50px auto 50px / 200px auto;
}
/* 這個時候其實打開頁面看着很奇怪,header 縮在角落,等等 */
#header, #footer {
/** -*- 重要 -*- 下面的寫法 等價於 grid-column-star: 1; grid-column-end: 3; 該 grid 的子項 開始與 第一根 column 線 結束與 第三根 column 線 */
grid-column: 1 / 3;
}
複製代碼
#app {
display: grid;
/** 等價於 grid-template-rows: 50px auto 50px; grid-template-columns: 200px auto; grid-template-areas: "header header" "side main" "footer footer"; 注意: 每一 row 只是一個字符串 */
grid: "header header" 50px "side main" auto "footer footer" 50px / 200px auto;
}
#header {
/* 注意: header 沒有雙引號 */
grid-area: header;
}
#footer {
grid-area: footer;
}
複製代碼
取消 · 沒有難度。這個題目的難點就在這個 br 標籤,原本能夠直接使用 flex 佈局,如今的話看狀況應該只能使用 inline 或者 inline-block 的方式進行水平排列了。加豎線能夠用僞類選擇器和僞類元素選擇器組合實現,可是我忘記了 :nth-of-type 僞類選擇器。
ul {
/* 去掉 · */
list-style: none;
}
ul li {
/* 水平排列,兩個都行*/
display: inline;
/* display: inline-block; */
}
複製代碼
當時最後一個加豎線的需求,我是這樣寫的。
/* 僞類選擇器 + 僞類元素選擇器 */
ul li:nth-child(2n)::after {
content: '|';
}
複製代碼
可是隻有 Link2 Link5 後面會出現 "|",由於 br 標籤的緣故,失敗。
但只須要稍加修改就能夠完成,但面試的時候沒有完成。
/* 僞類選擇器 + 僞類元素選擇器 */
ul li:nth-of-type(2n)::after {
content: '|';
}
複製代碼
後來詢問了面試官這個應該如何解決,得知能夠考慮兄弟選擇器試試。
TODO: 我目前尚未想出來如何處理。Help!
沒啥好說的。把事件綁定在父元素上,節約內存。考察點就是原生dom的一些操做吧。
document.querySelectorAll('ul')[0].addEventListener('click',event => {
if(event.target.tagName === 'A') {
event.preventDefault(); // 阻止默認行爲
alert(event.target.getAttribute('href'));
}
});
複製代碼