Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
能夠?qū)懗龌镜捻撁妫ɡ锩姘瑘D片、各種標(biāo)簽和鏈接)
我們主要用的開發(fā)工具有chrome、hbuilder、Photoshop
瀏覽器是網(wǎng)頁顯示、運(yùn)行的平臺(tái),常用的瀏覽器有IE、火狐(Firefox)、谷歌(Chrome)、Safari和Opera等。我們平時(shí)稱為五大瀏覽器。
瀏覽器內(nèi)核又可以分成兩部分:渲染引擎(layout engineer 或者 Rendering Engine)和 JS 引擎。
渲染引擎 :它負(fù)責(zé)取得網(wǎng)頁的內(nèi)容(HTML、XML、圖像等等)、整理訊息(例如加入 CSS 等),以及計(jì)算網(wǎng)頁的顯示方式,然后會(huì)輸出至顯示器或打印機(jī)。瀏覽器的內(nèi)核的不同對(duì)于網(wǎng)頁的語法解釋會(huì)有不同,所以渲染的效果也不相同。
JS 引擎 則是解析 Javascript 語言,執(zhí)行 javascript語言來實(shí)現(xiàn)網(wǎng)頁的動(dòng)態(tài)效果。
最開始渲染引擎和 JS 引擎并沒有區(qū)分得很明確,后來 JS 引擎越來越獨(dú)立,內(nèi)核就傾向于只指渲染引擎。有一個(gè)網(wǎng)頁標(biāo)準(zhǔn)計(jì)劃小組制作了一個(gè) ACID 來測(cè)試引擎的兼容性和性能。內(nèi)核的種類很多,如果加上沒什么人使用的非商業(yè)的免費(fèi)內(nèi)核,可能會(huì)有10多種,但是常見的瀏覽器內(nèi)核可以分這四種:Trident、Gecko、Blink、Webkit。
了解一點(diǎn):移動(dòng)端的瀏覽器內(nèi)核主要說的是系統(tǒng)內(nèi)置瀏覽器的內(nèi)核。
Android手機(jī)而言,使用率最高的就是Webkit內(nèi)核,大部分國(guó)產(chǎn)瀏覽器宣稱的自己的內(nèi)核,基本上也是屬于webkit二次開發(fā)。
iOS以及WP7平臺(tái)上,由于系統(tǒng)原因,系統(tǒng)大部分自帶瀏覽器內(nèi)核,一般是Safari或者IE內(nèi)核Trident的
結(jié)構(gòu)標(biāo)準(zhǔn):結(jié)構(gòu)用于對(duì)網(wǎng)頁元素進(jìn)行整理和分類,咱們主要學(xué)的是HTML。 最重要
表現(xiàn)標(biāo)準(zhǔn):表現(xiàn)用于設(shè)置網(wǎng)頁元素的版式、顏色、大小等外觀樣式,主要指的是CSS。
行為標(biāo)準(zhǔn):行為是指網(wǎng)頁模型的定義及交互的編寫,咱們主要學(xué)的是 Javascript
HTML(英文Hyper Text Markup Language的縮寫)中文譯為“超文本標(biāo)簽語言”。是用來描述網(wǎng)頁的一種語言。
所謂超文本,因?yàn)樗梢约尤雸D片、聲音、動(dòng)畫、多媒體等內(nèi)容,不僅如此,它還可以從一個(gè)文件跳轉(zhuǎn)到另一個(gè)文件,與世界各地主機(jī)的文件連接。
<h1> 我是一個(gè)大標(biāo)題 </h1>
注意: 體會(huì) 文本 標(biāo)簽 語言 幾個(gè)詞語
總結(jié): HTML 作用就是用標(biāo)記標(biāo)簽來描述網(wǎng)頁,把網(wǎng)頁內(nèi)容在瀏覽器中展示出來。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
1.HTML標(biāo)簽:
作用所有HTML中標(biāo)簽的一個(gè)根節(jié)點(diǎn)。 最大的標(biāo)簽 根標(biāo)簽
2 head標(biāo)簽: 文檔的頭部
文檔的頭部描述了文檔的各種屬性和信息,包括文檔的標(biāo)題、在 Web 中的位置以及和其他文檔的關(guān)系等。絕大多數(shù)文檔頭部包含的數(shù)據(jù)都不會(huì)真正作為內(nèi)容顯示給讀者。
注意在head標(biāo)簽中我們必須要設(shè)置的標(biāo)簽是title
3.title標(biāo)簽: 文檔的標(biāo)題
作用:讓頁面擁有一個(gè)屬于自己的標(biāo)題。
4.body標(biāo)簽:文檔的主體 以后我們的頁面內(nèi)容 基本都是放到body里面的
body 元素包含文檔的所有內(nèi)容(比如文本、超鏈接、圖像、表格和列表等等。)
在HTML頁面中,帶有“< >”符號(hào)的元素被稱為HTML標(biāo)簽,如上面提到的 HTML、head、body都是HTML骨架結(jié)構(gòu)標(biāo)簽。所謂標(biāo)簽就是放在“< >” 標(biāo)簽符中表示某個(gè)功能的編碼命令,也稱為HTML標(biāo)簽或 HTML元素
1.雙標(biāo)簽
<標(biāo)簽名> 內(nèi)容 </標(biāo)簽名>
該語法中“<標(biāo)簽名>”表示該標(biāo)簽的作用開始,一般稱為“開始標(biāo)簽(start tag)”,“</標(biāo)簽名>” 表示該標(biāo)簽的作用結(jié)束,一般稱為“結(jié)束標(biāo)簽(end tag)”。和開始標(biāo)簽相比,結(jié)束標(biāo)簽只是在前面加了一個(gè)關(guān)閉符“/”。
比如 <body>我是文字 </body>
2.單標(biāo)簽
<標(biāo)簽名 />
單標(biāo)簽也稱空標(biāo)簽,是指用一個(gè)標(biāo)簽符號(hào)即可完整地描述某個(gè)功能的標(biāo)簽。
比如 <br />
標(biāo)簽的相互關(guān)系就分為兩種:
1.嵌套關(guān)系
<head> <title> </title> </head>
2.并列關(guān)系
<head></head> <body></body>
首先 HTML和CSS是兩種完全不同的語言,我們學(xué)的是結(jié)構(gòu),就只寫HTML標(biāo)簽,認(rèn)識(shí)標(biāo)簽就可以了。 不會(huì)再給結(jié)構(gòu)標(biāo)簽指定樣式了。
HTML標(biāo)簽有很多,這里我們學(xué)習(xí)最為常用的,后面有些較少用的,我們可以查下手冊(cè)就可以了。
排版標(biāo)簽
單詞縮寫: head 頭部. 標(biāo)題 title 文檔標(biāo)題
為了使網(wǎng)頁更具有語義化,我們經(jīng)常會(huì)在頁面中用到標(biāo)題標(biāo)簽,HTML提供了6個(gè)等級(jí)的標(biāo)題,即
<h1>、<h2>、<h3>、<h4>、<h5>和<h6>
其基本語法格式如下:
<hn> 標(biāo)題文本 </hn>
<p> 文本內(nèi)容 </p>
<hr />是單標(biāo)簽
<br />
div span 是沒有語義的 是我們網(wǎng)頁布局主要的2個(gè)盒子 css+div
div 就是 division 的縮寫 分割, 分區(qū)的意思 其實(shí)有很多div 來組合網(wǎng)頁。
span, 跨度,跨距;范圍
語法格式:
<div> 這是頭部 </div> <span>今日價(jià)格</span>
在網(wǎng)頁中,有時(shí)需要為文字設(shè)置粗體、斜體或下劃線效果,這時(shí)就需要用到HTML中的文本格式化標(biāo)簽,使文字以特殊的方式顯示。
b i s u 只有使用 沒有 強(qiáng)調(diào)的意思 strong em del ins 語義更強(qiáng)烈
使用HTML制作網(wǎng)頁時(shí),如果想讓HTML標(biāo)簽提供更多的信息,可以使用HTML標(biāo)簽的屬性加以設(shè)置。其基本語法格式如下:
<標(biāo)簽名 屬性1="屬性值1" 屬性2="屬性值2" …> 內(nèi)容 </標(biāo)簽名>
在上面的語法中,
1.標(biāo)簽可以擁有多個(gè)屬性,必須寫在開始標(biāo)簽中,位于標(biāo)簽名后面。
2.屬性之間不分先后順序,標(biāo)簽名與屬性、屬性與屬性之間均以空格分開。
3.任何標(biāo)簽的屬性都有默認(rèn)值,省略該屬性則取默認(rèn)值。
采取 鍵值對(duì) 的格式 key="value" 的格式
比如:
<hr width="400" />
屬性 是 寬度
值 是 400
單詞縮寫: image 圖像
HTML網(wǎng)頁中任何元素的實(shí)現(xiàn)都要依靠HTML標(biāo)簽,要想在網(wǎng)頁中顯示圖像就需要使用圖像標(biāo)簽,接下來將詳細(xì)介紹圖像標(biāo)簽<img />以及和他相關(guān)的屬性。其基本語法格式如下:
該語法中src屬性用于指定圖像文件的路徑和文件名,他是img標(biāo)簽的必需屬性。
<img src="圖像URL" />
單詞縮寫: anchor 的縮寫 [???k?(r)] 。基本解釋 錨, 鐵錨 的
在HTML中創(chuàng)建超鏈接非常簡(jiǎn)單,只需用標(biāo)簽環(huán)繞需要被鏈接的對(duì)象即可,其基本語法格式如下:
<a href="跳轉(zhuǎn)目標(biāo)" target="目標(biāo)窗口的彈出方式">文本或圖像</a>
href:用于指定鏈接目標(biāo)的url地址,當(dāng)為標(biāo)簽應(yīng)用href屬性時(shí),它就具有了超鏈接的功能。 Hypertext Reference的縮寫。意思是超文本引用
target:用于指定鏈接頁面的打開方式,其取值有self和blank兩種,其中self為默認(rèn)值,blank為在新窗口中打開方式。
注意:
1.外部鏈接 需要添加 http:// www.baidu.com
2.內(nèi)部鏈接 直接鏈接內(nèi)部頁面名稱即可 比如 < a href="index.html"> 首頁
3.如果當(dāng)時(shí)沒有確定鏈接目標(biāo)時(shí),通常將鏈接標(biāo)簽的href屬性值定義為“#”(即href="#"),表示該鏈接暫時(shí)為一個(gè)空鏈接。
4.不僅可以創(chuàng)建文本超鏈接,在網(wǎng)頁中各種網(wǎng)頁元素,如圖像、表格、音頻、視頻等都可以添加超鏈接。
通過創(chuàng)建錨點(diǎn)鏈接,用戶能夠快速定位到目標(biāo)內(nèi)容。
創(chuàng)建錨點(diǎn)鏈接分為兩步:
1.使用“a href=”#id名>“鏈接文本"</a>創(chuàng)建鏈接文本(被點(diǎn)擊的) <a href="#two"> 2.使用相應(yīng)的id名標(biāo)注跳轉(zhuǎn)目標(biāo)的位置。 <h3 id="two">第2集</h3>
base 可以設(shè)置整體鏈接的打開狀態(tài)
base 寫到 <head> </head> 之間
把所有的連接 都默認(rèn)添加 target="_blank"
在HTML中還有一種特殊的標(biāo)簽——注釋標(biāo)簽。如果需要在HTML文檔中添加一些便于閱讀和理解但又不需要顯示在頁面中的注釋文字,就需要使用注釋標(biāo)簽。其基本語法格式如下:
<!-- 注釋語句 --> ctrl + / 或者 ctrl +shift + /
注釋內(nèi)容不會(huì)顯示在瀏覽器窗口中,但是作為HTML文檔內(nèi)容的一部分,也會(huì)被下載到用戶的計(jì)算機(jī)上,查看源代碼時(shí)就可以看到。
實(shí)際工作中,通常新建一個(gè)文件夾專門用于存放圖像文件,這時(shí)再插入圖像,就需要采用“路徑”的方式來指定圖像文件的位置。
根目錄 當(dāng)前目錄
路徑可以分為: 相對(duì)路徑和絕對(duì)路徑
以引用文件之網(wǎng)頁所在位置為參考基礎(chǔ),而建立出的目錄路徑。因此,當(dāng)保存于不同目錄的網(wǎng)頁引用同一個(gè)文件時(shí),所使用的路徑將不相同,故稱之為相對(duì)路徑。
絕對(duì)路徑以Web站點(diǎn)根目錄為參考基礎(chǔ)的目錄路徑。之所以稱為絕對(duì),意指當(dāng)所有網(wǎng)頁引用同一個(gè)文件時(shí),所使用的路徑都是一樣的
“D:webimglogo.gif”,或完整的網(wǎng)絡(luò)地址,例如“http://www.itcast.cn/images/l...”。
無序列表的各個(gè)列表項(xiàng)之間沒有順序級(jí)別之分,是并列的。其基本語法格式如下:
<ul> <li>列表項(xiàng)1</li> <li>列表項(xiàng)2</li> <li>列表項(xiàng)3</li> ...... </ul>
注意:
有序列表即為有排列順序的列表,其各個(gè)列表項(xiàng)按照一定的順序排列定義,有序列表的基本語法格式如下:
<ol> <li>列表項(xiàng)1</li> <li>列表項(xiàng)2</li> <li>列表項(xiàng)3</li> ...... </ol>
所有特性基本與ul 一致。
但是實(shí)際工作中, 較少用 ol img src="media/1.jpg" />
定義列表常用于對(duì)術(shù)語或名詞進(jìn)行解釋和描述,定義列表的列表項(xiàng)前沒有任何項(xiàng)目符號(hào)。其基本語法如下:
<dl> <dt>名詞1</dt> <dd>名詞1解釋1</dd> <dd>名詞1解釋2</dd> ... <dt>名詞2</dt> <dd>名詞2解釋1</dd> <dd>名詞2解釋2</dd> ... </dl>
在HTML網(wǎng)頁中,要想創(chuàng)建表格,就需要使用表格相關(guān)的標(biāo)簽。創(chuàng)建表格的基本語法格式如下:
<table> <tr> <td>單元格內(nèi)的文字</td> ... </tr> ... </table>
在上面的語法中包含三對(duì)HTML標(biāo)簽,分別為 table</table、tr</tr、td</td,他們是創(chuàng)建表格的基本標(biāo)簽,缺一不可,下面對(duì)他們進(jìn)行具體的解釋
1.table用于定義一個(gè)表格。
2.tr 用于定義表格中的一行,必須嵌套在 table標(biāo)簽中,在 table中包含幾對(duì) tr,就有幾行表格。
3.td /td:用于定義表格中的單元格,必須嵌套在<tr></tr>標(biāo)簽中,一對(duì) <tr> </tr>中包含幾對(duì)<td></td>,就表示該行中有多少列(或多少個(gè)單元格)。
注意:
1. <tr></tr>中只能嵌套<td></td> 2. <td></td>標(biāo)簽,他就像一個(gè)容器,可以容納所有的元素
表頭一般位于表格的第一行或第一列,其文本加粗居中,如下圖所示,即為設(shè)置了表頭的表格。設(shè)置表頭非常簡(jiǎn)單,只需用表頭標(biāo)簽th</th替代相應(yīng)的單元格標(biāo)簽td</td即可。
在使用表格進(jìn)行布局時(shí),可以將表格劃分為頭部、主體和頁腳(頁腳因?yàn)橛屑嫒菪詥栴},我們不在贅述),具體 如下所示:
<thead></thead>:用于定義表格的頭部。
必須位于<table></table> 標(biāo)簽中,一般包含網(wǎng)頁的logo和導(dǎo)航等頭部信息。
<tbody></tbody>:用于定義表格的主體。
位于<table></table>標(biāo)簽中,一般包含網(wǎng)頁中除頭部和底部之外的其他內(nèi)容。
表格的標(biāo)題: caption
定義和用法
caption 元素定義表格標(biāo)題。
<table> <caption>我是表格標(biāo)題</caption> </table>
caption 標(biāo)簽必須緊隨 table 標(biāo)簽之后。您只能對(duì)每個(gè)表格定義一個(gè)標(biāo)題。通常這個(gè)標(biāo)題會(huì)被居中于表格之上。
跨行合并:rowspan 跨列合并:colspan
合并單元格的思想:
將多個(gè)內(nèi)容合并的時(shí)候,就會(huì)有多余的東西,把它刪除。 例如 把 3個(gè) td 合并成一個(gè), 那就多余了2個(gè),需要?jiǎng)h除。 公式: 刪除的個(gè)數(shù) = 合并的個(gè)數(shù) - 1
合并的順序 先上 先左
表格的學(xué)習(xí)要求: 能手寫表格結(jié)構(gòu),并且能合并單元格。
表單控件:
包含了具體的表單功能項(xiàng),如單行文本輸入框、密碼輸入框、復(fù)選框、提交按鈕、重置按鈕等。
提示信息:
一個(gè)表單中通常還需要包含一些說明性的文字,提示用戶進(jìn)行填寫和操作。
表單域:
他相當(dāng)于一個(gè)容器,用來容納所有的表單控件和提示信息,可以通過他定義處理表單數(shù)據(jù)所用程序的url地址,以及數(shù)據(jù)提交到服務(wù)器的方法。如果不定義表單域,表單中的數(shù)據(jù)就無法傳送到后臺(tái)服務(wù)器。
在上面的語法中,input /標(biāo)簽為單標(biāo)簽,type屬性為其最基本的屬性,其取值有多種,用于指定不同的控件類型。除了type屬性之外,input /標(biāo)簽還可以定義很多其他的屬性,其常用屬性如下表所示。
label 標(biāo)簽為 input 元素定義標(biāo)注(標(biāo)簽)。
作用: 用于綁定一個(gè)表單元素, 當(dāng)點(diǎn)擊label標(biāo)簽的時(shí)候, 被綁定的表單元素就會(huì)獲得輸入焦點(diǎn)
如何綁定元素呢?
for 屬性規(guī)定 label 與哪個(gè)表單元素綁定。
<label for="male">Male</label> <input type="radio" name="sex" id="male" value="male">
如果需要輸入大量的信息,就需要用到textarea/textarea標(biāo)簽。通過textarea控件可以輕松地創(chuàng)建多行文本輸入框,其基本語法格式如下:
<textarea cols="每行中的字符數(shù)" rows="顯示的行數(shù)"> 文本內(nèi)容 </textarea>
使用select控件定義下拉菜單的基本語法格式如下
<select> <option>選項(xiàng)1</option> <option>選項(xiàng)2</option> <option>選項(xiàng)3</option> ... </select>
注意:
在HTML中,form標(biāo)簽被用于定義表單域,即創(chuàng)建一個(gè)表單,以實(shí)現(xiàn)用戶信息的收集和傳遞,form中的所有內(nèi)容都會(huì)被提交給服務(wù)器。創(chuàng)建表單的基本語法格式如下:
<form action="url地址" method="提交方式" name="表單名稱"> 各種表單控件 </form>
常用屬性:
注意: 每個(gè)表單都應(yīng)該有自己表單域。
如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任。
TML 表單用于收集不同類型的用戶輸入,它是一個(gè)包含表單元素的區(qū)域。
表單元素是允許用戶在表單中輸入內(nèi)容,比如:文本域(textarea)、下拉列表、單選框(radio-buttons)、復(fù)選框(checkboxes)等等。今天我們主要來說說文本域和密碼域這兩個(gè)部分,希望對(duì)大家學(xué)習(xí)有所幫助喲!
本文福利后臺(tái)回復(fù)【學(xué)習(xí)】即可獲得Python、HTML等編程學(xué)習(xí)資料
HTML 表單
表單使用表單標(biāo)簽 <form> 來設(shè)置:
<form>
First name: <input type="text" name="firstname"><br>
Last name: <input type="text" name="lastname">
</form>
HTML 表單 - 輸入元素
多數(shù)情況下被用到的表單標(biāo)簽是輸入標(biāo)簽(<input>)。輸入類型是由類型屬性(type)定義的。
如何在 HTML 頁面創(chuàng)建文本域?
用戶可以在文本域中寫入文本,參考代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<form action="">
First name: <input type="text" name="firstname"><br>
Last name: <input type="text" name="lastname">
</form>
<p><b>注意:</b> 表單本身是不可見的。并且注意一個(gè)文本字段的默認(rèn)寬度是20個(gè)字符。</p>
</body>
</html>
運(yùn)行結(jié)果為
如何創(chuàng)建 HTML 的密碼域?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<form action="">
Username: <input type="text" name="user"><br>
Password: <input type="password" name="password">
</form>
<p><b>注意:</b> 密碼字段中的字符是隱藏的(顯示為星號(hào)或圓圈)。</p>
</body>
</html>
運(yùn)行結(jié)果如下
戳了解更多免費(fèi)領(lǐng)取HTML試聽課~
言
這個(gè)問題已經(jīng)是老生常談了,更是經(jīng)常被作為面試的壓軸題出現(xiàn),網(wǎng)上也有很多文章,但最近閑的無聊,然后就自己做了一篇筆記,感覺比之前理解更透徹了。
這篇筆記是我這兩天看了數(shù)十篇文章總結(jié)出來的,所以相對(duì)全面一點(diǎn),但由于我是做前端的,所以會(huì)比較重點(diǎn)分析瀏覽器渲染頁面那一部分,至于其他部分我會(huì)羅列出關(guān)鍵詞,感興趣的可以自行查閱.
注意:本文的步驟是建立在,請(qǐng)求的是一個(gè)簡(jiǎn)單的 HTTP 請(qǐng)求,沒有 HTTPS、HTTP2、最簡(jiǎn)單的 DNS、沒有代理、并且服務(wù)器沒有任何問題的基礎(chǔ)上,盡管這是不切實(shí)際的。
大致流程
一、URL 解析
地址解析:
首先判斷你輸入的是一個(gè)合法的 URL 還是一個(gè)待搜索的關(guān)鍵詞,并且根據(jù)你輸入的內(nèi)容進(jìn)行自動(dòng)完成、字符編碼等操作。
HSTS
由于安全隱患,會(huì)使用 HSTS 強(qiáng)制客戶端使用 HTTPS 訪問頁面。詳見:你所不知道的 HSTS[1]。
其他操作
瀏覽器還會(huì)進(jìn)行一些額外的操作,比如安全檢查、訪問限制(之前國(guó)產(chǎn)瀏覽器限制 996.icu)。
檢查緩存
二、DNS 查詢
基本步驟
1. 瀏覽器緩存
瀏覽器會(huì)先檢查是否在緩存中,沒有則調(diào)用系統(tǒng)庫(kù)函數(shù)進(jìn)行查詢。
2. 操作系統(tǒng)緩存
操作系統(tǒng)也有自己的 DNS緩存,但在這之前,會(huì)向檢查域名是否存在本地的 Hosts 文件里,沒有則向 DNS 服務(wù)器發(fā)送查詢請(qǐng)求。
3. 路由器緩存
路由器也有自己的緩存。
4. ISP DNS 緩存
ISP DNS 就是在客戶端電腦上設(shè)置的首選 DNS 服務(wù)器,它們?cè)诖蠖鄶?shù)情況下都會(huì)有緩存。
根域名服務(wù)器查詢
在前面所有步驟沒有緩存的情況下,本地 DNS 服務(wù)器會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到互聯(lián)網(wǎng)上的根域,下面這個(gè)圖很好的詮釋了整個(gè)流程:
根域名服務(wù)器(維基百科)
需要注意的點(diǎn)
三、TCP 連接
TCP/IP 分為四層,在發(fā)送數(shù)據(jù)時(shí),每層都要對(duì)數(shù)據(jù)進(jìn)行封裝:
1. 應(yīng)用層:發(fā)送 HTTP 請(qǐng)求
在前面的步驟我們已經(jīng)得到服務(wù)器的 IP 地址,瀏覽器會(huì)開始構(gòu)造一個(gè) HTTP 報(bào)文,其中包括:
其中需要注意的點(diǎn):
2. 傳輸層:TCP 傳輸報(bào)文
傳輸層會(huì)發(fā)起一條到達(dá)服務(wù)器的 TCP 連接,為了方便傳輸,會(huì)對(duì)數(shù)據(jù)進(jìn)行分割(以報(bào)文段為單位),并標(biāo)記編號(hào),方便服務(wù)器接受時(shí)能夠準(zhǔn)確地還原報(bào)文信息。
在建立連接前,會(huì)先進(jìn)行 TCP 三次握手。
“關(guān)于 TCP/IP 三次握手,網(wǎng)上已經(jīng)有很多段子和圖片生動(dòng)地描述了。相關(guān)知識(shí)點(diǎn):
”
3. 網(wǎng)絡(luò)層:IP協(xié)議查詢Mac地址
將數(shù)據(jù)段打包,并加入源及目標(biāo)的IP地址,并且負(fù)責(zé)尋找傳輸路線。
判斷目標(biāo)地址是否與當(dāng)前地址處于同一網(wǎng)絡(luò)中,是的話直接根據(jù) Mac 地址發(fā)送,否則使用路由表查找下一跳地址,以及使用 ARP 協(xié)議查詢它的 Mac 地址。
“注意:在 OSI 參考模型中 ARP 協(xié)議位于鏈路層,但在 TCP/IP 中,它位于網(wǎng)絡(luò)層。”
4. 鏈路層:以太網(wǎng)協(xié)議
以太網(wǎng)協(xié)議
根據(jù)以太網(wǎng)協(xié)議將數(shù)據(jù)分為以“幀”為單位的數(shù)據(jù)包,每一幀分為兩個(gè)部分:
Mac 地址
以太網(wǎng)規(guī)定了連入網(wǎng)絡(luò)的所有設(shè)備都必須具備“網(wǎng)卡”接口,數(shù)據(jù)包都是從一塊網(wǎng)卡傳遞到另一塊網(wǎng)卡,網(wǎng)卡的地址就是 Mac 地址。每一個(gè) Mac 地址都是獨(dú)一無二的,具備了一對(duì)一的能力。
廣播
發(fā)送數(shù)據(jù)的方法很原始,直接把數(shù)據(jù)通過 ARP 協(xié)議,向本網(wǎng)絡(luò)的所有機(jī)器發(fā)送,接收方根據(jù)標(biāo)頭信息與自身 Mac 地址比較,一致就接受,否則丟棄。
注意:接收方回應(yīng)是單播。
“相關(guān)知識(shí)點(diǎn):
”
服務(wù)器接受請(qǐng)求
接受過程就是把以上步驟逆轉(zhuǎn)過來,參見上圖。
四、服務(wù)器處理請(qǐng)求
大致流程
HTTPD
最常見的 HTTPD 有 Linux 上常用的 Apache 和 Nginx,以及 Windows 上的 IIS。
它會(huì)監(jiān)聽得到的請(qǐng)求,然后開啟一個(gè)子進(jìn)程去處理這個(gè)請(qǐng)求。
處理請(qǐng)求
接受 TCP 報(bào)文后,會(huì)對(duì)連接進(jìn)行處理,對(duì)HTTP協(xié)議進(jìn)行解析(請(qǐng)求方法、域名、路徑等),并且進(jìn)行一些驗(yàn)證:
重定向
假如服務(wù)器配置了 HTTP 重定向,就會(huì)返回一個(gè) 301永久重定向響應(yīng),瀏覽器就會(huì)根據(jù)響應(yīng),重新發(fā)送 HTTP 請(qǐng)求(重新執(zhí)行上面的過程)。
“關(guān)于更多:詳見這篇文章[2]”
URL 重寫
然后會(huì)查看 URL 重寫規(guī)則,如果請(qǐng)求的文件是真實(shí)存在的,比如圖片、html、css、js文件等,則會(huì)直接把這個(gè)文件返回。
否則服務(wù)器會(huì)按照規(guī)則把請(qǐng)求重寫到 一個(gè) REST 風(fēng)格的 URL 上。
然后根據(jù)動(dòng)態(tài)語言的腳本,來決定調(diào)用什么類型的動(dòng)態(tài)文件解釋器來處理這個(gè)請(qǐng)求。
以 PHP 語言的 MVC 框架舉例,它首先會(huì)初始化一些環(huán)境的參數(shù),根據(jù) URL 由上到下地去匹配路由,然后讓路由所定義的方法去處理請(qǐng)求。
五、瀏覽器接受響應(yīng)
瀏覽器接收到來自服務(wù)器的響應(yīng)資源后,會(huì)對(duì)資源進(jìn)行分析。
首先查看 Response header,根據(jù)不同狀態(tài)碼做不同的事(比如上面提到的重定向)。
如果響應(yīng)資源進(jìn)行了壓縮(比如 gzip),還需要進(jìn)行解壓。
然后,對(duì)響應(yīng)資源做緩存。
接下來,根據(jù)響應(yīng)資源里的 MIME[3] 類型去解析響應(yīng)內(nèi)容(比如 HTML、Image各有不同的解析方式)。
六、渲染頁面
瀏覽器內(nèi)核
不同的瀏覽器內(nèi)核,渲染過程也不完全相同,但大致流程都差不多。
基本流程
6.1. HTML 解析
首先要知道瀏覽器解析是從上往下一行一行地解析的。
解析的過程可以分為四個(gè)步驟:
① 解碼(encoding)
傳輸回來的其實(shí)都是一些二進(jìn)制字節(jié)數(shù)據(jù),瀏覽器需要根據(jù)文件指定編碼(例如UTF-8)轉(zhuǎn)換成字符串,也就是HTML 代碼。
② 預(yù)解析(pre-parsing)
預(yù)解析做的事情是提前加載資源,減少處理時(shí)間,它會(huì)識(shí)別一些會(huì)請(qǐng)求資源的屬性,比如img標(biāo)簽的src屬性,并將這個(gè)請(qǐng)求加到請(qǐng)求隊(duì)列中。
③ 符號(hào)化(Tokenization)
符號(hào)化是詞法分析的過程,將輸入解析成符號(hào),HTML 符號(hào)包括,開始標(biāo)簽、結(jié)束標(biāo)簽、屬性名和屬性值。
它通過一個(gè)狀態(tài)機(jī)去識(shí)別符號(hào)的狀態(tài),比如遇到<,>狀態(tài)都會(huì)產(chǎn)生變化。
④ 構(gòu)建樹(tree construction)
“注意:符號(hào)化和構(gòu)建樹是并行操作的,也就是說只要解析到一個(gè)開始標(biāo)簽,就會(huì)創(chuàng)建一個(gè) DOM 節(jié)點(diǎn)。”
在上一步符號(hào)化中,解析器獲得這些標(biāo)記,然后以合適的方法創(chuàng)建DOM對(duì)象并把這些符號(hào)插入到DOM對(duì)象中。
<html><head> <title>Web page parsing</title></head><body> <div> <h1>Web page parsing</h1> <p>This is an example Web page.</p> </div></body></html>
瀏覽器容錯(cuò)進(jìn)制
你從來沒有在瀏覽器看過類似”語法無效”的錯(cuò)誤,這是因?yàn)闉g覽器去糾正錯(cuò)誤的語法,然后繼續(xù)工作。
事件
當(dāng)整個(gè)解析的過程完成以后,瀏覽器會(huì)通過DOMContentLoaded事件來通知DOM解析完成。
6.2. CSS 解析
一旦瀏覽器下載了 CSS,CSS 解析器就會(huì)處理它遇到的任何 CSS,根據(jù)語法規(guī)范[4]解析出所有的 CSS 并進(jìn)行標(biāo)記化,然后我們得到一個(gè)規(guī)則表。
CSS 匹配規(guī)則
在匹配一個(gè)節(jié)點(diǎn)對(duì)應(yīng)的 CSS 規(guī)則時(shí),是按照從右到左的順序的,例如:div p { font-size :14px }會(huì)先尋找所有的p標(biāo)簽然后判斷它的父元素是否為div。
所以我們寫 CSS 時(shí),盡量用 id 和 class,千萬不要過度層疊。
6.3. 渲染樹
其實(shí)這就是一個(gè) DOM 樹和 CSS 規(guī)則樹合并的過程。
“注意:渲染樹會(huì)忽略那些不需要渲染的節(jié)點(diǎn),比如設(shè)置了display:none的節(jié)點(diǎn)。”
計(jì)算
通過計(jì)算讓任何尺寸值都減少到三個(gè)可能之一:auto、百分比、px,比如把rem轉(zhuǎn)化為px。
級(jí)聯(lián)
瀏覽器需要一種方法來確定哪些樣式才真正需要應(yīng)用到對(duì)應(yīng)元素,所以它使用一個(gè)叫做specificity的公式,這個(gè)公式會(huì)通過:
然后得出一個(gè)權(quán)重值,取最高的那個(gè)。
渲染阻塞
當(dāng)遇到一個(gè)script標(biāo)簽時(shí),DOM 構(gòu)建會(huì)被暫停,直至腳本完成執(zhí)行,然后繼續(xù)構(gòu)建 DOM 樹。
但如果 JS 依賴 CSS 樣式,而它還沒有被下載和構(gòu)建時(shí),瀏覽器就會(huì)延遲腳本執(zhí)行,直至 CSS Rules 被構(gòu)建。
所有我們知道:
為了避免這種情況,應(yīng)該以下原則:
另外,如果要改變阻塞模式,可以使用 defer 與 async,詳見:這篇文章[5]
6.4. 布局與繪制
確定渲染樹種所有節(jié)點(diǎn)的幾何屬性,比如:位置、大小等等,最后輸入一個(gè)盒子模型,它能精準(zhǔn)地捕獲到每個(gè)元素在屏幕內(nèi)的準(zhǔn)確位置與大小。
然后遍歷渲染樹,調(diào)用渲染器的 paint() 方法在屏幕上顯示其內(nèi)容。
6.5. 合并渲染層
把以上繪制的所有圖片合并,最終輸出一張圖片。
6.6. 回流與重繪
回流(reflow)
當(dāng)瀏覽器發(fā)現(xiàn)某個(gè)部分發(fā)現(xiàn)變化影響了布局時(shí),需要倒回去重新渲染,會(huì)從html標(biāo)簽開始遞歸往下,重新計(jì)算位置和大小。
reflow基本是無法避免的,因?yàn)楫?dāng)你滑動(dòng)一下鼠標(biāo)、resize 窗口,頁面就會(huì)產(chǎn)生變化。
重繪(repaint)
改變了某個(gè)元素的背景色、文字顏色等等不會(huì)影響周圍元素的位置變化時(shí),就會(huì)發(fā)生重繪。
每次重繪后,瀏覽器還需要合并渲染層并輸出到屏幕上。
回流的成本要比重繪高很多,所以我們應(yīng)該盡量避免產(chǎn)生回流。
比如:
6.7. JavaScript 編譯執(zhí)行
大致流程
可以分為三個(gè)階段:
1. 詞法分析
JS 腳本加載完畢后,會(huì)首先進(jìn)入語法分析階段,它首先會(huì)分析代碼塊的語法是否正確,不正確則拋出“語法錯(cuò)誤”,停止執(zhí)行。
幾個(gè)步驟:
2. 預(yù)編譯
JS 有三種運(yùn)行環(huán)境:
每進(jìn)入一個(gè)不同的運(yùn)行環(huán)境都會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的執(zhí)行上下文,根據(jù)不同的上下文環(huán)境,形成一個(gè)函數(shù)調(diào)用棧,棧底永遠(yuǎn)是全局執(zhí)行上下文,棧頂則永遠(yuǎn)是當(dāng)前執(zhí)行上下文。
創(chuàng)建執(zhí)行上下文
創(chuàng)建執(zhí)行上下文的過程中,主要做了以下三件事:
3. 執(zhí)行
JS 線程
雖然 JS 是單線程的,但實(shí)際上參與工作的線程一共有四個(gè):
“其中三個(gè)只是協(xié)助,只有 JS 引擎線程是真正執(zhí)行的
”
注:瀏覽器對(duì)同一域名的并發(fā)連接數(shù)是有限的,通常為 6 個(gè)。
宏任務(wù)
分為:
微任務(wù)
微任務(wù)是ES6和Node環(huán)境下的,主要 API 有:Promise,process.nextTick。
微任務(wù)的執(zhí)行在宏任務(wù)的同步任務(wù)之后,在異步任務(wù)之前。
代碼例子
console.log('1'); // 宏任務(wù) 同步 setTimeout(function() { console.log('2'); // 宏任務(wù) 異步}) new Promise(function(resolve) { console.log('3'); // 宏任務(wù) 同步 resolve();}).then(function() { console.log('4') // 微任務(wù)}) console.log('5') // 宏任務(wù) 同步
以上代碼輸出順序?yàn)椋?,3,5,4,2
來源:4ark.me/post/b6c7c0a2.html,侵刪
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。