2020秋招前端面經(jīng)知識點匯總(一) html,css部分

作者:北風(fēng)菌

鏈接:https://juejin.im/post/6876623829574090760

來源:掘金

好久沒有更新帖子了,最近一直在復(fù)習(xí)準(zhǔn)備秋招膘怕,最近終于拿到了第一份意向書想诅,終于有時間來整理一下自己最近的復(fù)習(xí)內(nèi)容召庞,以下知識點都是樓主在面試中被問到的問題,我做了幾大塊的分類来破,各位需要的小伙伴可以收藏一下篮灼。因為還在繼續(xù)面試,所以還會不定時更新徘禁,因為掘金這邊文章有字?jǐn)?shù)限制诅诱,所以這邊放出了HTML部分,CSS部分送朱,JS部分的知識點娘荡,Vue,git驶沼,webpack炮沐,計網(wǎng)相關(guān)的知識點放在下一篇文章中juejin.im/post/687707…

HTML部分:

HTML標(biāo)簽的分類:

HTML文檔標(biāo)簽

<!DOCTYPE>:定義文檔類型回怜。

<html>: 定義HTML文檔大年。

<head>:定義文檔的頭部。<meta>:定義元素可提供的有關(guān)頁面的元信息玉雾,比如針對搜索引擎和更新頻度的描述和關(guān)鍵字翔试。meta標(biāo)簽共有兩個屬性, http-equiv屬性:相當(dāng)于http頭文件的作用复旬,向瀏覽器傳回一些有用的信息垦缅,使用content規(guī)定屬性的內(nèi)容比如

name屬性:主要用來描述網(wǎng)頁,content中的內(nèi)容主要是便于搜索引擎機器人查找信息和分類信息用的驹碍。


<base>:定義頁面上的所有鏈接規(guī)定默認(rèn)地址或默認(rèn)目標(biāo)失都。<title>:定義文檔標(biāo)題。<link>:定義文檔與外部資源的關(guān)系幸冻。<style>:定義HTML文檔樣式信息粹庞。

<body>:定義文檔的主體。(腳本在非必需情況時在的最后)<script>:定義客戶端腳本洽损,比如javascript庞溜。<noscript>:定義腳本未被執(zhí)行時的替代內(nèi)容。(如文本)

按閉合特征分類:

閉合標(biāo)簽是指由開始標(biāo)簽和結(jié)束標(biāo)簽組成的一對標(biāo)簽,這種標(biāo)簽允許嵌套和承載內(nèi)容流码,例如<html></html>又官、<p></p>等。

空標(biāo)簽是指沒有內(nèi)容的標(biāo)簽漫试,在開始標(biāo)簽中自動閉合六敬。常見的空標(biāo)簽有:<br>、<hr>驾荣、 <img>外构、 <input>、 <link> <meta>播掷。

按是否換行特征分類:

塊級元素:塊級元素是值本身屬性為display:block的元素审编。

內(nèi)聯(lián)元素:內(nèi)聯(lián)元素是指本身屬性為display:inline的元素,其寬度隨元素的內(nèi)容而變化歧匈。

塊級元素的特點:

每個塊級元素獨占一行垒酬,從上到下排布。

塊級元素可以直接控制寬度高度等盒子模型相關(guān)的css屬性件炉。

不設(shè)置寬度的情況下勘究,塊級元素的寬度是其父級元素內(nèi)容的寬度。

不設(shè)置高度的情況下斟冕,塊級元素的高度是他本身內(nèi)容的高度口糕。

常用塊級元素:


內(nèi)聯(lián)元素的特點:

內(nèi)聯(lián)元素會和其他元素從左到右顯示在一行中。

內(nèi)聯(lián)元素不能直接控制寬度高度以及盒子模型相關(guān)的css屬性宫静,可以設(shè)置內(nèi)外邊距的水平方向的值走净。也就是說,對于內(nèi)聯(lián)元素的margin和padding孤里,只有margin-left/margin-right和padding-left/padding-right是有效的伏伯,豎直方向的margin和pading無效果。

內(nèi)聯(lián)元素的寬高是由其內(nèi)容本身的大小決定的捌袜。

內(nèi)聯(lián)元素只能容納文本或者其他內(nèi)聯(lián)元素说搅,不允許在內(nèi)聯(lián)元素中嵌套塊級元素。

常見的內(nèi)聯(lián)元素:


H5新特性(常用):


HTML5新增元素:

1)標(biāo)簽增刪 8個語義元素 header section footer aside nav main article figure內(nèi)容元素mark高亮 progress進(jìn)度

新的表單控件calander date time email url search新的input類型 color date datetime datetime-local email移除過時標(biāo)簽big font frame frameset2)canvas繪圖虏等,支持內(nèi)聯(lián)SVG弄唧。支持MathML

3)多媒體audio video source embed track4)本地離線存儲,把需要離線存儲在本地的文件列在一個manifest配置文件

5)web存儲,localStorage霍衫、SessionStorage cookie sessionStorage localStorage區(qū)別:

Cookie屬性詳解Name字段:為一個cookie的名稱Value字段:為一個cookie的值Domain字段:為可以訪問此cookie的域名候引,二級域名可以獲取頂級域名中的cookie,同二級域名之間不可相互獲取敦跌,頂級域名不可獲取二級域名的cookiePath字段:為可以訪問此cookie的頁面路徑澄干,只有此路徑下的頁面可以讀取此cookieExpires/Max-Age字段:為此cookie的超時時間,若設(shè)置為一個時間,則當(dāng)達(dá)到此時間之后麸俘,此cookie失效辩稽,不設(shè)置的話默認(rèn)值為Session,即瀏覽器關(guān)閉后才會失效从媚。Size字段:表示此cookie的大小http字段:表示此cookie的httponly屬性逞泄,若此屬性設(shè)置為true,則只有在http請求頭中會帶有此cookie的信息拜效,而不能通過document.cookie來訪問喷众。Secure字段:表示設(shè)置是否只能通過https來傳遞此條cookie。

Cookie與webstorage:

cookie數(shù)據(jù)始終在同源的http請求中攜帶(即使不需要)拂檩,即cookie在瀏覽器和服務(wù)器間來回傳遞侮腹。

cookie數(shù)據(jù)還有路徑(path)的概念嘲碧,可以限制稻励。cookie只屬于某個路徑下存儲大小限制也不同,cookie數(shù)據(jù)不能超過4K愈涩,同時因為每次http請求都會攜帶cookie艘希,所以cookie只適合保存很小的數(shù)據(jù)台丛,如回話標(biāo)識。

webStorage雖然也有存儲大小的限制,但是比cookie大得多炭庙,可以達(dá)到5M或更大

sessionStorage與localStorage:

數(shù)據(jù)的有效期不同:

sessionStorage:僅在當(dāng)前的瀏覽器窗口關(guān)閉有效;

localStorage:始終有效莉钙,窗口或瀏覽器關(guān)閉也一直保存仇冯,因此用作持久數(shù)據(jù);cookie:只在設(shè)置的cookie過期時間之前一直有效已烤,即使窗口和瀏覽器關(guān)閉鸠窗。

作用域不同:

sessionStorage:不在不同的瀏覽器窗口中共享,即使是同一個頁面胯究;localStorage:在所有同源窗口都是共享的稍计;

cookie:也是在所有同源窗口中共享的。

HTTP狀態(tài)碼:

1xx(臨時響應(yīng)):表示臨時響應(yīng)并需要請求者繼續(xù)執(zhí)行操作的狀態(tài)碼裕循。

100(繼續(xù))請求者應(yīng)當(dāng)繼續(xù)提出請求臣嚣。服務(wù)器返回此代碼表示已收到請求的第一部分,正在等待其余部分剥哑。

101(切換協(xié)議)請求者已要求服務(wù)器切換協(xié)議硅则,服務(wù)器已確認(rèn)并準(zhǔn)備切換。

2xx (成功):表示成功處理了請求的狀態(tài)碼株婴。

200(成功)服務(wù)器已成功處理了請求怎虫。通常,這表示服務(wù)器提供了請求的網(wǎng)頁。如果是對您的 robots.txt 文件顯示此狀態(tài)碼揪垄,則表示 Googlebot 已成功檢索到該文件穷吮。

201(已創(chuàng)建)請求成功并且服務(wù)器創(chuàng)建了新的資源。

202(已接受)服務(wù)器已接受請求饥努,但尚未處理捡鱼。

203(非授權(quán)信息)服務(wù)器已成功處理了請求,但返回的信息可能來自另一來源酷愧。

204(無內(nèi)容)服務(wù)器成功處理了請求驾诈,但沒有返回任何內(nèi)容。

205(重置內(nèi)容)服務(wù)器成功處理了請求溶浴,但沒有返回任何內(nèi)容乍迄。與 204 響應(yīng)不同,此響應(yīng)要求請求者重置文檔視圖(例如士败,清除表單內(nèi)容以輸入新內(nèi)容)闯两。

206(部分內(nèi)容)服務(wù)器成功處理了部分 GET 請求。

3xx (重定向):要完成請求谅将,需要進(jìn)一步操作漾狼。通常,這些狀態(tài)碼用來重定向饥臂。

300(多種選擇)針對請求逊躁,服務(wù)器可執(zhí)行多種操作。服務(wù)器可根據(jù)請求者 (user agent) 選擇一項操作隅熙,或提供操作列表供請求者選擇稽煤。

301(永久移動)請求的網(wǎng)頁已永久移動到新位置。服務(wù)器返回此響應(yīng)(對 GET 或 HEAD 請求的響應(yīng))時囚戚,會自動將請求者轉(zhuǎn)到新位置酵熙。您應(yīng)使用此代碼告訴 Googlebot 某個網(wǎng)頁或網(wǎng)站已永久移動到新位置。

