從輸入U(xiǎn)RL到瀏覽器顯示頁面發(fā)生了什么

一切盡在圖中

1、輸入網(wǎng)址

當(dāng)你開始輸入網(wǎng)址,比如:www.163.com時(shí),瀏覽器可以在書簽或者歷史記錄里面去搜索相關(guān)的網(wǎng)址推薦給你

2、瀏覽器查找域名的ip地址

(1)請求發(fā)起后,瀏覽器首先會(huì)解析這個(gè)域名,首先它會(huì)查看本地硬盤的 hosts 文件,看看其中有沒有和這個(gè)域名對應(yīng)的規(guī)則,如果有的話就直接使用 hosts 文件里面的 ip 地址。

(2)?如果在本地的 hosts 文件沒有能夠找到對應(yīng)的 ip 地址,瀏覽器會(huì)發(fā)出一個(gè) DNS請求到本地DNS(域名分布系統(tǒng))服務(wù)器 。本地DNS服務(wù)器一般都是你的網(wǎng)絡(luò)接入服務(wù)器商提供,比如中國電信,中國移動(dòng)。

(3)查詢你輸入的網(wǎng)址的DNS請求到達(dá)本地DNS服務(wù)器之后,本地DNS服務(wù)器會(huì)首先查詢它的緩存記錄,如果緩存中有此條記錄,就可以直接返回結(jié)果,此過程是遞歸的方式進(jìn)行查詢。如果沒有,本地DNS服務(wù)器還要向DNS根服務(wù)器進(jìn)行查詢

(4)根DNS服務(wù)器沒有記錄具體的域名和IP地址的對應(yīng)關(guān)系,而是告訴本地DNS服務(wù)器,你可以到域服務(wù)器上去繼續(xù)查詢,并給出域服務(wù)器的地址。這種過程是迭代的過程

(5)本地DNS服務(wù)器繼續(xù)向域服務(wù)器發(fā)出請求,在這個(gè)例子中,請求的對象是.com域服務(wù)器。.com域服務(wù)器收到請求之后,也不會(huì)直接返回域名和IP地址的對應(yīng)關(guān)系,而是告訴本地DNS服務(wù)器,你的域名的解析服務(wù)器的地址

(6)最后,本地DNS服務(wù)器向域名的解析服務(wù)器發(fā)出請求,這時(shí)就能收到一個(gè)域名和IP地址對應(yīng)關(guān)系,本地DNS服務(wù)器不僅要把IP地址返回給用戶電腦,還要把這個(gè)對應(yīng)關(guān)系保存在緩存中,以備下次別的用戶查詢時(shí),可以直接返回結(jié)果,加快網(wǎng)絡(luò)訪問

3、建立tcp鏈接

? ? ? ? ?在拿到域名對應(yīng)的IP地址后,會(huì)以隨機(jī)端口(1024~~65535)向WEB服務(wù)器程序80端口發(fā)起TCP的連接請求,這個(gè)連接請求進(jìn)入到內(nèi)核的TCP/IP協(xié)議棧(用于識(shí)別該連接請求,解封包,一層一層的剝開),還有可能要經(jīng)過Netfilter防火墻(屬于內(nèi)核的模塊)的過濾,最終到達(dá)WEB程序,最終建立了TCP/IP的連接,對于客戶端與服務(wù)器的TCP鏈接,必然要說的就是『三次握手』。
? ? ? ?所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個(gè)TCP連接時(shí),需要客戶端和服務(wù)端總共發(fā)送3個(gè)包以確認(rèn)連接的建立。在socket編程中,這一過程由客戶端執(zhí)行connect來觸發(fā),整個(gè)流程如下圖所示:

(1)第一次握手:Client將標(biāo)志位SYN置為1,隨機(jī)產(chǎn)生一個(gè)值seq=J,并將該數(shù)據(jù)包發(fā)送給Server,Client進(jìn)入SYN_SENT狀態(tài),等待Server確認(rèn)。

? (2)第二次握手:Server收到數(shù)據(jù)包后由標(biāo)志位SYN=1知道Client請求建立連接,Server將標(biāo)志位SYN和ACK都置為1,ack=J+1,隨機(jī)產(chǎn)生一個(gè)值seq=K,并將該數(shù)據(jù)包發(fā)送給Client以確認(rèn)連接請求,Server進(jìn)入SYN_RCVD狀態(tài)。

