臨近2019年的尾聲,是否是該爲了更好的2020年再戰一回呢? ‘勝敗兵家事不期,包羞忍恥是男兒。江東子弟多才俊,捲土重來未可知’,那些在秋招失利的人,難道就心甘情願放棄嗎!javascript
此文總結2019年以來本人經歷以及瀏覽文章中,較熱門的一些面試題,涵蓋從CSS到JS再到Vue再到網絡等前端基礎到進階的一些知識。css
總結面試題涉及的知識點是對本身的一個提高,也但願能夠幫助到同窗們,在2020年會有一個更好的競爭能力。html
Javascript篇
- juejin.cn/post/684490…Es6篇
- juejin.cn/post/684490…Vue篇
- juejin.cn/post/684490…'流'是css的一種基本定位和佈局機制,HTML默認的佈局機制就是'流佈局',是一種自上而下(例如塊級元素div),從左到右(例如內聯元素span)排列的佈局方式前端
元素按照盒模型的規則在頁面中進行佈局,它是由content+ margin + border + padding
組成java
盒模型能夠分爲兩種:css3
Css中默認的盒模型是W3C盒模型,二者間的轉換能夠經過設置屬性box-sizing
來轉換web
box-sizing: content-box; // W3C盒模型標準
box-sizing: border-box; // IE盒模型標準
複製代碼
content這個屬性常常被忽略,它顧名思義就是內容了,對於div等非替換元素來看,其content
就是div
內部的元素。而對於替換元素,其content
就是可替換的部分面試
content 常在僞元素中出現,做用是在css中直接生成可在網頁中顯示的內容 <!-- 假設咱們要在這段內容後面再加一點內容 --> <h1>I am Title!</h1> h1:after { content:'I am content!'; } <!-- 將會渲染出 I am Title!I am content! --> 複製代碼
❗ 瀏覽器兼容性問題:在IE5.X,IE6中,爲float的盒子指定margin時,左側margin可能會變成兩倍的寬度,經過改用padding或者指定盒子爲display:inline就能夠解決算法
BFC(block formatting context)是一個獨立的容器,決定了該容器中的內容應該如何進行定位,以及與其餘容器之間的相互做用。canvas
一個頁面是有多個box(盒子)
組成,每個box
的類型和display屬性決定了這個box
的內部佈局方式
不一樣類型的 box
,會參與不一樣的 Formatting Context(決定如何渲染文檔的容器)
,所以box
內的元素會以不一樣的方式渲染,因此在一個BFC中,內部的元素不會影響到外部的元素
1 - 根元素 → 根元素(html)就是最大的BFC 2 - position設置爲 fixed 或者 absolute 3 - display設置爲 inline-block 、table-block 、 table-caption 4 - overflow的值不爲visible(默認) 5 - float的值不爲none(默認) 複製代碼
1 - 內部的box會在垂直方向上一個接一個的擺放
2 - box垂直方向的距離由margin決定,屬於同一個BFC中的兩個相鄰box的margin會重疊(注意是垂直方向上)
3 - BFC中每一個元素的左邊margin會與包含塊的左邊border相接觸
4 - 計算BFC的高度時,浮動元素也會參與計算
複製代碼
css選擇器有: - id選擇器 - 類選擇器 - 標籤 - 相鄰選擇器(h1+p) - 子選擇器(ul>li) - 後代選擇器(li a) - 通配符選擇器(*) - 屬性選擇器(a[rel = "XXX"]) - 僞類選擇器( :hover :first-child ···) - 僞元素選擇器( :before :after ···) - 分組選擇器 可繼承的樣式:font-size, font-family, color,ul,li,dl,dt,dd; 不可繼承的樣式:border, padding, margin, width, height 複製代碼
!important > 內聯style > id > class > tag
優先級算法:
1 - 同權重狀況下樣式定義最近者爲準(優先級相同,選擇最後出現的樣式)
2 - 元素選擇符的權值:元素標籤(派生選擇器):1,class選擇符:10,id選擇符:100,內聯樣式權值最大,爲1000
3 - 繼承獲得的樣式的優先級最低
複製代碼
通常狀況下 - !important > 內聯style > ID選擇器 > 類選擇器 > 標籤選擇器 > 通配符選擇器
但遇到這幾種選擇器同時做用於一個元素時,元素又是如何選擇樣式呢?
關於權重計算,有兩種方式
各選擇器全值總覽
內聯style
,權值:1000ID選擇器
,權值:0100類選擇器
,權值:0010標籤選擇器 & 僞元素選擇器
,權值:0001通配符、子選擇器、相鄰選擇器等
,權值:0000若是層級相同,則向後比較,層級不一樣時,層級高的權重大
x:first-of-type → 選擇屬於其父元素的首個 <x> 元素的每一個 <x> 元素
x:last-of-type → 選擇屬於其父元素的最後一個 <x> 元素的每一個 <x> 元素
x:only-of-type 選擇屬於其父元素惟一的 <x> 元素的每一個 <x> 元素
x:only-child 選擇屬於其父元素的惟一子元素的每一個 <x> 元素
x:nth-child(1) 選擇屬於其父元素的第一個子元素的每一個 <x> 元素
:enabled 每一個已啓用的元素(多用於表單元素 例如input)
:disabled 控制表單控件的禁用狀態
:checked,單選框或複選框被選中
:before在元素以前添加內容(可用來作清除浮動)
:after在元素以後添加內容
複製代碼
僞類選擇元素基於的是當前元素處於的狀態,或者說元素當前所具備的特性
而不是元素的di、class、屬性等靜態的標籤
因爲狀態是動態變化的,因此一個元素達到一個特定狀態時,他可能獲得僞類的樣式;當狀態改變時,他又失去這個樣式。
由此能夠看出,他的功能和class有些相似,但它是基於文檔以外的抽象,因此叫僞類
(:first-child :link :visitive :hover :focus :lang)
僞元素:
與僞類針對特殊狀態的元素不一樣的是,僞元素對元素中的特定內容進行操做,
它所操做的層次比僞類更深一層,
也所以它的動態性比僞類要低得多。它控制的內容實際上和元素是相同的,
可是它自己只是基於元素的抽象,並不存在於文檔中,因此叫僞元素
(:first-line :first-letter :befoe :after)
複製代碼
value | describe |
---|---|
none | 元素會被隱藏,不顯示 |
inline | 元素會被設置爲內聯元素,內部按行從左向右排列(元素先後沒有換行符) |
block | 元素會被設置爲塊級元素,內部按列從上向下排列(元素先後帶有換行符) |
inline-block | 元素會被設置爲行內塊級元素,不會獨佔一行的塊級元素 |
list-item | 元素會做爲列表顯示 |
table | 元素會做爲塊級表格來顯示(相似table),表格先後帶有換行符 |
flex | 元素會進入flex佈局模式 |
block
塊級元素特色:
1 - 每一個塊級元素都重新的一行開始,而且其後的元素也另起一行。(一個塊級元素獨佔一行)
2 - 元素的高度、寬度、行高以及頂和底邊距均可設置。
3 - 元素寬度在不設置的狀況下,是它自己父容器的100%(和父元素的寬度一致),除非設定一個寬度。
inline
內聯元素特色:
1 - 和其餘元素都在一行上;
2 - 元素的高度、寬度及頂部和底部邊距不可設置;
3 - 元素的寬度就是它包含的文字或圖片的寬度,不可改變。
inline-block
內聯塊狀元素(inline-block)就是同時具有內聯元素、塊狀元素的特色。
inline-block 元素特色:
1 - 和其餘元素都在一行上;
2 - 元素的高度、寬度、行高以及頂和底邊距均可設置。
複製代碼
問題 兩個display:inline-block
元素放到一塊兒時會產生一段空白。
緣由 元素被當成了行內元素排版的時候,元素之間的空白符(空格、回車換行等)都會被瀏覽器處理,根據CSS中white-space
屬性默認是normal(合併多餘空白)
,原來HTML代碼中的回車換行符被轉換成一個空白符
,在字體不爲0的狀況下,空白符佔據必定寬度,因此inline-block
的元素之間就會出現空白間隙
解決方式
1 - 將子元素標籤的結束符和下一個標籤的開始符寫在同一行 <div> <div> 左 </div><div> 右 </div> </div> 2 - 父元素中設置font-size:0, 在子元素上設置正確font-size 3 - 爲子元素設置float:left 複製代碼
1. width肯定,使用margin實現:margin:0 auto
2. 絕對定位 + margin-left:負寬度/2 (前提父元素設置相對定位)
{
width:100px;
position:absolute;
left:50%;
margin-left:-50px
}
複製代碼
1. display:table + margin左右auto
2. display:inline-block + text-align:center
3. 絕對定位 + transform
{
position: absolute;
left: 50%;
transform: translateX(-50%);
}
4. 萬能flex佈局(我的推薦)
{
display:flex;
justify-content:center;
}
複製代碼
line-height
適合純文字類內容居中相對定位
,子元素設置絕對定位
,標籤經過margin
實現自適應居中{
display:flex;
align-items:center;
}
複製代碼
相對定位
,子元素設置絕對定位
,經過transform
實現居中display:table
+ 子元素設置vertical-align:middle
{
display:flex;
justify-content:center;
align-items:center;
}
複製代碼
父元素
{
position:relative;
}
子元素
{
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
複製代碼
父元素
{
position: relative;
}
子元素
{
width: 100px;
height: 100px;
position: absolute;
left: 50%;
top: 50%;
margin-left: -50px;
margin-top: -50px;
}
複製代碼
margin:auto
實現垂直水平居中(寬高已知)父元素
{
position: relative;
}
子元素
{
width: 100px;
height: 100px;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
}
複製代碼
position屬性共有5和屬性值,分別以下
relative
相對定位,相對於自身位置進行定位不少人不明白相對於自身位置是什麼意思,其實能夠這樣理解:
將自己當前位置固定住,以此位置進行定位
複製代碼
absolute
絕對定位,相對於position
不爲static
的第一個父級元素進行定位fixed
固定定位。相對於瀏覽器窗口進行定位inherit
繼承父級元素position
屬性值static
默認值,即沒有定位,仍爲文檔流對於position,須要注意的是absolute
究竟是相對於哪個父級進行定位
css3
新增了一個新的定位屬性 - sticky
,做用相似於relative
和fixed
. 元素在跨越特定閾值前爲相對定位,跨越以後爲固定定位。
浮動佈局 - 當元素設置了浮動後,能夠向左向右移動,直到它的外邊緣碰到包含它的框或者另一個浮動元素的邊框爲止。
浮動元素脫離了正常文檔流,能夠想象成浮動元素浮在了正常文檔流上方,文檔流再也不有這個元素存在
在圖文混排的場景下十分適用,能夠實現文字環繞圖片的效果,當元素浮動後,它有着塊級元素的特色(可設置寬高),但它與inline-block
存在差異
float
能夠在橫向排序上設置方向,而inline-block
不可inline-block
會出現存在空白間隙狀況float
導致元素脫離文檔流,若父元素高度自適應,則會引發父元素高度塌陷
<div class="Parent"> <div class="Float"></div> </div> 設置 .Parent:after僞元素 .Parent:after{ /* 設置添加子元素的內容是空 */ content: ''; /* 設置添加子元素爲塊級元素 */ display: block; /* 設置添加的子元素的高度0 */ height: 0; /* 設置添加子元素看不見 */ visibility: hidden; /* 設置clear:both */ clear: both; } 複製代碼
overflow
屬性,或者設置高度(原理是觸發父元素BFC)<div class="Parent" style="overflow:hidden">//auto 也能夠 <div class="Float"></div> </div> 複製代碼
<div class="Parent"> //添加額外標籤而且添加clear屬性 <div style="clear:both"></div> <div class='Float'></div> </div> 複製代碼
▲ 注意:設置元素浮動後,該元素的display值會變爲block
- display:規定元素應該生成的框的類型(子元素的排序方式) - position:規定元素的定位類型 - float:定義元素在哪一個方向浮動 其中,position:absolute / fixed 優先級最高 當position設置爲absolute或者fixed時,float失效,display須要調整 float / absolute定位的元素,只能是塊元素或表單(block / table) 複製代碼
該佈局提供了一種更高效的方法對容器中的項目進行佈局、對齊和分配空間,他沒有方向上的限制,能夠由開發人員自由操做
使用場景: 移動端開發,安卓,iOS
flex-direction
決定主軸方向(容器排列方向)flex-direction: row | row-reverse | column | column-reverse;
複製代碼
flex-wrap
若是一條軸線排不下,定義換行規則flex-wrap: nowrap | wrap | wrap-reverse;
複製代碼
flex-flow
flex-direction和flex-wrap的簡寫形式flex-flow: <flex-direction> || <flex-wrap>;
複製代碼
justify-content
定義容器在主軸上的對齊方式justify-content: flex-start | flex-end | center | space-between | space-around;
複製代碼
align-items
定義容器在交叉軸上的對齊方式align-items: flex-start | flex-end | center | baseline | stretch;
複製代碼
align-content
定義多根軸線的對齊方式,若是容器只有一根軸線,該屬性不起做用align-content: flex-start | flex-end | center | space-between | space-around | stretch;
複製代碼
order
定義項目的排列順序,數值越小,排列越靠前,默認爲0flex-grow
定義項目的放大比例,默認爲0(即若是存在剩餘空間,也不放大)flex-shrink
定義項目的縮小比例,默認爲1(即若是空間不足,該項目將縮小)flex-basis
定義了在分配多餘空間以前,項目佔據的主軸空間。默認值爲auto(項目原本大小)flex
是flex-grow、flex-shrink和flex-basis的簡寫,默認值爲 0 1 autoflex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] 該屬性有兩個快捷值: auto(1 1 auto) 和 none(0 0 auto) 建議優先使用這個屬性,而不是單獨寫三個分離的屬性 由於瀏覽器會推算相關值 複製代碼
align-self
容許單個項目有與其餘項目不同的對齊方式,可覆蓋align-items
屬性,默認值爲auto
(表示繼承父元素align-items
屬性,若是沒有父元素,等同於stretch
)align-self: auto | flex-start | flex-end | center | baseline | stretch;
複製代碼
三欄佈局 - 左右容器固定,中間容器自適應
三欄佈局在實際中十分經常使用,也是css面試常題,實現方法有以下三種:
<div class="container"> <div class="left">left</div> <div class="main">main</div> <div class="right">right</div> </div> 第一種方式:flex .container{ display: flex; } .left{ flex-basis:200px; background: green; } .main{ flex: 1; background: red; } .right{ flex-basis:200px; background: green; } 第二種方式:position + margin .left,.right{ position: absolute; top: 0; background: red; } .left{ left: 0; width: 200px; } .right{ right: 0; width: 200px; } .main{ margin: 0 200px ; background: green; } 第三種方式 float + margin .left{ float:left; width:200px; background:red; } .main{ margin:0 200px; background: green; } .right{ float:right; width:200px; background:red; } 複製代碼
css
選擇器border-radius
transition
animation
flex
佈局transform
css選擇器的解析是從右向左解析,爲了不對全部元素進行解析
- scroll:一定出現滾動條
- auto:子元素內容大於父元素時出現滾動條
- visible:溢出的內容出如今父元素以外
- hidden:溢出時隱藏
複製代碼
原理 相似於輪播圖,總體元素一直排列下去,假設有5個須要展現的全屏頁面,那麼高度將會是500%,但咱們只能展現100%,剩下的內容能夠經過transform
進行Y軸定位,也能夠經過margin-top
實現
涉及css屬性 overflow:hidden
| transition:all 1000ms ease
響應式設計 是指網站可以兼容多個終端,而不是爲每個終端特意去開發新的一個版本
原理 經過媒體查詢測試不一樣的設備屏幕尺寸作處理
兼容低版本IE,頁面頭部必須有meta聲明的viewport
<meta name=「viewport」 content=「width=device-width,initial-scale=1.maximum-scale=1,user-scalable=no」>
複製代碼
有一個高度固定的div,裏面有兩個div,一個高度100px,另外一個填補剩下的高度
方案一 外層div使用position:relative;
,要求高度自適用的div使用position:absolute; top:100px; bottom:0; left:0
方案二 使用flex
佈局方式,高度自適應的div使用flex:1
opacity
做用於元素,以及元素內的全部內容的透明度rgba()
只做用於元素的顏色或者背景色(設置rgba透明的元素的子元素不會繼承透明效果)px 和 em 都是長度單位
區別在於px的值是固定的,指定多少就是多少,而em的值是不固定的,而且em會繼承父級元素的字體大小
▲ 瀏覽器的默認字體高都是16px。
因此未經調整的瀏覽器都符合:1em=16px。那麼12px = 0.75em 10px = 0.625em
複製代碼
Css引入方式有4種 內聯、內嵌、外鏈、導入
外鏈link 除了能夠加載css以外,還能夠定義rss、rel
等屬性,沒有兼容性問題,支持使用javascript
改變樣式
@import 是css提供的,只能用於加載css,不支持經過javascript
修改樣式
▲ 頁面被加載的時候,link會被同時加載,而@import則需等到頁面加載完後再加載,可能出現無樣式網頁
原理 建立一個沒有高度和寬度的div,設置其中一條邊框的做爲三角形,其餘邊框的顏色應爲透明
{ width:0px; height:0px; border-top:10px solid transparent; border-left:10px solid transparent; border-right:10px solid transparent; border-bottom:10px solid #000; } 複製代碼
display:none
隱藏對應的元素,在文檔佈局中再也不分配空間(致使重排)visibility:hidden
隱藏對應的元素,在文檔佈局中保留原來的空間(致使重繪)Css選擇的解析是從右向左解析,可以避免對全部元素進行解析
設置屬性 background-position:center;
複製代碼
頁面加載自上而下,固然是須要先加載樣式
寫在body
標籤後,因爲瀏覽器以逐行方式對HTML
文檔進行解析,當解析寫在尾部的樣式表會致使瀏覽器中止以前的渲染,等待加載且解析樣式表後才從新進行渲染,這樣可能致使留白現象(因此最好將style
標籤寫在body
前)
- 不一樣瀏覽器的標籤默認的padding/margin不一樣,經過初始化css樣式能夠解決
*{
margin:0;
padding:0px;
}
- IE6雙邊距BUG
- 設置較小高度標籤(通常小於10px),在IE6,IE7中高度超出本身設置的高度
經過設置overflow:hidden;或者設置行高line-height小於你設置的高度
- IE下,可使用獲取常規屬性的方法來獲取自定義屬性,也可使用getAttribute()獲取自定義屬性
- Chrome中文界面下默認會將小於12px的文本強制爲12px
經過加入css屬性 -webkit-text-size-adjust:none;能夠解決,或者使用transform中的縮放屬性
- 超連接訪問事後hover樣式就不出現,由於被點擊訪問過的超連接樣式再也不具備hover和active了
解決方法是改變css屬性的排列屬性:L-V-H-A
a:link{} → a:visited{} → a:hover{} → a:active{}
- IE下,event對象有x,y屬性,可是沒有pageX,pageY屬性,但沒有x,y屬性
解決方式:經過條件
- png24位的圖片在IE6瀏覽器上出現背景,解決方案是作出PNG8
複製代碼
inline後不該該使用width、height、margin、padding以及float; inline-block後不該該使用float; block後不該該使用vertical-align 複製代碼
HTML
存在兩種文檔類型
W3C
標準如何避免瀏覽器的怪異模式 - 經過聲明文檔的解析類型 <!DOCTYPE html>
Meta
提供給頁面一些元信息(名稱/鍵值),它有利於SEO
name
→ 用於描述網站http-equiv
→ 沒有name
時,能夠採用這個屬性的值(content-type
,expires(期限)
,refresh
,set-cookie
,content
屬性關聯到http請求頭)content
→ 名稱/值 中的值,能夠是任意有效字符串scheme
→ 用於指定要用來翻譯屬性值的方案Html
語義化能夠是頁面更加結構化,提供了一系列具備結構意義的標籤,例如header
,footer
等,讓結構更加清晰,有利於瀏覽器的解析css
樣式的狀況下,頁面也會以一種文檔結構來顯示,更加易於閱讀Html
標記來肯定上下文和各個關鍵字的權重,所以有利於SEO
Html
語義化更便於閱讀,維護和理解-webkit-
→ webkit
內核(Chrome
)-moz-
→ Gecko
內核(fixfox
)-o-
→ Opera
內核(Opera
)-ms-
→ Trident
內核(IE
)瀏覽器內核主要分爲兩部分:
渲染引擎
:將代碼轉化爲頁面Js引擎
:解析和執行JavaScript
代碼來實現頁面動態效果Html5
新增特性:
canvas
audio/video
localStorage
長期存儲數據,瀏覽器關閉後數據也不丟失(只能手動刪除)sessionStorage
在瀏覽器關閉後自動刪除WebWorker
,WebSocket
)Html5
移除了純表現型的元素,和對可用性具備負面影響的元素因爲IE6/7/8
都支持document.createElement
來建立元素,所以能夠經過這個方法來讓瀏覽器兼容Html5
新標籤
title
meta
header
,footer
,article
,aside
defer 延遲加載
→ 等到整個頁面都渲染結束(DOM結構徹底生成,以及其餘腳本執行完)纔會執行,多個defer
會按腳本出現的順序依次加載(渲染完加載
)async 異步加載
→ 一旦加載完,渲染引擎就會中止加載,而後執行腳本,腳本執行完才繼續渲染(阻塞渲染),多個async
不能保證加載順序(加載完就執行
)localStorage
cookie
+ setInterval
DNS
緩存CDN
緩存
iframe
是一種內聯框架,也是一種很常見的網頁嵌入方式
iframe
優勢
iframe
可以原封不動的把嵌入的網頁展現出來iframe
,只須要修改iframe
的內容iframe
來解決iframe
缺點
onload
阻塞iframe
框架結構有時讓人感到迷惑,用戶體驗感差iframe
框架頁面會增長服務器的http
請求Fullscreen API
Pge Visibility API
getUserMedia API
Battery API
Link prefetching