302(臨時移動)服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求弯淘,但請求者應(yīng)繼續(xù)使用原有位置來響應(yīng)以后的請求绿店。此代碼與響應(yīng) GET 和 HEAD 請求的 301 代碼類似,會自動將請求者轉(zhuǎn)到不同的位置庐橙,但您不應(yīng)使用此代碼來告訴 Googlebot 某個網(wǎng)頁或網(wǎng)站已經(jīng)移動假勿,因為 Googlebot 會繼續(xù)抓取原有位置并編制索引。

303(查看其他位置)請求者應(yīng)當(dāng)對不同的位置使用單獨的 GET 請求來檢索響應(yīng)時态鳖,服務(wù)器返回此代碼转培。對于除 HEAD 之外的所有請求,服務(wù)器會自動轉(zhuǎn)到其他位置浆竭。

304(未修改)自從上次請求后浸须,請求的網(wǎng)頁未修改過惨寿。服務(wù)器返回此響應(yīng)時,不會返回網(wǎng)頁內(nèi)容删窒。如果網(wǎng)頁自請求者上次請求后再也沒有更改過裂垦,您應(yīng)將服務(wù)器配置為返回此響應(yīng)(稱為 If-Modified-Since HTTP 標(biāo)頭)。服務(wù)器可以告訴 Googlebot 自從上次抓取后網(wǎng)頁沒有變更肌索,進(jìn)而節(jié)省帶寬和開銷蕉拢。

305(使用代理)請求者只能使用代理訪問請求的網(wǎng)頁。如果服務(wù)器返回此響應(yīng)诚亚,還表示請求者應(yīng)使用代理晕换。

307(臨時重定向)服務(wù)器目前從不同位置的網(wǎng)頁響應(yīng)請求,但請求者應(yīng)繼續(xù)使用原有位置來響應(yīng)以后的請求站宗。此代碼與響應(yīng) GET 和 HEAD 請求的 301 代碼類似闸准,會自動將請求者轉(zhuǎn)到不同的位置,但您不應(yīng)使用此代碼來告訴 Googlebot 某個頁面或網(wǎng)站已經(jīng)移動梢灭,因為 Googlebot 會繼續(xù)抓取原有位置并編制索引夷家。

4xx(請求錯誤):這些狀態(tài)碼表示請求可能出錯,妨礙了服務(wù)器的處理或辖。

400(錯誤請求)服務(wù)器不理解請求的語法瘾英。

401(未授權(quán))請求要求身份驗證枣接。對于登錄后請求的網(wǎng)頁颂暇,服務(wù)器可能返回此響應(yīng)。

403(禁止)服務(wù)器拒絕請求但惶。如果您在 Googlebot 嘗試抓取您網(wǎng)站上的有效網(wǎng)頁時看到此狀態(tài)碼(您可以在 Google 網(wǎng)站管理員工具診斷下的網(wǎng)絡(luò)抓取頁面上看到此信息)耳鸯,可能是您的服務(wù)器或主機拒絕了 Googlebot 訪問。

404(未找到)服務(wù)器找不到請求的網(wǎng)頁膀曾。例如县爬,對于服務(wù)器上不存在的網(wǎng)頁經(jīng)常會返回此代碼。

405(方法禁用)禁用請求中指定的方法添谊。

406(不接受)無法使用請求的內(nèi)容特性響應(yīng)請求的網(wǎng)頁财喳。

407(需要代理授權(quán))此狀態(tài)碼與 401(未授權(quán))類似,但指定請求者應(yīng)當(dāng)授權(quán)使用代理斩狱。如果服務(wù)器返回此響應(yīng)耳高,還表示請求者應(yīng)當(dāng)使用代理。

408(請求超時)服務(wù)器等候請求時發(fā)生超時所踊。

5xx(服務(wù)器錯誤):這些狀態(tài)碼表示服務(wù)器在處理請求時發(fā)生內(nèi)部錯誤泌枪。這些錯誤可能是服務(wù)器本身的錯誤,而不是請求出錯秕岛。

500(服務(wù)器內(nèi)部錯誤)服務(wù)器遇到錯誤碌燕,無法完成請求误证。

501(尚未實施)服務(wù)器不具備完成請求的功能。例如修壕,服務(wù)器無法識別請求方法時可能會返回此代碼愈捅。

502(錯誤網(wǎng)關(guān))服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無效響應(yīng)慈鸠。

503(服務(wù)不可用)服務(wù)器目前無法使用(由于超載或停機維護(hù))改鲫。通常,這只是暫時狀態(tài)林束。

504(網(wǎng)關(guān)超時)服務(wù)器作為網(wǎng)關(guān)或代理像棘,但是沒有及時從上游服務(wù)器收到請求。

505(HTTP 版本不受支持)服務(wù)器不支持請求中所用的 HTTP 協(xié)議版本壶冒。

前端優(yōu)化方法:

方法分類:

降低請求量:合并資源缕题,減少HTTP 請求數(shù),minify / gzip 壓縮胖腾, webPlazyLoad烟零。

加快請求速度:預(yù)解析DNS,減少域名數(shù)咸作,并行加載锨阿,CDN 分發(fā)。

緩存:HTTP 協(xié)議緩存請求记罚,離線緩存 manifest墅诡,離線數(shù)據(jù)緩存localStorage。

渲染:JS/CSS優(yōu)化桐智,加載順序末早,服務(wù)端渲染,pipeline说庭。

具體措施:

減少HTTP請求次數(shù):CSS Sprites然磷,js、CSS源碼壓縮刊驴、圖片大小控制合適姿搜;網(wǎng)頁Gzip、CDN托管捆憎、data緩存舅柜、圖片服務(wù)器

前端模板JS+數(shù)據(jù),減少由于HTML標(biāo)簽導(dǎo)致的帶寬浪費攻礼,前端用變量保存AJAX請求結(jié)果业踢,每次操作本地變量,不用請求礁扮,減少請求次數(shù)

用innerHTML替代DOM操作知举,減少DOM操作次數(shù)瞬沦,優(yōu)化JavaScript性能。

當(dāng)需要設(shè)置的樣式很多時雇锡,設(shè)置className而不是直接操作Style

少用全局變量逛钻、緩存DOM節(jié)點查找的結(jié)果。減少IO讀取

避免使用CSS Expression(css表達(dá)式)又稱Dynamic properties(動態(tài)屬性)

圖片預(yù)加載锰提,將樣式表放在頂部曙痘,將腳本放在底部,加上時間戳立肘。

防止內(nèi)存泄漏:內(nèi)存泄漏指任何對象在不再擁有或需要它之后仍然繼續(xù)存在边坤。垃圾回收器定期掃描對象,并計算引用了每個對象的其他的數(shù)量谅年。如果一個對象的引用數(shù)量為0(沒有其他對象引用過該對象)茧痒,或?qū)υ搶ο蟮奈ㄒ灰檬茄h(huán)的,那么該對象的內(nèi)存即可回收融蹂。

優(yōu)雅降級與漸進(jìn)增強:

瀏覽器輸入網(wǎng)址到頁面渲染全過程

漸進(jìn)增強:一開始就針對低版本瀏覽器進(jìn)行構(gòu)建頁面旺订,完成基本的功能,然后在針對高級瀏覽器進(jìn)行效果超燃,交互区拳,追加功能達(dá)到更好的體驗。

優(yōu)雅降級:一開始就構(gòu)建站點的完整功能意乓,然后針對瀏覽器測試和修復(fù)樱调,比如一開始使用css3的特性構(gòu)建一個應(yīng)用,然后逐步針對各大瀏覽器進(jìn)行hack使其可以在低版本瀏覽器上正常瀏覽洽瞬。

post和get區(qū)別:

get參數(shù)通過url傳遞本涕,post參數(shù)放在request body中。

get請求在url中傳遞的參數(shù)是有長度限制的伙窃,而post沒有。

get比post更不安全样漆,因為參數(shù)直接暴露在url中为障,所以不能用來傳遞敏感信息。

get請求只能進(jìn)行url編碼放祟,而post支持多種編碼方式

get請求參數(shù)會被完整保留在瀏覽歷史記錄里鳍怨,而post中的參數(shù)不會被保留。

GET和POST本質(zhì)上就是TCP鏈接跪妥,并無差別鞋喇。但是由于HTTP的規(guī)定和瀏覽器/服務(wù)器的限制,導(dǎo)致他們在應(yīng)用過程中體現(xiàn)出一些不同眉撵。

GET產(chǎn)生一個TCP數(shù)據(jù)包侦香;POST產(chǎn)生兩個TCP數(shù)據(jù)包落塑。對于GET方式的請求,瀏覽器會把http header和data一并發(fā)送出去罐韩,服務(wù)器響應(yīng)200(返回數(shù)據(jù))憾赁;而對于POST,瀏覽器先發(fā)送header散吵,服務(wù)器響應(yīng)100 continue龙考,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 ok(返回數(shù)據(jù))矾睦。

http與https有什么區(qū)別晦款?

(1) https協(xié)議需要ca申請認(rèn)證書,一般免費的較少

(2) http是超文本傳輸協(xié)議枚冗,信息是明文傳輸柬赐,https則是具有安全性的ssl加密傳輸協(xié)議

(3) http和https使用的是完全不同的連接方式,用的端口也不一樣官紫,前者是80肛宋,后者是443

(4) http的連接很簡單,是無狀態(tài)的束世,https協(xié)議是由ssl+http協(xié)議構(gòu)建的可進(jìn)行加密傳輸酝陈,身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http安全

HTTP協(xié)議中緩存的處理流程:

緩存分為兩種:強緩存和協(xié)商緩存毁涉,根據(jù)響應(yīng)的header內(nèi)容來決定沉帮。

強緩存是利用http頭中的Expires和cache-Control兩個字段來控制的,用來表示資源的緩存時間贫堰。強緩存中穆壕,普通刷新會忽略它,但不會清除它其屏,需要強制刷新喇勋。瀏覽器強制刷新,請求會帶上cache-Control :no-cache和pragma: no-cache

協(xié)商緩存就是由服務(wù)器來確定緩存資源是否可用偎行,所以客戶端與服務(wù)器端要通過某種標(biāo)識來進(jìn)行通信川背,從而讓服務(wù)器判斷請求資源是否可以緩存訪問。