? (3)第三次握手:Client收到確認(rèn)后,檢查ack是否為J+1,ACK是否為1,如果正確則將標(biāo)志位ACK置為1,ack=K+1,并將該數(shù)據(jù)包發(fā)送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進(jìn)入ESTABLISHED狀態(tài),完成三次握手,隨后Client與Server之間可以開始傳輸數(shù)據(jù)了。

? SYN攻擊:
? ? ? ? ?
在三次握手過程中,Server發(fā)送SYN-ACK之后,收到Client的ACK之前的TCP連接稱為半連接(half-open connect),此時(shí)Server處于SYN_RCVD狀態(tài),當(dāng)收到ACK后,Server轉(zhuǎn)入ESTABLISHED狀態(tài)。SYN攻擊就是Client在短時(shí)間內(nèi)偽造大量不存在的IP地址,并向Server不斷地發(fā)送SYN包,Server回復(fù)確認(rèn)包,并等待Client的確認(rèn),由于源地址是不存在的,因此,Server需要不斷重發(fā)直至超時(shí),這些偽造的SYN包將產(chǎn)時(shí)間占用未連接隊(duì)列,導(dǎo)致正常的SYN請求因?yàn)殛?duì)列滿而被丟棄,從而引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓。SYN攻擊時(shí)一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當(dāng)Server上有大量半連接狀態(tài)且源IP地址是隨機(jī)的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現(xiàn)行: #netstat -nap | grep SYN_RECV

4、瀏覽器向web服務(wù)器發(fā)起http請求

? HTTP簡介
? ? ? ? HTTP(超文本傳輸協(xié)議)是一個(gè)基于請求與響應(yīng)模式的、無狀態(tài)的、應(yīng)用層的協(xié)議,?;赥CP的連接方式,HTTP1.1版本中給出一種持續(xù)連接的機(jī)制,絕大多數(shù)的Web開發(fā),都是構(gòu)建在HTTP協(xié)議之上的Web應(yīng)用。

1、常用的HTTP方法有哪些?
? ? ?GET: 用于請求訪問已經(jīng)被URI(統(tǒng)一資源標(biāo)識(shí)符)識(shí)別的資源,可以通過URL傳參給服務(wù)器。
? ? ?POST:用于傳輸信息給服務(wù)器,主要功能與GET方法類似,但一般推薦使用POST方式。
? ? ?PUT: 傳輸文件,報(bào)文主體中包含文件內(nèi)容,保存到對應(yīng)URI位置。
? ? ?HEAD: 獲得報(bào)文首部,與GET方法類似,只是不返回報(bào)文主體,一般用于驗(yàn)證URI是否有效。
? ? ?DELETE:刪除文件,與PUT方法相反,刪除對應(yīng)URI位置的文件。
? ? ?OPTIONS:查詢相應(yīng)URI支持的HTTP方法。

2、GET方法與POST方法的區(qū)別
? ?(1)提交數(shù)據(jù)方式(位置):
? ? ? get重點(diǎn)在從服務(wù)器上獲取資源,post重點(diǎn)在向服務(wù)器發(fā)送數(shù)據(jù);get傳輸數(shù)據(jù)是通過URL請求,以field(字段)= value的形式,置于URL后,并用"?"連接,多個(gè)請求數(shù)據(jù)間用"&"連接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,這個(gè)過程用戶是可見的;
? ? ?post傳輸數(shù)據(jù)通過Http的post機(jī)制,將字段與對應(yīng)值封存在請求實(shí)體中發(fā)送給服務(wù)器,這個(gè)過程對用戶是不可見的;
? ? 因此,GET提交的數(shù)據(jù)會(huì)在地址欄中顯示出來,而POST提交,地址欄不會(huì)改變。

(2)傳輸數(shù)據(jù)的大小
? ? ? Get傳輸?shù)臄?shù)據(jù)量小,因?yàn)槭躑RL長度限制,但效率較高;
? ? ? Post可以傳輸大量數(shù)據(jù),所以上傳文件時(shí)只能用Post方式;

