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 一区二区在线不卡,久久久久久久久免费视频,国产精品成人免费视频电影

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          深入淺出瀏覽器渲染原理

          塊的文章網(wǎng)上也是比較多的,但大多數(shù)都是講解DOM樹(shù)的渲染,對(duì)于頁(yè)面從請(qǐng)求到展示的詳細(xì)流程講解還是比較少的,而且有些說(shuō)的也不容易理解,下面我將以圖文結(jié)合的形式給大伙講講。

          DNS查詢

          作用

          DNS 的作用就是通過(guò)域名查詢到具體的 IP。

          背景

          因?yàn)?IP 存在數(shù)字和英文的組合(IPv6),很不利于人類記憶,所以就出現(xiàn)了域名。你可以把域名看成是某個(gè) IP 的別名,DNS 就是去查詢這個(gè)別名的真正名稱是什么。

          過(guò)程

          在 TCP 握手之前就已經(jīng)進(jìn)行了 DNS 查詢,這個(gè)查詢是操作系統(tǒng)自己做的。當(dāng)你在瀏覽器中想訪問(wèn) www.test.com 時(shí),會(huì)進(jìn)行一下操作:

          1. 操作系統(tǒng)會(huì)首先在本地緩存中查詢 IP
          2. 沒(méi)有的話會(huì)去系統(tǒng)配置的 DNS 服務(wù)器中查詢
          3. 如果這時(shí)候還沒(méi)得話,會(huì)直接去 DNS 根服務(wù)器查詢,這一步查詢會(huì)找出負(fù)責(zé) com 這個(gè)一級(jí)域名的服務(wù)器
          4. 然后去該服務(wù)器查詢 baidu 這個(gè)二級(jí)域名
          5. 接下來(lái)三級(jí)域名的查詢其實(shí)是我們配置的,你可以給 www 這個(gè)域名配置一個(gè) IP,然后還可以給別的三級(jí)域名配置一個(gè) IP

          以上介紹的是 DNS 迭代查詢,還有種是遞歸查詢,區(qū)別就是前者是由客戶端去做請(qǐng)求,后者是由系統(tǒng)配置的 DNS 服務(wù)器做請(qǐng)求,得到結(jié)果后將數(shù)據(jù)返回給客戶端。

          TCP握手

          在進(jìn)行完DNS解析之后,接下來(lái)就是 TCP 握手,應(yīng)用層會(huì)下發(fā)數(shù)據(jù)給傳輸層,這里 TCP 協(xié)議會(huì)指明兩端的端口號(hào),然后下發(fā)給網(wǎng)絡(luò)層。網(wǎng)絡(luò)層中的 IP 協(xié)議會(huì)確定 IP 地址,并且指示了數(shù)據(jù)傳輸中如何跳轉(zhuǎn)路由器。然后包會(huì)再被封裝到數(shù)據(jù)鏈路層的數(shù)據(jù)幀結(jié)構(gòu)中,最后就是物理層面的傳輸了。

          TCP建立連接的三次握手

          首先假設(shè)主動(dòng)發(fā)起請(qǐng)求的一端稱為客戶端,被動(dòng)連接的一端稱為服務(wù)端。不管是客戶端還是服務(wù)端,TCP 連接建立完后都能發(fā)送和接收數(shù)據(jù),所以 TCP 是一個(gè)全雙工的協(xié)議。

          起初,兩端都為 CLOSED 狀態(tài)。在通信開(kāi)始前,雙方都會(huì)創(chuàng)建 TCB。 服務(wù)器創(chuàng)建完 TCB 后便進(jìn)入 LISTEN 狀態(tài),此時(shí)開(kāi)始等待客戶端發(fā)送數(shù)據(jù)。

          第一次握手

          客戶端向服務(wù)端發(fā)送連接請(qǐng)求報(bào)文段。該報(bào)文段中包含自身的數(shù)據(jù)通訊初始序號(hào)。請(qǐng)求發(fā)送后,客戶端便進(jìn)入 SYN-SENT 狀態(tài)。

          第二次握手

          服務(wù)端收到連接請(qǐng)求報(bào)文段后,如果同意連接,則會(huì)發(fā)送一個(gè)應(yīng)答,該應(yīng)答中也會(huì)包含自身的數(shù)據(jù)通訊初始序號(hào),發(fā)送完成后便進(jìn)入 SYN-RECEIVED 狀態(tài)。

          第三次握手

          當(dāng)客戶端收到連接同意的應(yīng)答后,還要向服務(wù)端發(fā)送一個(gè)確認(rèn)報(bào)文。客戶端發(fā)完這個(gè)報(bào)文段后便進(jìn)入 ESTABLISHED 狀態(tài),服務(wù)端收到這個(gè)應(yīng)答后也進(jìn)入 ESTABLISHED 狀態(tài),此時(shí)連接建立成功。

          第三次握手中可以包含數(shù)據(jù),通過(guò)快速打開(kāi)(TFO)技術(shù)就可以實(shí)現(xiàn)這一功能。其實(shí)只要涉及到握手的協(xié)議,都可以使用類似 TFO 的方式,客戶端和服務(wù)端存儲(chǔ)相同的 cookie,下次握手時(shí)發(fā)出 cookie 達(dá)到減少 RTT 的目的。

          TLS握手

          TLS 協(xié)議位于傳輸層之上,應(yīng)用層之下,主要是對(duì)HTTP請(qǐng)求進(jìn)行加密。首次進(jìn)行 TLS 協(xié)議傳輸需要兩個(gè) RTT ,接下來(lái)可以通過(guò) Session Resumption 減少到一個(gè) RTT。

          TLS 握手過(guò)程如下圖:

          1. 客戶端發(fā)送一個(gè)隨機(jī)值以及需要的協(xié)議和加密方式。
          2. 服務(wù)端收到客戶端的隨機(jī)值,自己也產(chǎn)生一個(gè)隨機(jī)值,并根據(jù)客戶端需求的協(xié)議和加密方式來(lái)使用對(duì)應(yīng)的方式,并且發(fā)送自己的證書(shū)(如果需要驗(yàn)證客戶端證書(shū)需要說(shuō)明)
          3. 客戶端收到服務(wù)端的證書(shū)并驗(yàn)證是否有效,驗(yàn)證通過(guò)會(huì)再生成一個(gè)隨機(jī)值,通過(guò)服務(wù)端證書(shū)的公鑰去加密這個(gè)隨機(jī)值并發(fā)送給服務(wù)端,如果服務(wù)端需要驗(yàn)證客戶端證書(shū)的話會(huì)附帶證書(shū)
          4. 服務(wù)端收到加密過(guò)的隨機(jī)值并使用私鑰解密獲得第三個(gè)隨機(jī)值,這時(shí)候兩端都擁有了三個(gè)隨機(jī)值,可以通過(guò)這三個(gè)隨機(jī)值按照之前約定的加密方式生成密鑰,接下來(lái)的通信就可以通過(guò)該密鑰來(lái)加密解密

          通過(guò)以上步驟可知,在 TLS 握手階段,兩端使用非對(duì)稱加密的方式來(lái)通信,但是因?yàn)榉菍?duì)稱加密損耗的性能比對(duì)稱加密大,所以在正式傳輸數(shù)據(jù)時(shí),兩端使用對(duì)稱加密的方式通信。

          負(fù)載均衡服務(wù)器

          數(shù)據(jù)在進(jìn)入服務(wù)端之前,可能還會(huì)先經(jīng)過(guò)負(fù)責(zé)負(fù)載均衡的服務(wù)器,它的作用就是將請(qǐng)求合理的分發(fā)到多臺(tái)服務(wù)器上,這時(shí)假設(shè)服務(wù)端會(huì)響應(yīng)一個(gè) HTML 文件。

          首先瀏覽器會(huì)判斷狀態(tài)碼是什么,如果是 200 那就繼續(xù)解析,如果 400 或 500 的話就會(huì)報(bào)錯(cuò),如果 300 的話會(huì)進(jìn)行重定向,這里會(huì)有個(gè)重定向計(jì)數(shù)器,避免過(guò)多次的重定向,超過(guò)次數(shù)也會(huì)報(bào)錯(cuò)。

          瀏覽器解析

          瀏覽器開(kāi)始解析文件,如果是 gzip 格式的話會(huì)先解壓一下,然后通過(guò)文件的編碼格式去解碼文件。

          文件解碼成功后會(huì)正式開(kāi)始渲染流程,先會(huì)根據(jù) HTML 構(gòu)建 DOM 樹(shù),有 CSS 的話會(huì)去構(gòu)建 CSSOM 樹(shù)。如果遇到 script 標(biāo)簽的話,會(huì)判斷是否存在 async 或者 defer ,前者會(huì)并行進(jìn)行下載并執(zhí)行 JS,后者會(huì)先下載文件,然后等待 HTML 解析完成后順序執(zhí)行。

          如果以上都沒(méi)有,就會(huì)阻塞住渲染流程直到 JS 執(zhí)行完畢。遇到文件下載的會(huì)去下載文件,這里如果使用 HTTP/2 協(xié)議的話會(huì)極大的提高多圖的下載效率。

          CSSOM 樹(shù)和 DOM 樹(shù)構(gòu)建完成后會(huì)開(kāi)始生成 Render 樹(shù),這一步就是確定頁(yè)面元素的布局、樣式等等諸多方面的東西

          在生成 Render 樹(shù)的過(guò)程中,瀏覽器就開(kāi)始調(diào)用 GPU 繪制,合成圖層,將內(nèi)容顯示在屏幕上了。

          總結(jié)

          總的來(lái)說(shuō),今天這篇文章主要是帶著大家從 DNS 查詢開(kāi)始到渲染出畫(huà)面完整的了解一遍過(guò)程,里面涉及到DNS、HTTP、TLS、負(fù)載均衡和瀏覽器渲染等等內(nèi)容,算不上非常詳細(xì),但如果面試的時(shí)候能說(shuō)出來(lái)這些,相信面試官也會(huì)對(duì)你刮目相看的。

          . 對(duì) HTML 語(yǔ)義化的理解

          語(yǔ)義化是指根據(jù)內(nèi)容的結(jié)構(gòu)化(內(nèi)容語(yǔ)義化),選擇合適的標(biāo)簽(代 碼語(yǔ)義化)。通俗來(lái)講就是用正確的標(biāo)簽做正確的事情。

          語(yǔ)義化的優(yōu)點(diǎn)如下:

          對(duì)機(jī)器友好,帶有語(yǔ)義的文字表現(xiàn)力豐富,更適合搜索引擎的爬蟲(chóng)爬 取有效信息,有利于 SEO。除此之外,語(yǔ)義類還支持讀屏軟件,根據(jù) 文章可以自動(dòng)生成目錄;

          對(duì)開(kāi)發(fā)者友好,使用語(yǔ)義類標(biāo)簽增強(qiáng)了可讀性,結(jié)構(gòu)更加清晰,開(kāi)發(fā) 者能清晰地看出網(wǎng)頁(yè)的結(jié)構(gòu),便于團(tuán)隊(duì)的開(kāi)發(fā)與維護(hù)。

          常見(jiàn)的語(yǔ)義化標(biāo)簽:

          2. DOCTYPE(?檔類型) 的作?

          DOCTYPE 是 HTML5 中一種標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的文檔類型聲明,它的目 的是告訴瀏覽器(解析器)應(yīng)該以什么樣(html 或 xhtml)的文檔類 行定義來(lái)解析文檔,不同的渲染模式會(huì)影響瀏覽器對(duì) CSS 代碼甚?JavaScript 腳本的解析。它必須聲明在 HTML?檔的第??。

          瀏覽器渲染頁(yè)面的兩種模式(可通過(guò) document.compatMode 獲取,比 如,語(yǔ)雀官網(wǎng)的文檔類型是 CSS1Compat):

          CSS1Compat:標(biāo)準(zhǔn)模式(Strick mode),默認(rèn)模式,瀏覽器使用 W3C 的標(biāo)準(zhǔn)解析渲染頁(yè)面。在標(biāo)準(zhǔn)模式中,瀏覽器以其支持的最高標(biāo)準(zhǔn)呈 現(xiàn)頁(yè)面。

          BackCompat:怪異模式(混雜模式)(Quick mode),瀏覽器使用自己的 怪異模式解析渲染頁(yè)面。在怪異模式中,頁(yè)面以一種比較寬松的向后 兼容的方式顯示。

          3. script 標(biāo)簽中 defer 和 async 的區(qū)別

          如果沒(méi)有 defer 或 async 屬性,瀏覽器會(huì)立即加載并執(zhí)行相應(yīng)的腳本。它不會(huì)等待后續(xù)加載的文檔元素,讀取到就會(huì)開(kāi)始加載和執(zhí)行,這樣 就阻塞了后續(xù)文檔的加載。

          下圖可以直觀地看出三者之間的區(qū)別:

          其中藍(lán)色代表 js 腳本網(wǎng)絡(luò)加載時(shí)間,紅色代表 js 腳本執(zhí)行時(shí)間,綠 色代表 html 解析。

          defer 和 async 屬性都是去異步加載外部的 JS 腳本文件,它們都不 會(huì)阻塞頁(yè)面的解析,其區(qū)別如下:

          執(zhí)行順序:多個(gè)帶 async 屬性的標(biāo)簽,不能保證加載的順序;多個(gè)帶 defer 屬性的標(biāo)簽,按照加載順序執(zhí)行;

          腳本是否并行執(zhí)行:async 屬性,表示后續(xù)文檔的加載和執(zhí)行與 js 腳本的加載和執(zhí)行是并行進(jìn)行的,即異步執(zhí)行;defer 屬性,加載后 續(xù)文檔的過(guò)程和 js 腳本的加載(此時(shí)僅加載不執(zhí)行)是并行進(jìn)行的(異步),js 腳本需要等到文檔所有元素解析完成之后才執(zhí)行,DOMContentLoaded 事件觸發(fā)執(zhí)行之前。

          4. 行內(nèi)元素有哪些?塊級(jí)元素有哪些? 空(void)元素有那 些?

          行內(nèi)元素有:a b span img input select strong;

          塊級(jí)元素有:div ul ol li dl dt dd h1 h2 h3 h4 h5 h6 p;

          空元素,即沒(méi)有內(nèi)容的 HTML 元素。空元素是在開(kāi)始標(biāo)簽中關(guān)閉的,也就是空元素沒(méi)有閉合標(biāo)簽:

          常見(jiàn)的有:<br>、<hr>、<img>、<input>、<link>、<meta>;

          鮮見(jiàn)的有:<area>、<base>、<col>、<colgroup>、<command>、<embed>、<keygen>、<param>、<source>、<track>、<wbr>。

          5. 瀏覽器是如何對(duì) HTML5 的離線儲(chǔ)存資源進(jìn)行管理和加載?

          在線的情況下,瀏覽器發(fā)現(xiàn) html 頭部有 manifest 屬性,它會(huì)請(qǐng)求 manifest 文件,如果是第一次訪問(wèn)頁(yè)面 ,那么瀏覽器就會(huì)根據(jù) manifest 文件的內(nèi)容下載相應(yīng)的資源并且進(jìn)行離線存儲(chǔ)。如果已經(jīng) 訪問(wèn)過(guò)頁(yè)面并且資源已經(jīng)進(jìn)行離線存儲(chǔ)了,那么瀏覽器就會(huì)使用離線 的資源加載頁(yè)面,然后瀏覽器會(huì)對(duì)比新的 manifest 文件與舊的 manifest 文件,如果文件沒(méi)有發(fā)生改變,就不做任何操作,如果文 件改變了,就會(huì)重新下載文件中的資源并進(jìn)行離線存儲(chǔ)。

          離線的情況下,瀏覽器會(huì)直接使用離線存儲(chǔ)的資源。

          6. Canvas 和 SVG 的區(qū)別

          (1)SVG:

          SVG 可縮放矢量圖形(Scalable Vector Graphics)是基于可擴(kuò)展標(biāo) 記語(yǔ)言 XML 描述的 2D 圖形的語(yǔ)言,SVG 基于 XML 就意味著 SVG DOM 中的每個(gè)元素都是可用的,可以為某個(gè)元素附加 Javascript 事件處 理器。在 SVG 中,每個(gè)被繪制的圖形均被視為對(duì)象。如果 SVG 對(duì)象 的屬性發(fā)生變化,那么瀏覽器能夠自動(dòng)重現(xiàn)圖形。

          其特點(diǎn)如下:

          不依賴分辨率

          支持事件處理器

          最適合帶有大型渲染區(qū)域的應(yīng)用程序(比如谷歌地圖)

          復(fù)雜度高會(huì)減慢渲染速度(任何過(guò)度使用 DOM 的應(yīng)用都不快)不適合游戲應(yīng)用

          (2)Canvas:

          Canvas 是畫(huà)布,通過(guò) Javascript 來(lái)繪制 2D 圖形,是逐像素進(jìn)行渲 染的。其位置發(fā)生改變,就會(huì)重新進(jìn)行繪制。

          其特點(diǎn)如下:

          依賴分辨率

          不支持事件處理器

          弱的文本渲染能力

          能夠以 .png 或 .jpg 格式保存結(jié)果圖像

          最適合圖像密集型的游戲,其中的許多對(duì)象會(huì)被頻繁重繪

          注:矢量圖,也稱為面向?qū)ο蟮膱D像或繪圖圖像,在數(shù)學(xué)上定義為一 系列由線連接的點(diǎn)。矢量文件中的圖形元素稱為對(duì)象。每個(gè)對(duì)象都是

          一個(gè)自成一體的實(shí)體,它具有顏色、形狀、輪廓、大小和屏幕位置等 屬性。

          7. 說(shuō)一下 HTML5 drag API

          dragstart:事件主體是被拖放元素,在開(kāi)始拖放被拖放元素時(shí)觸發(fā)。

          darg:事件主體是被拖放元素,在正在拖放被拖放元素時(shí)觸發(fā)。dragenter:事件主體是目標(biāo)元素,在被拖放元素進(jìn)入某元素時(shí)觸發(fā)。dragover:事件主體是目標(biāo)元素,在被拖放在某元素內(nèi)移動(dòng)時(shí)觸發(fā)。dragleave:事件主體是目標(biāo)元素,在被拖放元素移出目標(biāo)元素是觸 發(fā)。

          drop:事件主體是目標(biāo)元素,在目標(biāo)元素完全接受被拖放元素時(shí)觸發(fā)。

          dragend:事件主體是被拖放元素,在整個(gè)拖放操作結(jié)束時(shí)觸發(fā)。

          三部分 附錄(因?yàn)闀簳r(shí)不支持插入超鏈接所以部分內(nèi)容無(wú)法顯示


          附錄一 DIV命名規(guī)范


          • 企業(yè)DIV使用頻率高的命名方法
          • 網(wǎng)頁(yè)內(nèi)容類
          • 標(biāo)題: title
          • 摘要: summary
          • 箭頭: arrow
          • 商標(biāo): label
          • 網(wǎng)站標(biāo)志: logo
          • 轉(zhuǎn)角/圓角:corner
          • 橫幅廣告: banner
          • 子菜單: subMenu
          • 搜索: search
          • 搜索框: searchBox
          • 登錄: login
          • 登錄條:loginbar
          • 工具條: toolbar
          • 下拉: drop
          • 標(biāo)簽頁(yè): tab
          • 當(dāng)前的: current
          • 列表: list
          • 滾動(dòng): scroll
          • 服務(wù): service
          • 提示信息: msg
          • 熱點(diǎn):hot
          • 新聞: news
          • 小技巧: tips
          • 下載: download
          • 欄目標(biāo)題: title
          • 熱點(diǎn): hot
          • 加入:joinus
          • 注冊(cè): regsiter
          • 指南: guide
          • 友情鏈接: friendlink
          • 狀態(tài): status
          • 版權(quán): copyright
          • 按鈕: btn
          • 合作伙伴: partner
          • 投票: vote
          • 左右中:left right center


          • 注釋的寫(xiě)法: /* Footer */ 內(nèi)容區(qū)/* End Footer */
          • id的命名:
          • 頁(yè)面結(jié)構(gòu)
          • 容器: container
          • 頁(yè)頭:header
          • 內(nèi)容:content/container
          • 頁(yè)面主體:main
          • 頁(yè)尾:footer
          • 導(dǎo)航:nav
          • 側(cè)欄:sidebar
          • 欄目:column
          • 頁(yè)面外圍控制整體布局寬度:wrapper
          • 左右中:left right center

          • 導(dǎo)航
          • 導(dǎo)航:nav
          • 主導(dǎo)航:mainbav
          • 子導(dǎo)航:subnav
          • 頂導(dǎo)航:topnav
          • 邊導(dǎo)航:sidebar
          • 左導(dǎo)航:leftsidebar
          • 右導(dǎo)航:rightsidebar
          • 菜單:menu
          • 子菜單:submenu
          • 標(biāo)題: title
          • 摘要: summary

          • 功能
          • 標(biāo)志:logo
          • 廣告:banner
          • 登陸:login
          • 登錄條:loginbar
          • 注冊(cè):regsiter
          • 搜索:search
          • 功能區(qū):shop
          • 標(biāo)題:title
          • 加入:joinus
          • 狀態(tài):status
          • 按鈕:btn
          • 滾動(dòng):scroll
          • 標(biāo)簽頁(yè):tab
          • 文章列表:list
          • 提示信息:msg
          • 當(dāng)前的:current
          • 小技巧:tips
          • 圖標(biāo): icon
          • 注釋:note
          • 指南:guild
          • 服務(wù):service
          • 熱點(diǎn):hot
          • 新聞:news
          • 下載:download
          • 投票:vote
          • 合作伙伴:partner
          • 友情鏈接:link
          • 版權(quán):copyright

          • class的命名:
          • 顏色:使用顏色的名稱或者16進(jìn)制代碼,如
          • .red { color: red; }
          • .f60 { color: #f60; }
          • .ff8600 { color: #ff8600; }
          • 字體大小,直接使用”font+字體大小”作為名稱,如
          • .font12px { font-size: 12px; }
          • .font9px {font-size: 9pt; }
          • 對(duì)齊樣式,使用對(duì)齊目標(biāo)的英文名稱,如
          • .left { float:left; }
          • .bottom { float:bottom; }
          • 標(biāo)題欄樣式,使用”類別+功能”的方式命名,如
          • .barnews { }
          • .barproduct { }

          • 注意事項(xiàng)::
          • 一律小寫(xiě);
          • 盡量用英文;
          • 不加中杠和下劃線;
          • 盡量不縮寫(xiě),除非一看就明白的單詞.


          • 推薦的 CSS 書(shū)寫(xiě)順序:
          • 顯示屬性
          • display
          • list-style
          • position
          • float
          • clear
          • 自身屬性
          • width
          • height
          • margin
          • padding
          • border
          • background
          • 文本屬性
          • color
          • font
          • text-decoration
          • text-align
          • vertical-align
          • white-space
          • other text
          • content

          附錄二 CSS精靈


          • CSS精靈原理以及應(yīng)用
          • CSS雪碧的基本原理是把你的網(wǎng)站上用到的一些圖片整合到一張單獨(dú)的圖片中,從而減少你的網(wǎng)站的HTTP請(qǐng)求數(shù)量。
          • 該圖片使用CSS background和background-position屬性渲染,這也就意味著你的標(biāo)簽變得更加復(fù)雜了,圖片是在CSS中定義,而非<img>標(biāo)簽。
          • 一個(gè)簡(jiǎn)單的例子:
          • 一張圖片作出一個(gè)按鈕的三個(gè)狀態(tài)
          • 一個(gè)鏈接用CSS做成按鈕的樣式,我們可以使用同一張圖片,完成按鈕的三個(gè)狀態(tài),a:link,a:hover,a:active <a class="button" href="#">鏈接</a>
          • 加入右側(cè)的圖片為:200px 65px的三個(gè)按鈕圖拼合而成的圖片button.png,從上到下一次為按鈕的普通、鼠標(biāo)滑過(guò)、鼠標(biāo)點(diǎn)擊的狀態(tài)。則可以使用CSS進(jìn)行定義。
          a {
           display:block; 
           width:200px; 
           height:65px; 
           line-height:65px; /*定義狀態(tài)*/
           text-indent:-2015px; /*隱藏文字*/
           background-image:url(button.png); /*定義背景圖片*/
           background-position:0 0;
           /*定義鏈接的普通狀態(tài),此時(shí)圖像顯示的是頂上的部分*/
          }
          a:hover {
           background-position:0 -66px;
           /*定義鏈接的滑過(guò)狀態(tài),此時(shí)顯示的為中間部分,向下取負(fù)值*/
          }
          a:active {
           background-position:0 -132px; 
           /*定 義鏈接的普通狀態(tài),此時(shí)顯示的是底部的部分,向下取負(fù)值*/
          }
          
          • 更多的CSS雪碧,圖片更復(fù)雜,背景定位更精確。可能會(huì)用到大量的數(shù)值
          • 如:background:url(nav.png) -180px 24pxno-repeat; 來(lái)達(dá)到更精確的定位
          • 優(yōu)點(diǎn):
          • 減少加載網(wǎng)頁(yè)圖片時(shí)對(duì)服務(wù)器的請(qǐng)求次數(shù)
          • 可以合并多數(shù)背景圖片和小圖標(biāo),方便在任何位置使用,這樣不同位置的請(qǐng)求只需要調(diào)用一個(gè)圖片,從而減少對(duì)服務(wù)器的請(qǐng)求次數(shù),降低服務(wù)器壓力,同時(shí)提高了頁(yè)面的加載速度,節(jié)約服務(wù)器的流量。
          • 提高頁(yè)面的加載速度
          • sprite技術(shù)的其中一個(gè)好處是圖片的加載時(shí)間(在有許多 sprite 時(shí),單張圖片的加載時(shí)間)。由所需圖片拼成的一張 GIF圖片的尺寸會(huì)明顯小于所有圖片拼合前的大小。單張的 GIF只有相關(guān)的一個(gè)色表,而單獨(dú)分割的每一張 GIF 都有自己的一個(gè)色表,這就增加了總體的大小。因此,單獨(dú)的一張 JPEG 或者 PNGsprite 在大小上非常可能比把一張圖分成多張得來(lái)的圖片總尺寸小。
          • 減少鼠標(biāo)滑過(guò)的一些bug
          • IE6不會(huì)主動(dòng)預(yù)加載鼠標(biāo)滑過(guò)即a:hover中的背景圖片,所以,如果使用多張圖片,鼠標(biāo)滑過(guò)會(huì)出現(xiàn)閃白的現(xiàn)象。使用CSS雪碧,由于一張圖片即可,所以不會(huì)出現(xiàn)這種現(xiàn)象。
          • 不足:
          • CSS雪碧的最大問(wèn)題是內(nèi)存使用
          • 影響瀏覽器的縮放功能
          • 拼圖維護(hù)比較麻煩
          • 使CSS的編寫(xiě)變得困難
          • CSS 雪碧調(diào)用的圖片不能被打印
          • 錯(cuò)誤得使用 Sprites 影響可訪問(wèn)性

          附錄三 一些tips解決方案


          頁(yè)面優(yōu)化實(shí)踐


          • 從下面的幾個(gè)方面可以進(jìn)行頁(yè)面的優(yōu)化:
          • 減少請(qǐng)求數(shù)
          • 圖片合并
          • CSS文件合并
          • 減少內(nèi)聯(lián)樣式
          • 避免在 CSS中使用 import
          • 減少文件大小
          • 選擇適合的圖片格式
          • 圖片壓縮
          • CSS 值縮寫(xiě)(Shorthand Property)
          • 文件壓縮
          • 頁(yè)面性能
          • 調(diào)整文件加載順序
          • 減少標(biāo)簽數(shù)量
          • 調(diào)整選擇器長(zhǎng)度
          • 盡量使用CSS 制作顯示表現(xiàn)
          • 增強(qiáng)代碼可讀性與可維護(hù)性
          • 規(guī)范化
          • 語(yǔ)義化
          • 模塊化

          寫(xiě)DIV+CSS 的一些常識(shí)


          • 不要使用過(guò)小的圖片做背景平鋪
          • 這就是為何很多人都不用 1px 的原因,這才知曉。寬高 1px 的圖片平鋪出一個(gè)寬高 200px 的區(qū)域,需要 200200=40, 000 次,占用資源
          • 無(wú)邊框
          • 推薦的寫(xiě)法是 border:none;,哈哈,我一直在用這個(gè)。 border:0; 只是定義邊框?qū)挾葹榱悖吙驑邮健㈩伾€是會(huì)被瀏覽器解析,占用資源
          • 慎用 通配符
          • 所謂通配符,就是將CSS 中的所有標(biāo)簽均初始化,不管用的不用的,過(guò)時(shí)的先進(jìn)的,一視同仁,這樣,大大的占用資源。要有選擇的初始化標(biāo)簽。
          • CSS的十六進(jìn)制顏色代碼縮寫(xiě)
          • 習(xí)慣了縮寫(xiě)及小寫(xiě),這才知道,原來(lái)不是推薦的寫(xiě)法,為的是減少解析所占用的資源。但同時(shí)會(huì)增加文件體積。孰優(yōu)孰劣,有待仔細(xì)考證。
          • 樣式放頭上,腳本放腳下。不內(nèi)嵌,只外鏈
          • 堅(jiān)決不用 CSS表達(dá)式
          • 使用 引用樣式表,而不是通過(guò)@import 導(dǎo)入。
          • 一般來(lái)說(shuō),PNG比 GIF 要小,小得多。再者,GIF 中有多少顏色是被浪費(fèi)的,很值得優(yōu)化。
          • 千萬(wàn)不要在 HTML中縮放圖片,一者不好看,二者占資源。
          • 正文字體最好用偶數(shù)
          • 12px、14px、16px,效果非常好。特例,15px。
          • block、ul、ol等上下留出至少一倍行距,左側(cè)至少兩倍行距,右側(cè)隨意。
          • 段落之間,至少要有一倍行距
          • 強(qiáng)行指定某些元素的 line-height,正文 1.6倍于文字大小,標(biāo)題1.3倍。
          • 中文標(biāo)點(diǎn)用全角
          • 英文夾雜在中文中,左右空格,半角。
          • 中文字體的粗體和斜體,遠(yuǎn)離較好

          常用代碼片段


          • 雅虎工程師提供的CSS初始化示例代碼【僅供參考】
          • 可以在html頭文件中直接引用,從而避免瀏覽器的不兼容帶來(lái)的錯(cuò)誤。
          body,
          div,
          dl,
          dt,
          dd,
          ul,
          ol,
          li,
          h1,
          h2,
          h3,
          h4,
          h5,
          h6,
          pre,
          code,
          form,
          fieldset,
          legend,
          input,
          button,
          textarea,
          p,
          blockquote,
          th,
          td { 
           margin:0; padding:0; 
          }
          body {
           background:#fff; 
           color:#555; 
           font-size:14px; 
           font-family: Verdana, Arial, Helvetica, sans-serif; 
          }
          td,
          th,
          caption { 
           font-size:14px;
          }
          h1, 
          h2, 
          h3, 
          h4, 
          h5, 
          h6 { 
           font-weight:normal; 
           font-size:100%; 
          }
          address, 
          caption,
          cite, 
          code, 
          dfn, 
          em, 
          strong,
          th, 
          var { 
           font-style:normal; 
           font-weight:normal;
          }
          a { 
           color:#555; 
           text-decoration:none; 
          }
          a:hover { 
           text-decoration:underline; 
          }
          img {
           border:none;
          }
          ol,ul,li { 
           list-style:none; 
          }
          input, 
          textarea, 
          select, 
          button { 
           font:14px Verdana,Helvetica,Arial,sans-serif; 
          }
          table { 
           border-collapse:collapse; 
          }
          html {
           overflow-y: scroll;
          } 
          .clearfix:after {
           content: "."; 
           display: block; 
           height:0; 
           clear:both; 
           visibility: hidden;
          }
          .clearfix { 
           *zoom:1; 
          }
          
          • mobile meta標(biāo)簽
          <meta name=”viewport” content=”width=320,target-densitydpi=dpi_value,initial-scale=1, user-scalable=no”/>
          
          • 表格不被撐開(kāi)
          table-layout: fixed; word-break: break-all;;border-collapse: collapse
          
          • 不設(shè)寬高居中
          <div id=”abc” style=”display:table;text-align:center;width:100%;height:100%;”>
           <span style=”background:#f00; display:table-cell; vertical-align:middle;”>
           <input type=”button” value=”item1″ />
           </span>
          </div>
          
          • 透明度的兼容代碼
          filter:alpha(opacity=50); /*1-100*/
          -moz-opacity:0.5; /*0-1.0*/
          -khtml-opacity:0.5; /*0-1.0*/
          opacity:0.5; /*0-1.0*/
          
          • 文字溢出點(diǎn)點(diǎn)省略
          white-space:nowrap;
          text-overflow:ellipsis;
          overflow:hidden;
          
          • 清除浮動(dòng)的幾種方法
          • 方法一:投機(jī)取巧法 – 不推薦
          • 直接一個(gè)放到當(dāng)作最后一個(gè)子標(biāo)簽放到父標(biāo)簽?zāi)莾海朔椒▽以嚥凰嫒菪詮?qiáng)
          • 方法二:overflow + zoom方法 –不推薦
          • .fix{overflow:hidden; zoom:1;}
          • 此方法優(yōu)點(diǎn)在于代碼簡(jiǎn)潔,涵蓋所有瀏覽器
          • 方法三:after + zoom方法 -推薦–此方法可以說(shuō)是綜合起來(lái)最好的方法了
          • clearfix只應(yīng)用在包含浮動(dòng)子元素的父級(jí)元素上
          .fix{zoom:1;}
          .fix:after{
           display:block; 
           content:'clear'; 
           clear:both;
           line-height:0; 
           visibility:hidden;
          }
          
          • 更多代碼片段詳情
          • 實(shí)用的60個(gè)CSS代碼片段

          一些總結(jié)


          • 自動(dòng)繼承屬性:
          • color
          • font
          • text-align
          • list-style
          • 非繼承屬性:
          • background
          • border
          • position
          • 具有破壞性的元素:
          • float
          • display:none;
          • position:absoblute/fixed/sticky;
          • 具有包裹性的元素:
          • display:inline-block/table-cell
          • position:absolute/fixed/sticky
          • overflow:hidden/scroll
          • 消除圖片底部間隙的方法
          • 圖片塊狀化-無(wú)基線對(duì)齊
          • img{display:block;}
          • 圖片底線對(duì)齊
          • img{vertical-align:bottom;}
          • 行高足夠小 - 基線位置上移
          • .box{line-height:0;}

          一些概念


          • BFC
          • BFC全稱”Block Formatting Context” 中文為“塊級(jí)格式化上下文”
          • 記住這么一句話:BFC元素特性表現(xiàn)原則就是,內(nèi)部子元素再怎么翻江倒海,翻云覆雨都不會(huì)影響外部的元素
          • BFC就是頁(yè)面上的一個(gè)隔離的獨(dú)立容器,容器里面的子元素不會(huì)影響到外面的元素。反之也如此
          • 優(yōu)雅降級(jí)(graceful degradation)
          • 一開(kāi)始就構(gòu)建完整的功能,然后再針對(duì)低版本瀏覽器進(jìn)行兼容
          • 漸進(jìn)增強(qiáng) progressive enhancement:
          • 是在瀏覽器開(kāi)啟JavaScript功能后,如果瀏覽器版本不支持某些 JavaScript 能力,我們解決這種問(wèn)題的方式
          • 平穩(wěn)退化
          • 是在瀏覽器沒(méi)有JavaScript功能,或沒(méi)有開(kāi)啟JavaScript功能情況下,我們解決這種問(wèn)題的方式;

          學(xué)習(xí)從來(lái)不是一個(gè)人的事情,要有個(gè)相互監(jiān)督的伙伴,想要學(xué)習(xí)或交流前端問(wèn)題的小伙伴可以私信“學(xué)習(xí)”小明加群獲取2019web前端最新入門資料,一起學(xué)習(xí),一起成長(zhǎng)!


          主站蜘蛛池模板: 91国在线啪精品一区| 亚洲一区无码精品色| 亚洲老妈激情一区二区三区| 久久国产香蕉一区精品| 少妇无码一区二区二三区| 91在线一区二区| 丝袜人妻一区二区三区| 无码aⅴ精品一区二区三区| 国精品无码一区二区三区在线蜜臀 | 无码国产精品一区二区免费I6| 黄桃AV无码免费一区二区三区 | 狠狠做深爱婷婷综合一区| 亚洲国产美女福利直播秀一区二区| 精品视频一区二区观看| 无码日本电影一区二区网站| 久久久久无码国产精品一区| 色系一区二区三区四区五区| 久久久精品人妻一区二区三区蜜桃 | 国产在线一区二区综合免费视频 | 国产人妖视频一区二区 | 中文字幕一区视频| 中文无码AV一区二区三区 | 一区二区三区无码被窝影院| 韩国福利一区二区三区高清视频| 成人国产精品一区二区网站公司| 久久久久人妻精品一区| 国产激情无码一区二区app| 一区二区在线视频观看| 四虎在线观看一区二区| 亚洲av色香蕉一区二区三区蜜桃| 无码人妻精品一区二区在线视频| 国产一区二区四区在线观看| 成人精品一区二区三区电影| 亚洲AV无码国产一区二区三区 | 精品国产日韩一区三区| 无码视频一区二区三区| 伊人色综合视频一区二区三区| 人妻久久久一区二区三区| 人妻久久久一区二区三区| 亚洲AV无一区二区三区久久| 久久国产视频一区|