普通刷新會啟用弱緩存蛤袒,忽略強緩存熄云。只有在地址欄或收藏夾輸入網(wǎng)址、通過鏈接引用資源等情況下妙真,瀏覽器才會啟用強緩存缴允,這也是為什么有時候我們更新一張圖片、一個js文件珍德,頁面內(nèi)容依然是舊的练般,但是直接瀏覽器訪問那個圖片或文件矗漾,看到的內(nèi)容卻是新的。這個主要涉及到兩組協(xié)商緩存相關(guān)的header字段:Etag和If-None-Match踢俄、Last-Modified和If-Modified-Since缩功。

瀏覽器的緩存過程:

瀏覽器請求某一資源時,會先獲取該資源緩存的header信息都办,然后根據(jù)header中的cache-Control和Expires來判斷是否過期嫡锌。

若沒過期則直接從緩存中獲取資源信息,包括緩存的header的信息琳钉,所以此次請求不會與服務(wù)器進(jìn)行通信势木。這里判斷是否過期,則是強緩存相關(guān)歌懒。

如果顯示已過期啦桌,瀏覽器會向服務(wù)器端發(fā)送請求,這個請求會攜帶第一次請求返回的有關(guān)緩存的header字段信息及皂。 比如客戶端會通過If-None-Match頭將先前服務(wù)器端發(fā)送過來的Etag發(fā)送給服務(wù)器甫男,服務(wù)會對比這個客戶端發(fā)過來的Etag是否與服務(wù)器的相同, 若相同验烧,就將If-None-Match的值設(shè)為false板驳,返回狀態(tài)304,客戶端繼續(xù)使用本地緩存碍拆,不解析服務(wù)器端發(fā)回來的數(shù)據(jù)若治,若不相同就將If-None-Match的值設(shè)為true,返回狀態(tài)為200感混,客戶端重新機械服務(wù)器端返回的數(shù)據(jù);客戶端還會通過If-Modified-since頭將先前服務(wù)器端發(fā)過來的最后修改時間戳發(fā)送給服務(wù)器端幼,服務(wù)器端通過這個時間戳判斷客戶端的頁面是否是最新的,如果不是最新的弧满,則返回最新的內(nèi)容婆跑,如果是最新的,則返回304谱秽,客戶端繼續(xù)使用本地緩存洽蛀。

如何解決前端開發(fā)中的緩存問題

對開發(fā)者來說,只要關(guān)閉瀏覽器緩存就可以了疟赊,找到network,Disable cache選項峡碉,打鉤即可取消緩存近哟。

開發(fā)者可以關(guān)閉緩存,但是不能要求所有用戶都進(jìn)行此類操作鲫寄,此時可以在引用的文件之后拼接隨機數(shù)或者日期都可以吉执,如css/index.css?v=0.0001疯淫,瀏覽器就會認(rèn)為是新的請求,而不會使用緩存中的文件戳玫。由于每次資源的修改都要更新引用的位置熙掺,同時修改參數(shù)的值,所以操作起來不是很方便咕宿,除非是在動態(tài)頁面比如jsp中用服務(wù)器變量(v=${sysRnd})

如果緩存問題出現(xiàn)在ajax請求中币绩,則在ajax請求的地址追加隨機數(shù)

直接ctrl+f5,這個辦法能解決頁面直接引用的資源更新的問題

使用瀏覽器的隱私模式開發(fā)府阀;

如果資源引用的頁面缆镣,被嵌入到了一個iframe里面,可以在iframe的區(qū)域右鍵單擊重新加載該頁面

html5如何及時更新緩存文件(js试浙、css或圖片)

后端接口頁面設(shè)置

header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); 復(fù)制代碼

html頁面中設(shè)置meta標(biāo)簽的屬性(meta標(biāo)簽的http-equiv屬性語法格式是:<meta http-equiv="參數(shù)" content="參數(shù)變量值">)

<meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Pragma" content="no-cache">//是用于設(shè)定禁止瀏覽器從本地機的緩存中調(diào)閱頁面內(nèi)容董瞻,設(shè)定后一旦離開網(wǎng)頁就無法從Cache中再調(diào)出? <meta http-equiv="Expires" content="0"> 復(fù)制代碼

對于圖片或css文件,可以在文件名后面添加一個隨機數(shù)或標(biāo)志位田巴,例如

<link rel="stylesheet" href="./style/style.css?+Math.random()"> 復(fù)制代碼

對于js文件也可以采取3的方法钠糊,或者在文件名后使用時間戳

<script language="javascript" src="UILib/Common/Common.js?time=new Date()"> 復(fù)制代碼

輸入URL到后發(fā)生了什么:

簡單過程:

DNS域名解析;

建立TCP連接壹哺;

發(fā)送HTTP請求抄伍;

服務(wù)器處理請求;

返回響應(yīng)結(jié)果斗躏;

關(guān)閉TCP連接逝慧;

瀏覽器解析HTML;

瀏覽器布局渲染啄糙;

詳細(xì)分析構(gòu)建請求的過程:

應(yīng)用層進(jìn)行DNS解析 通過DNS將域名解析成IP地址笛臣,在解析過程中,按照瀏覽器緩存隧饼,系統(tǒng)緩存沈堡,路由器緩存,ISP(運營商)DNS緩存燕雁,根域名服務(wù)器诞丽,頂級域名服務(wù)器,主域名服務(wù)器的順序拐格,逐步讀取緩存僧免,直到拿到IP地址。 這里使用DNS預(yù)解析捏浊,可以根據(jù)瀏覽器定義的規(guī)則懂衩,提前解析之后可能會用到的域名,使解析結(jié)果緩存到系統(tǒng)緩存中,縮短DNS解析時間浊洞,來提高網(wǎng)站的訪問速度牵敷。

應(yīng)用層生成HTTP請求報文 應(yīng)用層生成針對目標(biāo)服務(wù)器的HTTP報文請求,HTTP請求包括起始行法希,首部和主體部分枷餐。首部包括域名host,keep-alive苫亦,User-Agent毛肋,Accept-Endoding,Accept-Language著觉,cookie等信息

傳輸層建立TCP連接 http協(xié)議使用的TCP協(xié)議村生。 將http請求報文按序號分為多個報文段,并對每個報文段進(jìn)行封裝饼丘,使用本地的隨機tcp源端口簡歷到目標(biāo)服務(wù)器的tcp80端口(https是443端口)的連接趁桃,TCP源端口和目的端口被加入到報文中。即協(xié)議數(shù)據(jù)單元肄鸽,同時還會加入序列號卫病,確認(rèn)號,檢驗和等參數(shù)典徘,共計添加20個字節(jié)的頭部信息蟀苛。 這里構(gòu)建TCP連接請求會增加大量的網(wǎng)絡(luò)延時。常用的優(yōu)化方法如下:

1)資源打包逮诲,合并請求

2)多使用緩存帜平,減少網(wǎng)絡(luò)傳輸

3)使用keep-alive建立持久連接

4)使用多個域名,增加瀏覽器的資源并發(fā)加載數(shù)梅鹦,或者使用http2的管道化連接的多路復(fù)用技術(shù)

網(wǎng)絡(luò)層使用IP協(xié)議來選擇線路裆甩。 處理來自傳輸層的數(shù)據(jù)段segment,將數(shù)據(jù)段segment裝入數(shù)據(jù)包packet齐唆,填充包頭嗤栓,主要添加源和目的IP地址,然后發(fā)送數(shù)據(jù)箍邮。IP協(xié)議負(fù)責(zé)選擇傳送的路線口芍,稱為路由功能雹仿。

數(shù)據(jù)鏈路層實現(xiàn)網(wǎng)絡(luò)相鄰結(jié)點間可靠的數(shù)據(jù)通信 為了保證數(shù)據(jù)的可靠性私恬,把數(shù)據(jù)包packet封裝成幀柜裸,并按順序傳送各幀,對每個數(shù)據(jù)塊計算CRC(循環(huán)冗余檢驗),防止數(shù)據(jù)包丟失味滞,出錯就重傳全封。 將數(shù)據(jù)包封裝成幀马昙,分為幀頭和幀尾桃犬,幀尾是CRC校驗部分刹悴,幀頭主要是添加數(shù)據(jù)鏈路層的地址,源地址和目的地址攒暇,即網(wǎng)絡(luò)相鄰結(jié)點間的MAC地址

物理層傳輸數(shù)據(jù) 將數(shù)據(jù)鏈路層的幀轉(zhuǎn)換為二進(jìn)制形式的比特流土匀,從網(wǎng)卡發(fā)送出去,再轉(zhuǎn)換成電子形用,光學(xué)信號在網(wǎng)絡(luò)中傳輸就轧。

總結(jié):6個步驟分別為:DNS協(xié)議解析URL地址,生成HTTP請求報文田度,構(gòu)建TCP鏈接妒御,使用IP協(xié)議選擇傳輸路線,數(shù)據(jù)鏈路層保證數(shù)據(jù)的可靠傳輸镇饺,物理層將數(shù)據(jù)轉(zhuǎn)換為物理信號進(jìn)行傳輸乎莉。

補充:服務(wù)器處理及反向傳輸:

服務(wù)器接收到這個比特流,把比特流轉(zhuǎn)換成幀格式奸笤,上傳到數(shù)據(jù)鏈路層惋啃,服務(wù)器發(fā)現(xiàn)數(shù)據(jù)幀中的目的MAC地址與本網(wǎng)卡的MAC地址相同,服務(wù)器拆除數(shù)據(jù)鏈路層的封裝后监右,把數(shù)據(jù)包上傳到網(wǎng)絡(luò)層边灭。服務(wù)器的網(wǎng)絡(luò)層比較數(shù)據(jù)包中的目的IP地址,發(fā)現(xiàn)與本機的IP地址相同健盒,服務(wù)器拆除網(wǎng)絡(luò)層的封裝后绒瘦,把數(shù)據(jù)分段上傳到傳輸層。傳輸層對數(shù)據(jù)分段進(jìn)行確認(rèn)扣癣、排序惰帽、重組,確保數(shù)據(jù)傳輸?shù)目煽啃圆?shù)據(jù)最后被傳到服務(wù)器的應(yīng)用層

  接著善茎,通過傳輸層、網(wǎng)絡(luò)層频轿、數(shù)據(jù)鏈路層的層層封裝垂涯,最終將響應(yīng)報文封裝成二進(jìn)制比特流,并轉(zhuǎn)換成其他信號航邢,如電信號到網(wǎng)絡(luò)中傳輸

  反向傳輸?shù)倪^程與正向傳輸?shù)倪^程類似