(3)安全性
? ? ?get是不安全的,因?yàn)閁RL是可見的,可能會(huì)泄露私密信息,如密碼等;
? ? ?post較get安全性較高;
? ? ?這里安全的含義是真正的Security的含義,比如:通過GET提交數(shù)據(jù),用戶名和密碼將明文出現(xiàn)在URL上,別人就可以拿到你的賬號(hào)和密碼了。

(4)傳的中文字符可能會(huì)亂碼
? ? ?get方式只能支持ASCII字符,向服務(wù)器傳的中文字符可能會(huì)亂碼。
? ? ?post支持標(biāo)準(zhǔn)字符集,可以正確傳遞中文字符。

(1) Web瀏覽器分別發(fā)送請求行、請求頭信息 、一個(gè)空行、請求體
? ? ? ? ? ?瀏覽器發(fā)送其請求命令之后,還要以頭信息的形式向Web服務(wù)器發(fā)送一些別的信息,之后瀏覽器發(fā)送了一空白行來通知服務(wù)器,它已經(jīng)結(jié)束了該頭信息的發(fā)送。?

(2)Web服務(wù)器應(yīng)答? 相應(yīng)行、相應(yīng)頭、空行、相應(yīng)體
? ? ? ? ? 客戶端向服務(wù)器發(fā)出請求后,服務(wù)器會(huì)客戶機(jī)回送應(yīng)答,?HTTP/1.1 200 OK ,應(yīng)答的第一部分是協(xié)議的版本號(hào)和應(yīng)答狀態(tài)碼。

(3)?Web服務(wù)器關(guān)閉TCP連接
? ? ? ? ? 一般情況下,一旦Web服務(wù)器向?yàn)g覽器發(fā)送了請求數(shù)據(jù),它就要關(guān)閉TCP連接,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼:

Connection:keep-alive
? ? ? ? TCP連接在發(fā)送后將仍然保持打開狀態(tài),于是,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請求。保持連接節(jié)省了為每個(gè)請求建立新連接所需的時(shí)間,還節(jié)約了網(wǎng)絡(luò)帶寬。

請求報(bào)文包含三部分:

a、請求行
? ? ?包含請求方法、URI、HTTP版本信息

b、請求首部字段
? ? ?請求頭部由關(guān)鍵字/值對組成,每行一對,關(guān)鍵字和值用英文冒號(hào)“:”分隔。請求頭部通知服務(wù)器有關(guān)于客戶端請求的信息,典型的請求頭有:
?User-Agent:產(chǎn)生請求的瀏覽器類型。
?Accept:客戶端可識(shí)別的內(nèi)容類型列表
?Host:請求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP地址,即虛擬主機(jī)。

c、空行
? ? ? 最后一個(gè)請求頭之后是一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請求頭。

d、請求內(nèi)容實(shí)體
? ? ? 請求數(shù)據(jù)不在GET方法中使用,而是在POST方法中使用。POST方法適用于需要客戶填寫表單的場合。與請求數(shù)據(jù)相關(guān)的最常使用的請求頭是Content-Type和Content-Length。

響應(yīng)報(bào)文包含三部分:
? ??
a、狀態(tài)行:包含HTTP版本、狀態(tài)碼、狀態(tài)碼的原因短語
? ? b、響應(yīng)首部字段
? ? c、空行
? ? d、響應(yīng)內(nèi)容實(shí)體

常見的HTTP相應(yīng)狀態(tài)碼
1xx:指示信息--表示請求已接收,繼續(xù)處
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作。? 301 永久重定向 302暫時(shí)性重定向
4xx:客戶端錯(cuò)誤--請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn)
5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請求