瀏覽器的渲染過程:

主要步驟

瀏覽器將獲取到的HTML文檔解析成DOM樹

處理css標(biāo)記耕赘,構(gòu)成層疊樣式表模型CSSOM(css object model)

將DOM和CSSOM合并為渲染樹(rendering tree),代表一系列將要被渲染的對象

渲染樹的每個元素包含的內(nèi)容是計算過的膳殷,稱之為布局layout操骡,瀏覽器使用一種流式處理的方法九火,只需要一次繪制操作就可以布局所有元素

將渲染樹的各個節(jié)點繪制到屏幕上,這一步被稱為繪制painting 具體流程:

構(gòu)建DOM樹:

瀏覽器收到服務(wù)器響應(yīng)來的HTML文檔后册招,遍歷文檔節(jié)點岔激,生成DOM樹,DOM樹構(gòu)建時可能會被CSS和JS的加載而執(zhí)行阻塞是掰,display:none的元素虑鼎,注釋,script也會存在于DOM樹中键痛。

構(gòu)建CSSOM規(guī)則樹

瀏覽器解析CSS文件并對每個文件生成一個stylesheet對象炫彩,每個對象包含css規(guī)則。css解析可以和DOM解析同時進(jìn)行絮短,css的解析會被js互斥江兢。

構(gòu)建渲染樹(render tree):

瀏覽器從DOM樹的根結(jié)點遍歷每個可見結(jié)點,然后對每個可見結(jié)點找到css樣式規(guī)則并應(yīng)用丁频。Render tree與DOM tree不完全對應(yīng)杉允,display:none的元素不在render tree中,visibility:hidden元素在render tree中限府。這個時候還沒渲染到屏幕上夺颤,渲染到屏幕需要用到各個節(jié)點的位置信息,需要布局的處理

渲染樹布局(render tree layout):

布局階段胁勺,遍歷每一個render object對象世澜,包含寬高,位置署穗,背景色等樣式信息寥裂,通過這些信息確定每個結(jié)點在頁面上的確切位置。脫離文檔流案疲,脫離的是render tree

渲染樹繪制(render tree paint):

繪制階段封恰,瀏覽器遍歷渲染樹,調(diào)用渲染器的paint()方法在屏幕上顯示其內(nèi)容褐啡,由瀏覽器的后端UI組建完成诺舔。

Js阻塞:

JS可以操作DOM來改變DOM結(jié)構(gòu),修改CSSOM樣式备畦,所以瀏覽器在遇到<script>標(biāo)簽時低飒,DOM構(gòu)建將暫停,直到腳本執(zhí)行完成懂盐,再繼續(xù)構(gòu)建DOM褥赊,所以<script>標(biāo)簽一般放在最后。現(xiàn)在可以在<script>標(biāo)簽上增加defer莉恼,async等屬性拌喉,單獨解析js中操作DOM和CSSOM的地方追加到DOM和CSSOM上速那。Css阻塞:

CSSOM負(fù)責(zé)存儲渲染信息,所以CSSOM在瀏覽器合成渲染樹之前必須是完備的尿背,否則就不會進(jìn)入渲染過程端仰。所以將樣式放在head中,為了更快的解析css残家。defer和async屬性的區(qū)別:

沒有defer和async屬性的時候瀏覽器在讀取到<script>標(biāo)簽的時候會立即讀取腳本文件榆俺,而不會加載后續(xù)的文檔元素,會阻塞后續(xù)DOM的構(gòu)建 文檔解析時坞淮,遇到設(shè)置了defer的腳本,就會在后臺進(jìn)行下載陪捷,但是并不會阻止文檔的渲染回窘,當(dāng)頁面解析&渲染完畢后。會等到所有的defer腳本加載完畢并按照順序執(zhí)行市袖,執(zhí)行完畢后會觸發(fā)DOMContentLoaded(dom內(nèi)容加載完畢)事件啡直。 async腳本會在加載完畢后執(zhí)行。async腳本的加載不計入DOMContentLoaded事件統(tǒng)計 有defer或者async屬性之后苍碟,腳本文件的讀取和后續(xù)文檔的加載是并行的也就是異步執(zhí)行酒觅,js腳本的執(zhí)行會等到所有元素被解析完成之后,DOMContentLoaded事件調(diào)用前執(zhí)行微峰。 存在多個defer的腳本文件時舷丹,他們會按照順序defer的順序執(zhí)行,而async的加載則是無序的蜓肆,只要DOM加載完成會立即執(zhí)行颜凯,不考慮腳本之間的依賴關(guān)系。

重排(layout)和重繪(repaint):

DOM的變化影響到了已渲染完成的幾何屬性仗扬,比如寬高等症概,瀏覽器將重新計算元素的幾何屬性,其他元素的幾何屬性也會受到影響早芭,瀏覽器需要重新構(gòu)造渲染樹(Render樹)彼城,這個過程稱之為重排(也叫回流reflow),瀏覽器將受到影響的部分重新繪制在屏幕上的過程稱之為重繪退个。display:none會觸發(fā)reflow募壕,而visibility: hidden屬性則并不算是不可見屬性,只會觸發(fā)repaint

重繪產(chǎn)生的原因有:

添加或刪除可見的DOM元素帜乞,

元素的尺寸位置發(fā)生改變司抱。

瀏覽器頁面初始化

瀏覽器窗口大小發(fā)生變化

重排一定導(dǎo)致重繪,重繪不一定導(dǎo)致重排黎烈。

減少重繪重排的方法:

不在布局信息改變時做DOM查詢

不要一條一條的修改DOM樣式习柠,使用csstext匀谣,className一次性改變屬性

在內(nèi)存中多次操作節(jié)點,完成后再添加到文檔中

對于一個元素進(jìn)行復(fù)雜的操作時资溃,先隱藏武翎,操作完再展示

需要經(jīng)常獲取那些引起瀏覽器重排的屬性時,緩存到變量中

不要使用table布局溶锭,一個小改動會導(dǎo)致table重新布局

對于多次重排的元素宝恶,比如說動畫,使用絕對定位讓其脫離文檔流趴捅,使其不影響其他元素垫毙,減少重繪范圍

http報文構(gòu)成:

使用HTTP長連接有哪些優(yōu)點:

HTTP長連接(持久化連接):? 在一個TCP連接的基礎(chǔ)之上,發(fā)送多個HTTP請求以及接收多個HTTP響應(yīng)拱绑,這是為了避免每一次請求都去打開一個新的連接综芥。

在HTTP/1.0中默認(rèn)使用短連接。也就是說猎拨,客戶端和服務(wù)器每進(jìn)行一次HTTP操作膀藐,就建立一次連接,任務(wù)結(jié)束就中斷連接红省。 而從HTTP/1.1起额各,默認(rèn)使用長連接,用以保持連接特性吧恃。使用長連接的HTTP協(xié)議虾啦,會在響應(yīng)頭加入這行代碼:Connection:keep-alive 在使用長連接的情況下,當(dāng)一個網(wǎng)頁打開完成后蚜枢,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉缸逃,客戶端再次訪問這個服務(wù)器時,會繼續(xù)使用這一條已經(jīng)建立的連接厂抽。

Keep-Alive不會永久保持連接需频,它有一個保持時間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個時間筷凤。實現(xiàn)長連接需要客戶端和服務(wù)端都支持長連接昭殉。

HTTP協(xié)議的長連接和短連接,實質(zhì)上是TCP協(xié)議的長連接和短連接藐守。

長連接的特點:

可以省去較多的TCP連接建立和關(guān)閉的操作挪丢,減少浪費,節(jié)約時間卢厂。適用于頻繁請求服務(wù)器資源的客戶端之間建立乾蓬。

短連接的特點:

對于服務(wù)器來說管理較為簡單,存在的連接都是有用的連接慎恒,但是如果客戶請求頻繁任内,將在TCP的建立和關(guān)閉操作上浪費時間和帶寬撵渡。WEB網(wǎng)站的http服務(wù)一般采用的都是短連接服務(wù)。

客戶端和服務(wù)器之間的連接如果一直不關(guān)閉死嗦,隨著建立連接的客戶端越來越多,會增加服務(wù)器的壓力越除,所以一般采取以下幾種策略:

1.關(guān)閉一些長時間沒有發(fā)生讀寫事件的連接节腐。

2.限制每個客戶端的最大長連接數(shù)量。

TLS/SSL協(xié)議是如何保障信息安全的:

SSL(安全套接字協(xié)議):是web瀏覽器和web服務(wù)器之間安全交換信息的協(xié)議摘盆,提供兩個基本的安全服務(wù)翼雀,鑒別和保密 TLS(安全傳輸層協(xié)議):用于在兩個通信應(yīng)用程序之間提供保密性和數(shù)據(jù)完整性。其中TLS是SSL的升級版

SSL/TLS協(xié)議的基本過程

(1) 客戶端向服務(wù)器端索要并驗證公鑰骡澈。

(2) 雙方協(xié)商生成"對話密鑰"锅纺。

(3) 雙方采用"對話密鑰"進(jìn)行加密通信。具體過程可細(xì)分為8個步驟:

客戶端向服務(wù)器發(fā)起https請求肋殴,連接到服務(wù)器的443端口

服務(wù)器有密鑰對,即公鑰和私鑰坦弟,用來進(jìn)行非對稱加密

服務(wù)器將公鑰發(fā)送給客戶端

客戶端收到服務(wù)端的數(shù)據(jù)后护锤,先驗證其證書的合法性,如果合法酿傍,客戶端生成客戶端密鑰烙懦,并使用服務(wù)端接收到的公鑰對客戶端密鑰進(jìn)行加密。

客戶端再次發(fā)起https請求赤炒,將加密之后的客戶端密鑰發(fā)送給服務(wù)器

服務(wù)器接收到客戶端發(fā)送過來的加密后的密鑰氯析,用自己的私鑰進(jìn)行解密,然后用客戶端密鑰對要發(fā)送的數(shù)據(jù)進(jìn)行加密莺褒。

將加密后的數(shù)據(jù)發(fā)送給客戶端

客戶端使用客戶端密鑰對加密數(shù)據(jù)進(jìn)行解密掩缓,得到服務(wù)器發(fā)送的數(shù)據(jù)。SSL協(xié)議的內(nèi)容:

握手協(xié)議 握手協(xié)議是客戶端和服務(wù)器用SSL連接通信時使用的第一個子協(xié)議遵岩,握手協(xié)議包括客戶機與服務(wù)器之間的一系列消息你辣,是SSL協(xié)議中最復(fù)雜的協(xié)議,該協(xié)議允許服務(wù)器和客戶機相互驗證尘执,協(xié)商加密和MAC算法(帶秘密密鑰的Hash函數(shù))及保密密鑰舍哄,用來保護(hù)在SSL記錄中發(fā)送的數(shù)據(jù),握手協(xié)議是在應(yīng)用程序的數(shù)據(jù)傳輸之前使用的。 1.1 建立安全能力誊锭,發(fā)送信息表悬,交換版本,隨機數(shù)丧靡,會話ID蟆沫,密碼套件籽暇,壓縮方法等信息 1.2 服務(wù)器鑒別與密鑰交換 1.3 客戶機鑒別與密鑰交換 1.4 完成

記錄協(xié)議 記錄協(xié)議在客戶機和服務(wù)器成功握手之后使用,即客戶機和服務(wù)器鑒別對方和確定安全信息交換使用的算法后饥追,進(jìn)入SSL記錄協(xié)議图仓。

警報協(xié)議 客戶機和服務(wù)器發(fā)現(xiàn)錯誤時,向?qū)Ψ桨l(fā)送一個警報信息但绕,如果是致命錯誤救崔,則算法立即關(guān)閉SSL連接,雙方刪除相關(guān)的會話號捏顺,密鑰等六孵。

總結(jié):SSL中,使用握手協(xié)議協(xié)商加密和MAC算法以及保密密鑰幅骄,使用握手協(xié)議對交換的數(shù)據(jù)進(jìn)行加密和簽名劫窒,使用警報協(xié)議定義數(shù)據(jù)傳輸過程中,出現(xiàn)問題改如何解決拆座。

HTTP 1.0,1.1,2.0協(xié)議的區(qū)別:

HTTP1.0 HTTP 1.1主要區(qū)別長連接HTTP 1.0需要使用keep-alive參數(shù)來告知服務(wù)器端要建立一個長連接主巍,而HTTP1.1默認(rèn)支持長連接。

HTTP是基于TCP/IP協(xié)議的挪凑,創(chuàng)建一個TCP連接是需要經(jīng)過三次握手的,有一定的開銷孕索,如果每次通訊都要重新建立連接的話,對性能有影響躏碳。因此最好能維持一個長連接搞旭,可以用個長連接來發(fā)多個請求。節(jié)約帶寬HTTP 1.1支持只發(fā)送header信息(不帶任何body信息)菇绵,如果服務(wù)器認(rèn)為客戶端有權(quán)限請求服務(wù)器肄渗,則返回100,否則返回401咬最◆岬眨客戶端如果接受到100,才開始把請求body發(fā)送到服務(wù)器丹诀。

這樣當(dāng)服務(wù)器返回401的時候钝的,客戶端就可以不用發(fā)送請求body了,節(jié)約了帶寬铆遭。

另外HTTP還支持傳送內(nèi)容的一部分硝桩。這樣當(dāng)客戶端已經(jīng)有一部分的資源后,只需要跟服務(wù)器請求另外的部分資源即可枚荣。這是支持文件斷點續(xù)傳的基礎(chǔ)碗脊。HOST域現(xiàn)在可以web server例如tomat,設(shè)置虛擬站點是非常常見的,也即是說衙伶,web server上的多個虛擬站點可以共享同一個ip和端口祈坠。

HTTP1.0是沒有host域的,HTTP1.1才支持這個參數(shù)矢劲。

HTTP1.1 HTTP 2.0主要區(qū)別多路復(fù)用HTTP2.0使用了(類似epoll)多路復(fù)用的技術(shù)赦拘,做到同一個連接并發(fā)處理多個請求,而且并發(fā)請求的數(shù)量比HTTP1.1大了好幾個數(shù)量級芬沉。

當(dāng)然HTTP1.1也可以多建立幾個TCP連接躺同,來支持處理更多并發(fā)的請求,但是創(chuàng)建TCP連接本身也是有開銷的丸逸。

TCP連接有一個預(yù)熱和保護(hù)的過程蹋艺,先檢查數(shù)據(jù)是否傳送成功,一旦成功過黄刚,則慢慢加大傳輸速度捎谨。因此對應(yīng)瞬時并發(fā)的連接,服務(wù)器的響應(yīng)就會變慢憔维。所以最好能使用一個建立好的連接涛救,并且這個連接可以支持瞬時并發(fā)的請求。數(shù)據(jù)壓縮HTTP1.1不支持header數(shù)據(jù)的壓縮业扒,HTTP2.0使用HPACK算法對header的數(shù)據(jù)進(jìn)行壓縮州叠,這樣數(shù)據(jù)體積小了,在網(wǎng)絡(luò)上傳輸就會更快凶赁。

請求與響應(yīng)首部的定義在HTTP2.0中基本沒有變,只是所有首部鍵必須全部小寫逆甜,而且要求行要獨立為:method:虱肄、:scheme:、:host:交煞、:path:這些鍵值對

對于相同的數(shù)據(jù)咏窿,不再重新通過每次請求和響應(yīng)發(fā)送。每個新的首部鍵值對要么追加到當(dāng)前表的末尾素征,要么替換表中之前的值集嵌。首部表在HTTP2.0的鏈接存續(xù)期內(nèi)始終存在,由客戶端和服務(wù)端共同漸進(jìn)的更新御毅。服務(wù)器推送意思是說根欧,當(dāng)我們對支持HTTP2.0的web server請求數(shù)據(jù)的時候,服務(wù)器會順便把一些客戶端需要的資源一起推送到客戶端端蛆,免得客戶端再次創(chuàng)建連接發(fā)送請求到服務(wù)器端獲取凤粗。這種方式非常合適加載靜態(tài)資源。

服務(wù)器端推送的這些資源其實存在客戶端的某處地方今豆,客戶端直接從本地加載這些資源就可以了嫌拣,不用走網(wǎng)絡(luò)柔袁,速度自然是快很多的。二進(jìn)制幀層HTTP2.0會把所有信息分割成更小的消息和幀异逐,并采用二進(jìn)制格式將其封裝捶索。例如header封裝到Headers幀,request body封裝到Data幀灰瞻。

HTTP2.0通信都在一個TCP連接上完成腥例,這個連接可以承載任意數(shù)量的雙向數(shù)據(jù)流,相應(yīng)的每個數(shù)據(jù)流以消息的形式發(fā)送箩祥。而消息由一或多個幀組成院崇,這些幀可以亂序發(fā)送,然后根據(jù)每個幀首部的流標(biāo)識符重新組裝袍祖。

WebSocket協(xié)議:

ajax輪詢ajax(異步的javascript與xml技術(shù))是一種有效利用javascript和dom的操作底瓣,以達(dá)到局部web頁面的提花和加載的異步通信手段。和以前的同步通信相比蕉陋,他只更新一部分頁面捐凭,相應(yīng)中傳輸?shù)臄?shù)據(jù)量會因此的減少。

ajax輪詢的原理是凳鬓,讓瀏覽器每隔一段時間就發(fā)送一次請求茁肠,詢問服務(wù)器是否有新消息。而利用ajax實時的從服務(wù)器獲取內(nèi)容缩举,有可能導(dǎo)致大量的請求產(chǎn)生垦梆。

長輪詢原理和ajax輪詢差不多,都是采用輪詢的方式仅孩,不過采用的是阻塞模型托猩。也就是說,當(dāng)客戶端發(fā)起連接后辽慕,如果服務(wù)器端內(nèi)容沒有更新京腥,將響應(yīng)至于掛起狀態(tài),一直不回復(fù)response給客戶端溅蛉,知道有內(nèi)容更新公浪,再返回響應(yīng)。

http的特點:被動性船侧,請求只能由客戶端發(fā)起欠气。服務(wù)器端不能主動聯(lián)系客戶端。

ajax輪詢 需要服務(wù)器有很快的處理速度和資源勺爱。(速度)

長輪詢 需要有很高的并發(fā)晃琳,也就是說同時接待客戶的能力。(場地大小)WebSocket

WebSocket是HTML5出的東西(協(xié)議)卫旱,是HTML5開始提供的一種瀏覽器與服務(wù)器進(jìn)行全雙工通訊的網(wǎng)絡(luò)技術(shù)人灼,屬于應(yīng)用層協(xié)議。它基于TCP傳輸協(xié)議顾翼,并復(fù)用HTTP的握手通道投放。

一旦web服務(wù)器和客戶端建立起websocket協(xié)議的通信連接,之后所有的通信都依靠這個專用連接進(jìn)行适贸。只需要經(jīng)過一次HTTP請求灸芳,就可以做到源源不斷的信息傳送了。

通過在請求首部中設(shè)置Connection: Upgrade來使用websocket協(xié)議