常見狀態(tài)代碼、狀態(tài)描述的說明如下:
200:請求被正常處理
204:請求被受理但沒有資源可以返回
206:客戶端只是請求資源的一部分,服務(wù)器只對請求的部分資源執(zhí)行GET方法,相應(yīng)報(bào)文中通過Content-Range指定范圍的資源。
301:永久性重定向
302:臨時(shí)重定向
303:與302狀態(tài)碼有相似功能,只是它希望客戶端在請求一個(gè)URI的時(shí)候,能通過GET方法重定向到另一個(gè)URI上
304:請求內(nèi)容沒有修改,客戶端使用緩存副本
307:臨時(shí)重定向,與302類似,只是強(qiáng)制要求使用POST方法
400:客戶端請求有語法錯(cuò)誤,服務(wù)器無法識(shí)別
401:請求需要認(rèn)證
403:請求的對應(yīng)資源禁止被訪問
404:服務(wù)器無法找到對應(yīng)資源
500:服務(wù)器內(nèi)部錯(cuò)誤
503:服務(wù)器正忙,當(dāng)前不能處理客戶端的請求,一段時(shí)間后可能恢復(fù)正常

常見HTTP首部字段
a、通用首部字段(請求報(bào)文與響應(yīng)報(bào)文都會(huì)使用的首部字段)
? ? ?Date:創(chuàng)建報(bào)文時(shí)間
? ? ?Connection:連接的管理
? ? ?Cache-Control:緩存的控制
? ? ?Transfer-Encoding:報(bào)文主體的傳輸編碼方式

b、請求首部字段(請求報(bào)文會(huì)使用的首部字段)
? ? ? Host:請求資源所在服務(wù)器
? ? ?Accept:可處理的媒體類
? ? ?Accept-Charset:可接收的字符集
? ? ?Accept-Encoding:可接受的內(nèi)容編碼
? ? ?Accept-Language:可接受的自然語言

c、響應(yīng)首部字段(響應(yīng)報(bào)文會(huì)使用的首部字段)
? ? ?Accept-Ranges:可接受的字節(jié)范圍
? ? ?Location:令客戶端重新定向到的URI
? ? ?Server:HTTP服務(wù)器的安裝信息

d、實(shí)體首部字段(請求報(bào)文與響應(yīng)報(bào)文的的實(shí)體部分使用的首部字段)
? ? ? Allow:資源可支持的HTTP方法
? ? ?Content-Type:實(shí)體主類的類型
? ? ?Content-Encoding:實(shí)體主體適用的編碼方式
? ? ?Content-Language:實(shí)體主體的自然語言
? ? ?Content-Length:實(shí)體主體的的字節(jié)
? ? ?Content-Range:實(shí)體主體的位置范圍,一般用于發(fā)出部分請求時(shí)使用

下面給出一個(gè)HTTP響應(yīng)報(bào)文例子

HTTPS、HTTP
http缺點(diǎn):
a、通信使用明文不加密,內(nèi)容可能被竊聽
b、不驗(yàn)證通信方身份,可能遭到偽裝
c、無法驗(yàn)證報(bào)文完整性,可能被篡改, HTTPS就是HTTP加上加密處理(一般是SSL安全通信線路)+認(rèn)證+完整性保護(hù)

HTTP優(yōu)化
利用負(fù)載均衡優(yōu)化和加速HTTP應(yīng)用
利用HTTP Cache來優(yōu)化網(wǎng)站

HTTP2.0版本新特性
多路復(fù)用,頭部壓縮,服務(wù)器推送,二進(jìn)制分幀層

5、服務(wù)器端處理

服務(wù)器端收到請求后的由web服務(wù)器(準(zhǔn)確說應(yīng)該是http服務(wù)器)處理請求,諸如Apache、Ngnix、IIS等。web服務(wù)器解析用戶請求,知道了需要調(diào)度哪些資源文件,再通過相應(yīng)的這些資源文件處理用戶請求和參數(shù),并調(diào)用數(shù)據(jù)庫信息,最后將結(jié)果通過web服務(wù)器返回給瀏覽器客戶端

6、關(guān)閉TCP鏈接
? ? ? ??
為了避免服務(wù)器與客戶端雙方的資源占用和損耗,當(dāng)雙方?jīng)]有請求或響應(yīng)傳遞時(shí),任意一方都可以發(fā)起關(guān)閉請求。與創(chuàng)建TCP連接的3次握手類似,關(guān)閉TCP連接,需要4次握手。
? ? ? ?所謂四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個(gè)TCP連接時(shí),需要客戶端和服務(wù)端總共發(fā)送4個(gè)包以確認(rèn)連接的斷開。在socket編程中,這一過程由客戶端或服務(wù)端任一方執(zhí)行close來觸發(fā),整個(gè)流程如下圖所示:

? ? ? ? 由于TCP連接是全雙工的,因此,每個(gè)方向都必須要單獨(dú)進(jìn)行關(guān)閉,這一原則是當(dāng)一方完成數(shù)據(jù)發(fā)送任務(wù)后,發(fā)送一個(gè)FIN來終止這一方向的連接,收到一個(gè)FIN只是意味著這一方向上沒有數(shù)據(jù)流動(dòng)了,即不會(huì)再收到數(shù)據(jù)了,但是在這個(gè)TCP連接上仍然能夠發(fā)送數(shù)據(jù),直到這一方向也發(fā)送了FIN。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方則執(zhí)行被動(dòng)關(guān)閉,上圖描述的即是如此。

(1)第一次揮手:Client發(fā)送一個(gè)FIN,用來關(guān)閉Client到Server的數(shù)據(jù)傳送,Client進(jìn)入FIN_WAIT_1狀態(tài)。
(2)第二次揮手:Server收到FIN后,發(fā)送一個(gè)ACK給Client,確認(rèn)序號(hào)為收到序號(hào)+1(與SYN相同,一個(gè)FIN占用一個(gè)序號(hào)),Server進(jìn)入CLOSE_WAIT狀態(tài)。
(3)第三次揮手:Server發(fā)送一個(gè)FIN,用來關(guān)閉Server到Client的數(shù)據(jù)傳送,Server進(jìn)入LAST_ACK狀態(tài)。
(4)第四次揮手:Client收到FIN后,Client進(jìn)入TIME_WAIT狀態(tài),接著發(fā)送一個(gè)ACK給Server,確認(rèn)序號(hào)為收到序號(hào)+1,Server進(jìn)入CLOSED狀態(tài),完成四次揮手。

? 上面是一方主動(dòng)關(guān)閉,另一方被動(dòng)關(guān)閉的情況,實(shí)際中還會(huì)出現(xiàn)同時(shí)發(fā)起主動(dòng)關(guān)閉的情況,具體流程如下圖:

?流程和狀態(tài)在上圖中已經(jīng)很明了了,在此不再贅述,可以參考前面的四次揮手解析步驟。

關(guān)于三次握手與四次揮手通常都會(huì)有典型的面試題,在此提出供有需求的XDJM們參考:
? ? (1)三次握手是什么或者流程?四次揮手呢?答案前面分析就是。
? ? (2)為什么建立連接是三次握手,而關(guān)閉連接卻是四次揮手呢?
? ? ? ?這是因?yàn)榉?wù)端在LISTEN狀態(tài)下,收到建立連接請求的SYN報(bào)文后,把ACK和SYN放在一個(gè)報(bào)文里發(fā)送給客戶端。而關(guān)閉連接時(shí),當(dāng)收到對方的FIN報(bào)文時(shí),僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方若全部數(shù)據(jù)都發(fā)送給對方了,所以己方可以立即close,也可以發(fā)送一些數(shù)據(jù)給對方后關(guān)閉,再發(fā)送FIN報(bào)文給對方來表示同意現(xiàn)在關(guān)閉連接,因此,己方ACK和FIN一般都會(huì)分開發(fā)送。

匯總Web瀏覽器與Web服務(wù)器之間一次完整的HTTP通信過程
1. 建立TCP連接
? ? ? ?在HTTP工作開始之前,Web瀏覽器首先要通過網(wǎng)絡(luò)與Web服務(wù)器建立連接,該連接是通過TCP來完成的,該協(xié)議與IP協(xié)議共同構(gòu)建 Internet,即著名的TCP/IP協(xié)議族,因此Internet又被稱作是TCP/IP網(wǎng)絡(luò)。HTTP是比TCP更高層次的應(yīng)用層協(xié)議,根據(jù)規(guī)則, 只有低層協(xié)議建立之后才能進(jìn)行更高層協(xié)議的連接,因此,首先要建立TCP連接,一般TCP連接的端口號(hào)是80或者443。