websocket協(xié)議具有以下的特點推送功能支持服務(wù)器端向客戶端推送功能拜姿。服務(wù)器可以直接發(fā)送數(shù)據(jù)而不用等待客戶端的請求烙样。減少通信量只要建立起websocket連接,就一直保持連接蕊肥,在此期間可以源源不斷的傳送消息谒获,直到關(guān)閉請求。也就避免了HTTP的非狀態(tài)性壁却。

和http相比批狱,不但每次連接時的總開銷減少了,而且websocket的首部信息量也小 展东,通信量也減少了赔硫。

支持雙向通信,實時性更強盐肃。更好的二進(jìn)制支持爪膊。較少的控制開銷。

連接創(chuàng)建后砸王,ws客戶端惊完、服務(wù)端進(jìn)行數(shù)據(jù)交換時,協(xié)議控制的數(shù)據(jù)包頭部較小处硬。在不包含頭部的情況下,服務(wù)端到客戶端的包頭只有2~10字節(jié)(取決于數(shù)據(jù)包長度)拇派,客戶端到服務(wù)端的的話荷辕,需要加上額外的4字節(jié)的掩碼。而HTTP協(xié)議每次通信都需要攜帶完整的頭部件豌。支持?jǐn)U展ws協(xié)議定義了擴展疮方,用戶可以擴展協(xié)議,或者實現(xiàn)自定義的子協(xié)議茧彤。(比如支持自定義壓縮算法等)

CSS部分:

css3新增:

CSS3邊框如border-radius骡显,box-shadow等;CSS3背景如background-size,background-origin等惫谤;CSS3 2D壁顶,3D轉(zhuǎn)換如transform等恤煞;CSS3動畫如animation等验懊。

CSS3的新特性中示括,在布局方面新增了flex布局概页,在選擇器方面新增了例如first-of-type,nth-child等選擇器照弥,在盒模型方面添加了box-sizing來改變盒模型锁蠕,在動畫方面增加了animation养葵,2d變換入客,3d變換等自阱,在顏色方面添加透明嚎莉,rbga等,在字體方面允許嵌入字體和設(shè)置字體陰影沛豌,最后還有媒體查訊等.

css的兩種盒模型

在標(biāo)準(zhǔn)的盒子模型中趋箩,width指content部分的寬度

在IE盒子模型中,width表示content+padding+border這三個部分的寬度

如果想要切換盒模型也很簡單琼懊,這里需要借助css3的box-sizing屬性

box-sizing: content-box 是W3C盒子模型

box-sizing: border-box 是IE盒子模型

box-sizing的默認(rèn)屬性是content-box

垂直居中方式:

使用定位和負(fù)外邊距阁簸,父元素,子元素固定寬高哼丈,父相子絕启妹,子元素top屬性50%,上外邊距margin-top為子元素本身高度的一半(這種方式需要知道子元素的高度)

使用定位和transform,父元素固定寬高醉旦,父相子絕饶米,子元素top屬性50%,transform屬性為Y軸方向偏移-50%

使用定位自動外邊距,父元素车胡,子元素固定寬高檬输,父相子絕,子元素top匈棘,bottom屬性為0,margin在垂直方向auto

使用flex布局丧慈,父元素,子元素固定寬高主卫,父元素使用flex布局逃默,設(shè)置align-items屬性為center

使用flex布局,父元素簇搅,子元素固定寬高完域,父元素使用flex布局,設(shè)置flex-direction屬性(設(shè)置主軸方向)為column(縱軸),justify-content屬性設(shè)置主軸上的對齊方式為center

使用 display:table-cell 瘩将,父元素固定寬高吟税,父元素設(shè)置display:table凹耙,子元素設(shè)置display:table-cell,并且vertical-align:middle

transition和animation的區(qū)別:

animation和transition大部分屬性是相同的肠仪,他們都是隨時間改變元素的屬性值肖抱,他們的主要區(qū)別是transition需要觸發(fā)一個事件才能改變屬性,而animation不需要觸發(fā)任何事件的情況下才會隨時間改變屬性值藤韵,并且transition為2幀虐沥,從from .... to,而animation可以一幀一幀的泽艘。

animation屬性

name 設(shè)置動畫的名稱欲险,

duration 設(shè)置動畫完成的周期,

timing-function 設(shè)置動畫的速度曲線匹涮,

delay 設(shè)置動畫什么時候開始天试,

iteration-count 設(shè)置動畫播放的次數(shù),

direction 規(guī)定下一個周期是否逆向的播放然低,

play-state 動畫是否正在進(jìn)行或者暫停喜每,

fill-mode 設(shè)置動畫停了之后位置什么狀態(tài)transition屬性

property 去設(shè)置過渡效果的屬性名稱,

duration 設(shè)置過渡效果的周期雳攘,

timing-function 規(guī)定速度效果的速度曲線带兜,

delay 設(shè)定過渡效果什么時候開始;區(qū)別:

transition 是過渡吨灭,是樣式值的變化的過程刚照,只有開始和結(jié)束;animation 其實也叫關(guān)鍵幀喧兄,通過和 @keyframe 結(jié)合可以設(shè)置中間幀的一個狀態(tài)无畔;

animation 配合 @keyframe 可以不觸發(fā)事件就觸發(fā)這個過程,而 transition 需要通過 hover 或者 js 事件來配合觸發(fā)吠冤;

animation 可以設(shè)置很多的屬性浑彰,比如循環(huán)次數(shù),動畫結(jié)束的狀態(tài)等等拯辙,transition 只能觸發(fā)一次郭变;

animation 可以結(jié)合 keyframe 設(shè)置每一幀,但是 transition 只有兩幀涯保;

在性能方面:瀏覽器有一個主線程和排版線程饵较;主線程一般是對 js 運行的、頁面布局遭赂、生成位圖等等,然后把生成好的位圖傳遞給排版線程横辆,而排版線程會通過 GPU 將位圖繪制到頁面上撇他,也會向主線程請求位圖等等茄猫;我們在用使用 animation 的時候這樣就可以改變很多屬性,像我們改變了 width困肩、height划纽、position 等等這些改變文檔流的屬性的時候就會引起,頁面的回流和重繪锌畸,對性能影響就比較大勇劣,但是我們用 transition 的時候一般會結(jié)合 transform 來進(jìn)行旋轉(zhuǎn)和縮放等不會生成新的位圖,當(dāng)然也就不會引起頁面的重排了潭枣;

transition比默、transform和translate這三者

transform是轉(zhuǎn)換,指的是改變所在元素的外觀盆犁,它有很多種手段(轉(zhuǎn)換函數(shù))來改變外觀命咐,例如 位移、縮放谐岁、旋轉(zhuǎn)等醋奠,而其中的位移的函數(shù)名就叫translate,所以說伊佃,translate是transform的一部分窜司。

transform: [轉(zhuǎn)換函數(shù)];

屬性函數(shù):

translate(x, y):元素位移,元素偏移的x軸和y軸距離航揉,可為負(fù)

scale(x, y):元素縮放塞祈,元素x軸和y軸縮放的倍數(shù),小于1為縮小迷捧,大于1位放大织咧,小于0效果和為0時相等

rotate(angle):元素旋轉(zhuǎn),旋轉(zhuǎn)的角度漠秋,單位deg笙蒙,順時針旋轉(zhuǎn)

transform: translate(-10px, 10px);//當(dāng)前元素往上移動 10 像素,往右移動 10 像素庆锦。 transform: translate(10px, 10px) rotate(10deg);//指定多個轉(zhuǎn)換效果捅位。 復(fù)制代碼

transition是過渡,指的是某個CSS屬性值如何平滑的進(jìn)行改變搂抒,就是平常說的 動效艇搀。而transform是沒有動畫效果,你改變了它的值求晶,元素的樣子就唰的改變了焰雕。

transition: [屬性名] [持續(xù)時間] [速度曲線] [延遲時間]; transition: height 2s ease .5s;//高度屬性的值改變時,延遲 0.5 秒后以 ease 曲線進(jìn)行過渡芳杏,持續(xù)2秒矩屁。 復(fù)制代碼

visibility=hidden, opacity=0辟宗,display:none:

opacity=0,該元素隱藏起來了吝秕,但不會改變頁面布局泊脐,并且,如果該元素已經(jīng)綁定一些事件烁峭,如click事件容客,那么點擊該區(qū)域,也能觸發(fā)點擊事件的方法约郁。

visibility=hidden缩挑,該元素隱藏起來了,但不會改變頁面布局棍现,但是不會觸發(fā)該元素已經(jīng)綁定的事件调煎。

display=none,把元素隱藏起來己肮,并且會改變頁面布局士袄,可以理解成在頁面中把該元素刪除掉一樣。

position屬性比較:

固定定位fixed:

元素的位置相對于瀏覽器窗口是固定位置谎僻,即使窗口是滾動的它也不會移動娄柳。Fixed定位使元素的位置與文檔流無關(guān),因此不占據(jù)空間艘绍。 Fixed定位的元素和其他元素重疊赤拒。

相對定位relative:相對于他原本的位置進(jìn)行移動

如果對一個元素進(jìn)行相對定位,它將出現(xiàn)在它所在的位置上诱鞠。然后挎挖,可以通過設(shè)置垂直或水平位置,讓這個元素“相對于”它的起點進(jìn)行移動航夺。 在使用相對定位時蕉朵,無論是否進(jìn)行移動,元素仍然占據(jù)原來的空間阳掐。因此始衅,移動元素會導(dǎo)致它覆蓋其它框。

絕對定位absolute:相對于他的父元素進(jìn)行移動

絕對定位的元素的位置相對于最近的已定位父元素缭保,如果元素沒有已定位的父元素汛闸,那么它的位置相對于<html>。 absolute 定位使元素的位置與文檔流無關(guān)艺骂,因此不占據(jù)空間诸老。 absolute 定位的元素和其他元素重疊。

粘性定位sticky:

先是相對于他原本的位置進(jìn)行移動钳恕,然后在超出目標(biāo)區(qū)域后别伏,固定在目標(biāo)位置吮廉,即先按照relative定位方式定位,然后按照fix定位方式定位畸肆。 元素先按照普通文檔流定位,然后相對于該元素在流中的flow root(BFC)和 containing block(最近的塊級祖先元素)定位宙址。而后轴脐,元素定位表現(xiàn)為在跨越特定閾值前為相對定位,之后為固定定位抡砂。

默認(rèn)定位Static:

默認(rèn)值大咱。沒有定位,元素出現(xiàn)在正常的流中(忽略top, bottom, left, right 或者 z-index 聲明)注益。

繼承定位inherit:

規(guī)定應(yīng)該從父元素繼承position 屬性的值碴巾。

浮動清除的幾種方法:

方法一:使用帶clear屬性的空元素

在浮動元素后使用一個空元素如<div class="clear"></div>,并在CSS中賦予.clear{clear:both;}屬性即可清理浮動丑搔。亦可使用<br class="clear" />或<hr class="clear" />來進(jìn)行清理厦瓢。

方法二:使用CSS的overflow屬性

給浮動元素的容器添加overflow:hidden;或overflow:auto;可以清除浮動,另外在 IE6 中還需要觸發(fā) hasLayout 啤月,例如為父元素設(shè)置容器寬高或設(shè)置 zoom:1煮仇。

在添加overflow屬性后,浮動元素又回到了容器層谎仲,把容器高度撐起浙垫,達(dá)到了清理浮動的效果。

方法三:給浮動的元素的容器添加浮動

給浮動元素的容器也添加上浮動屬性即可清除內(nèi)部浮動郑诺,但是這樣會使其整體浮動夹姥,影響布局,不推薦使用辙诞。

方法四:使用鄰接元素處理

什么都不做辙售,給浮動元素后面的元素添加clear屬性。

方法五:使用CSS的:after偽元素

結(jié)合:after 偽元素(注意這不是偽類倘要,而是偽元素圾亏,代表一個元素之后最近的元素)和 IEhack ,可以完美兼容當(dāng)前主流的各大瀏覽器封拧,這里的 IEhack 指的是觸發(fā) hasLayout志鹃。

給浮動元素的容器添加一個clearfix的class,然后給這個class添加一個:after偽元素實現(xiàn)元素末尾添加一個看不見的塊元素(Block element)清理浮動泽西。

CSS選擇器有哪些曹铃,優(yōu)先級呢:

CSS的四種基本選擇器和四種高級選擇器:

基本選擇器:

標(biāo)簽選擇器:針對一類標(biāo)簽

P{}:選擇所有<p>元素

ID選擇器:針對某一個特定的標(biāo)簽使用

#id{}:選擇所有id="firstname"的元素

類選擇器:針對你想要的所有標(biāo)簽使用

.class{}:選擇所有class="intro"的元素

通用選擇器(通配符):針對所有的標(biāo)簽都適用(不建議使用)

:選擇所有元素

高級選擇器:

后代選擇器:用空格隔開

div p: 選擇<div>元素內(nèi)的所有<p>元素

div>p: 選擇所有父級是 <div> 元素的 <p> 元素

div+p: 選擇所有緊接著<div>元素之后的<p>元素

屬性選擇器:帶有屬性或指定屬性內(nèi)容

[target]:選擇所有帶有target屬性元素

[target=-blank]:選擇所有使用target="-blank"的元素

[title~=flower]:選擇標(biāo)題屬性包含單詞"flower"的所有元素

[lang|=en]:選擇 lang 屬性以 en 為開頭的所有元素

交集選擇器:用.隔開

h3.special:選擇<h3>標(biāo)簽并且類是.special的標(biāo)簽

并集選擇器(分組選擇器):用逗號隔開

div,p: 選擇所有<div>元素和<p>元素

p,h1,#mytitle,.one:選擇所有帶有p,h1,id="mytitle",class="one"的標(biāo)簽

偽類選擇器:

靜態(tài)偽類選擇器:

a:link:選擇所有未訪問鏈接

a:visited:選擇所有訪問過的鏈接

動態(tài)偽類選擇器:

a:active:選擇活動鏈接

a:hover:選擇鼠標(biāo)在鏈接上面時

input:focus:選擇具有焦點的輸入元素

序偽類選擇器:

p:first-letter:選擇每一個p元素的第一個字母

p:first-line:選擇每一個p元素的第一行

p:first-child:指定只有當(dāng)p元素是其父級的第一個子級的樣式。

p:before:在每個p元素之前插入內(nèi)容

p:after:在每個p元素之后插入內(nèi)容

Css3新增選擇器: p~ul:選擇p元素之后的每一個ul元素

a[src^"ttps"]:選擇每一個src屬性的值以"https "開頭的元素

a[src$=". pdf"]:選擇每一個src屬性的值以” pdf結(jié)尾的元素

a[src*=" runoob"]:選擇每一個src屬性的值包含子字符串" 'runoob"的元素

p:first-of-type:選擇每個p元素是其父級的第一個p元素

p:last-of-type:選擇每個p元素是其父級的最后一個p元素

p:only-of-type:選擇每個p元素是其父級的唯一p元素

p:only-child:選擇每個p元素是其父級的唯一子元素

p:nth-child(2):選擇每個p元素是其父級的第二個子元素

p::nth-child(-n+3):選擇每個p元素是其父級的前三個子元素

p:th-last-child(2):選擇每個p元素的是其父級的第二個子元素,從最后一個子項計數(shù)

p:th-of-type(2):選擇每個p元素是其父級的第二個p元素

p:nth-last-of-type(2):選擇每個p元素的是其父級的第二個p元素捧杉, 從最后一個子項計數(shù)

p:last-child:選擇每個p元素是其父級的最后-個子級陕见。

.root:選擇文檔的根元素

p:empty:選擇每個沒有任何子級的p元素(包括文本節(jié)點)

#news:target:選擇當(dāng)前活動的#news元素(包含該錨名稱的點擊的URL)

inputenabled:選擇每一個已啟用的輸入元素

input:disabled:選擇每一個禁用的輸入元素

input.checked:選擇每個選中的輸入元素

:not(p):選擇每個并非p元素的元素

:selection:匹配元素中被用戶選中或處于高亮狀態(tài)的部分

:out-of-range:匹配值在指定區(qū)間之外的input元素

:in-range:匹配值在指定區(qū)間之內(nèi)的input元素

.read-write:用于匹配可讀及可寫的元素

:read-only:用于匹配設(shè)置"readonly" (只讀)屬性的元素

:optional:用于匹配可選的輸入元素

.required:用于匹配設(shè)置了"required" 屬性的元素

valid:用于匹配輸入值為臺法的元素

cinvalid:用于匹配輸入值為非法的元素

Css選擇器優(yōu)先級:

在屬性后面使用 !important 會覆蓋頁面內(nèi)任何位置定義的元素樣式秘血。

作為style屬性寫在元素內(nèi)的樣式

id選擇器

類選擇器

元素選擇器

通配符選擇器

瀏覽器自定義或繼承

margin塌陷和合并問題:

首先,margin塌陷是相對于父子級關(guān)系的兩個元素评甜,而margin合并是相對兩個兄弟級關(guān)系的兩個元素

兩個兄弟級關(guān)系的元素灰粮,垂直方向上的margin,其外邊距會發(fā)生重疊現(xiàn)象忍坷,兩者兩個的外邊距取的是兩個所設(shè)置margin的最大值粘舟,就是所說的margin合并問題

兩個父子級關(guān)系的元素,垂直方向上的margin會粘合在一起佩研,外層和模型的margin-top取兩個元素中margin-top的最大值柑肴,發(fā)生margin塌陷的內(nèi)層元素相對于整個文檔移動

解決方案:兩者都可以通過觸發(fā)BFC來解決

什么是BFC:

直譯成:塊級格式化上下文,是一個獨立的渲染區(qū)域旬薯,并且有一定的布局規(guī)則晰骑。

BFC區(qū)域不會與float box重疊。

BFC是頁面上的一個獨立容器绊序,子元素不會影響到外面硕舆。

計算BFC的高度時,浮動元素也會參與計算政模。

并且在一個BFC中岗宣,塊盒與行盒(行盒由一行中所有的內(nèi)聯(lián)元素所組成)都會垂直的沿著其父元素的邊框排列。

哪些元素會生成BFC:

float不為none的元素

position為fixed和absolute的元素

display為inline-block淋样、table-cell耗式、table-caption,flex趁猴,inline-flex的元素

overflow不為visible的元素

inline-block刊咳、inline和block的區(qū)別:

Block是塊級元素,其前后都會有換行符儡司,能設(shè)置寬度娱挨,高度,margin/padding水平垂直方向都有效捕犬。

Inline:設(shè)置width和height無效跷坝,margin在豎直方向上無效,padding在水平方向垂直方向都有效碉碉,前后無換行符

Inline-block:能設(shè)置寬度高度柴钻,margin/padding水平垂直方向 都有效,前后無換行符

px垢粮、em贴届、rem、%、vw毫蚓、vh占键、vm這些單位的區(qū)別

em:參考的是父元素的font-size,具有繼承的特點元潘,如果自身定義了font-size則按自身來計算(瀏覽器默認(rèn)字體是16px)畔乙,整個頁面內(nèi)1em不是一個固定的值

rem:相對于根元素html,可以設(shè)置根元素html的font-size為10px翩概,則1.2em就是12px啸澡;

vw:css3新單位,view width的縮寫氮帐,是指可視窗口的高度,假如寬度是1200px,則10vw就是120px洛姑;舉個例子:瀏覽器寬度1200px, 1 vw = 1200px/100 = 12 px上沐。

Vh:類似vw,指的是可視窗口的高度楞艾。

Vm:相對于視口的寬度或高度中較小的那個参咙,其中最小的單位被均分為100個單位,舉個例子:瀏覽器高度900px硫眯,寬度1200px蕴侧,取最小的瀏覽器高度,1 vm = 900px/100 = 9 px两入。

flex布局:

常用的Flex屬性:

display:指定 HTML 元素盒子類型净宵。

flex-direction:指定了彈性容器中子元素的排列方式