2. Web瀏覽器向Web服務(wù)器發(fā)送請求命令
? ? ?
一旦建立了TCP連接,Web瀏覽器就會(huì)向Web服務(wù)器發(fā)送請求命令。例如:GET/sample/hello.jsp HTTP/1.1。

3. Web瀏覽器發(fā)送請求頭信息
? ? ?
瀏覽器發(fā)送其請求命令之后,還要以頭信息的形式向Web服務(wù)器發(fā)送一些別的信息,之后瀏覽器發(fā)送了一空白行來通知服務(wù)器,它已經(jīng)結(jié)束了該頭信息的發(fā)送。

4.?Web服務(wù)器應(yīng)答
? ??
客戶端向服務(wù)器發(fā)出請求后,服務(wù)器會(huì)客戶機(jī)回送應(yīng)答,?HTTP/1.1 200 OK ,應(yīng)答的第一部分是協(xié)議的版本號(hào)和應(yīng)答狀態(tài)碼。

5.?Web服務(wù)器發(fā)送應(yīng)答頭信息
? ??
服務(wù)器也會(huì)隨同應(yīng)答向用戶發(fā)送關(guān)于它自己的數(shù)據(jù)及被請求的文檔。

6.?Web服務(wù)器向?yàn)g覽器發(fā)送數(shù)據(jù)
? ? ?
Web服務(wù)器向?yàn)g覽器發(fā)送頭信息后,它會(huì)發(fā)送一個(gè)空白行來表示頭信息的發(fā)送到此為結(jié)束,接著,它就以Content-Type應(yīng)答頭信息所描述的格式發(fā)送用戶所請求的實(shí)際數(shù)據(jù)。

7.?Web服務(wù)器關(guān)閉TCP連接
? ??
一般情況下,一旦Web服務(wù)器向?yàn)g覽器發(fā)送了請求數(shù)據(jù),它就要關(guān)閉TCP連接,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼:

Connection:keep-alive
? ? ?TCP連接在發(fā)送后將仍然保持打開狀態(tài),于是,瀏覽器可以繼續(xù)通過相同的連接發(fā)送請求。保持連接節(jié)省了為每個(gè)請求建立新連接所需的時(shí)間,還節(jié)約了網(wǎng)絡(luò)帶寬。

7、瀏覽器解析資源
? ? ?
對于獲取到的HTML、CSS、JS、圖片等等資源。
? ? ?瀏覽器通過解析HTML,生成DOM樹,解析CSS,生成CSS規(guī)則樹,然后通過DOM樹和CSS規(guī)則樹生成渲染樹。渲染樹與DOM樹不同,渲染樹中并沒有head、display為none等不必顯示的節(jié)點(diǎn)。
? ? ? 在解析CSS的同時(shí),可以繼續(xù)加載解析HTML,但在解析執(zhí)行JS腳本時(shí),會(huì)停止解析后續(xù)HTML,這就會(huì)出現(xiàn)阻塞問題。

8、瀏覽器布局渲染
? ? ?
根據(jù)渲染樹布局,計(jì)算CSS樣式,即每個(gè)節(jié)點(diǎn)在頁面中的大小和位置等幾何信息。HTML默認(rèn)是流式布局的,CSS和js會(huì)打破這種布局,改變DOM的外觀樣式以及大小和位置。這時(shí)就要提到兩個(gè)重要概念:repaint和reflow。
? ? ? repaint:屏幕的一部分重畫,不影響整體布局,比如某個(gè)CSS的背景色變了,但元素的幾何尺寸和位置不變。
? ? ?reflow: 意味著元件的幾何尺寸變了,我們需要重新驗(yàn)證并計(jì)算渲染樹。是渲染樹的一部分或全部發(fā)生了變化。這就是Reflow,或是Layout。

? ? ? ?有些情況下,比如修改了元素的樣式,瀏覽器并不會(huì)立刻 reflow 或 repaint 一次,而是會(huì)把這樣的操作積攢一批,然后做一次 reflow,這又叫異步 reflow 或增量異步 reflow。
? ? ? 有些情況下,比如 resize 窗口,改變了頁面默認(rèn)的字體等。對于這些操作,瀏覽器會(huì)馬上進(jìn)行 reflow。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容