row:橫向從左到右排列(左對齊),默認(rèn)的排列方式裹纳。

row-reverse:反轉(zhuǎn)橫向排列(右對齊择葡,從后往前排,最后一項排在最前面剃氧。

column:縱向排列敏储。

column-reverse:反轉(zhuǎn)縱向排列,從后往前排朋鞍,最后一項排在最上面已添。

justify-content:設(shè)置彈性盒子元素在主軸(橫軸)方向上的對齊方式。

flex-start:彈性項目向行頭緊挨著填充滥酥。這個是默認(rèn)值更舞。第一個彈性項的main-start外邊距邊線被放置在該行的main-start邊線,而后續(xù)彈性項依次平齊擺放恨狈。

flex-end:彈性項目向行尾緊挨著填充疏哗。第一個彈性項的main-end外邊距邊線被放置在該行的main-end邊線,而后續(xù)彈性項依次平齊擺放。

center:彈性項目居中緊挨著填充返奉。(如果剩余的自由空間是負(fù)的贝搁,則彈性項目將在兩個方向上同時溢出)。

space-between:彈性項目平均分布在該行上芽偏。如果剩余空間為負(fù)或者只有一個彈性項雷逆,則該值等同于flex-start。否則污尉,第1個彈性項的外邊距和行的main-start邊線對齊膀哲,而最后1個彈性項的外邊距和行的main-end邊線對齊,然后剩余的彈性項分布在該行上被碗,相鄰項目的間隔相等某宪。

space-around:彈性項目平均分布在該行上,兩邊留有一半的間隔空間锐朴。如果剩余空間為負(fù)或者只有一個彈性項兴喂,則該值等同于center。否則焚志,彈性項目沿該行分布衣迷,且彼此間隔相等(比如是20px),同時首尾兩邊和彈性容器之間留有一半的間隔(1/2*20px=10px)酱酬。

align-items:設(shè)置彈性盒子元素在側(cè)軸(縱軸)方向上的對齊方式壶谒。

flex-start:彈性盒子元素的側(cè)軸(縱軸)起始位置的邊界緊靠住該行的側(cè)軸起始邊界。

flex-end:彈性盒子元素的側(cè)軸(縱軸)起始位置的邊界緊靠住該行的側(cè)軸結(jié)束邊界膳沽。

center:彈性盒子元素在該行的側(cè)軸(縱軸)上居中放置汗菜。(如果該行的尺寸小于彈性盒子元素的尺寸,則會向兩個方向溢出相同的長? + 度)挑社。

baseline:如彈性盒子元素的行內(nèi)軸與側(cè)軸為同一條呵俏,則該值與'flex-start'等效。其它情況下滔灶,該值將參與基線對齊普碎。

stretch:如果指定側(cè)軸大小的屬性值為'auto',則其值會使項目的邊距盒的尺寸盡可能接近所在行的尺寸录平,但同時會遵照'min/max-width/height'屬性的限制麻车。

flex-wrap:設(shè)置彈性盒子的子元素超出父容器時是否換行。

nowrap - 默認(rèn)斗这, 彈性容器為單行动猬。該情況下彈性子項可能會溢出容器。

wrap - 彈性容器為多行表箭。該情況下彈性子項溢出的部分會被放置到新行赁咙,子項內(nèi)部會發(fā)生斷行

wrap-reverse -反轉(zhuǎn) wrap 排列。

align-content:修改 flex-wrap 屬性的行為,類似 align-items, 但不是設(shè)置子元素對齊彼水,而是設(shè)置行對齊崔拥。

stretch - 默認(rèn)。各行將會伸展以占用剩余的空間凤覆。

flex-start - 各行向彈性盒容器的起始位置堆疊链瓦。

flex-end - 各行向彈性盒容器的結(jié)束位置堆疊。

center -各行向彈性盒容器的中間位置堆疊盯桦。

space-between -各行在彈性盒容器中平均分布慈俯。

space-around - 各行在彈性盒容器中平均分布,兩端保留子元素與子元素之間間距大小的一半拥峦。

flex-flow:flex-direction 和 flex-wrap 的簡寫

order:設(shè)置彈性盒子的子元素排列順序贴膘。

integer:用整數(shù)值來定義排列順序,數(shù)值小的排在前面略号〔郊可以為負(fù)值。

align-self:在彈性子元素上使用璃哟。覆蓋容器的 align-items 屬性。

auto:如果'align-self'的值為'auto'喊递,則其計算值為元素的父元素的'align-items'值随闪,如果其沒有父元素,則計算值為'stretch'骚勘。

flex-start:彈性盒子元素的側(cè)軸(縱軸)起始位置的邊界緊靠住該行的側(cè)軸起始邊界铐伴。

flex-end:彈性盒子元素的側(cè)軸(縱軸)起始位置的邊界緊靠住該行的側(cè)軸結(jié)束邊界。

center:彈性盒子元素在該行的側(cè)軸(縱軸)上居中放置俏讹。(如果該行的尺寸小于彈性盒子元素的尺寸当宴,則會向兩個方向溢出相同的長度)。

baseline:如彈性盒子元素的行內(nèi)軸與側(cè)軸為同一條泽疆,則該值與'flex-start'等效户矢。其它情況下,該值將參與基線對齊殉疼。

stretch:如果指定側(cè)軸大小的屬性值為'auto'梯浪,則其值會使項目的邊距盒的尺寸盡可能接近所在行的尺寸,但同時會遵照'min/max-width/height'屬性的限制瓢娜。

flex:設(shè)置彈性盒子的子元素如何分配空間挂洛。

auto: 計算值為 1 1 auto

initial: 計算值為 0 1 auto

none:計算值為 0 0 auto

inherit:從父元素繼承

[ flex-grow ]:定義彈性盒子元素的擴展比率。

[ flex-shrink ]:定義彈性盒子元素的收縮比率眠砾。

[ flex-basis ]:定義彈性盒子元素的默認(rèn)基準(zhǔn)值虏劲。

流式布局與響應(yīng)式布局的區(qū)別:

常用的Flex屬性:

流式布局:使用非固定像素來定義網(wǎng)頁內(nèi)容,也就是百分比布局,通過盒子的度設(shè)置成百分比來根據(jù)屏幕的寬度來進(jìn)行伸縮柒巫,不受固定像素的限制励堡,內(nèi)容自動填充。

響應(yīng)式布局吻育,利用css3中的Media Query(媒介查詢)念秧,通過查詢screen的寬度來指定某個寬度區(qū)間的網(wǎng)頁布局 超小屏幕(移動設(shè)備):768px以下 小屏設(shè)備:768px-992px;

中屏設(shè)備:992-1200px;

寬屏設(shè)備:1200px以上

由于響應(yīng)式布局開發(fā)顯得繁瑣布疼,一般使用第三方響應(yīng)式框架來完成摊趾,比如bootstrap來完成一部分工作

三欄布局的實現(xiàn)方式:

常用的Flex屬性:

浮動

三欄設(shè)置高度,左右欄固定寬度游两,并分別設(shè)置左右浮動

優(yōu)點:兼容性好

缺點:浮動脫離文檔流砾层,需要做清除浮動的處理

絕對定位

父級元素設(shè)置絕對定位,左右欄固定寬度贱案,左欄設(shè)置left:0肛炮;右欄設(shè)置right:0;中間欄設(shè)置left和right分別為左右欄的寬度

優(yōu)點:快捷宝踪,不容易出問題

缺點:布局脫離文檔流侨糟,子元素也必須脫離文檔流,可使用性較差

Flex布局

父元素設(shè)置display:flex瘩燥,左右欄固定寬度秕重,中間欄設(shè)置flex:1,占據(jù)剩余空間

優(yōu)點:較為完美厉膀,移動端布局多屬flex

表格布局

父元素設(shè)置display:table,左右中三欄全部設(shè)置display:table-cell,左右欄固定寬度

優(yōu)點:兼容性好

缺點:操作繁瑣溶耘,當(dāng)其中一個單元格高度變大,其他單元格高度會隨之變大

網(wǎng)格布局

父元素設(shè)置display:grid服鹅,固定寬度凳兵,grid-template-rows: 100px;grid-template-columns: 300px auto 300px;優(yōu)點:可以做許多復(fù)雜的事情,代碼比較簡潔

缺點:新技術(shù)企软,低版本瀏覽器兼容性不好

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庐扫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仗哨,更是在濱河造成了極大的恐慌聚蝶,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藻治,死亡現(xiàn)場離奇詭異碘勉,居然都是意外死亡,警方通過查閱死者的電腦和手機桩卵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門验靡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倍宾,“玉大人,你說我怎么就攤上這事胜嗓「咧埃” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵辞州,是天一觀的道長怔锌。 經(jīng)常有香客問我,道長变过,這世上最難降的妖魔是什么埃元? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮媚狰,結(jié)果婚禮上岛杀,老公的妹妹穿的比我還像新娘。我一直安慰自己崭孤,他們只是感情好类嗤,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辨宠,像睡著了一般遗锣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗤形,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天精偿,我揣著相機與錄音赚导,去河邊找鬼臭胜。 笑死肢娘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毡惜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼斯撮,長吁一口氣:“原來是場噩夢啊……” “哼经伙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勿锅,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤帕膜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溢十,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垮刹,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年张弛,在試婚紗的時候發(fā)現(xiàn)自己被綠了荒典。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酪劫。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寺董,靈堂內(nèi)的尸體忽然破棺而出覆糟,到底是詐尸還是另有隱情,我是刑警寧澤遮咖,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布滩字,位于F島的核電站,受9級特大地震影響御吞,放射性物質(zhì)發(fā)生泄漏麦箍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一魄藕、第九天 我趴在偏房一處隱蔽的房頂上張望内列。 院中可真熱鬧,春花似錦背率、人聲如沸话瞧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽交排。三九已至,卻和暖如春饵筑,著一層夾襖步出監(jiān)牢的瞬間埃篓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工根资, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留架专,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓玄帕,卻偏偏與公主長得像部脚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裤纹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353