整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          深入淺出瀏覽器渲染原理

          塊的文章網上也是比較多的,但大多數都是講解DOM樹的渲染,對于頁面從請求到展示的詳細流程講解還是比較少的,而且有些說的也不容易理解,下面我將以圖文結合的形式給大伙講講。

          DNS查詢

          作用

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

          背景

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

          過程

          在 TCP 握手之前就已經進行了 DNS 查詢,這個查詢是操作系統自己做的。當你在瀏覽器中想訪問 www.test.com 時,會進行一下操作:

          1. 操作系統會首先在本地緩存中查詢 IP
          2. 沒有的話會去系統配置的 DNS 服務器中查詢
          3. 如果這時候還沒得話,會直接去 DNS 根服務器查詢,這一步查詢會找出負責 com 這個一級域名的服務器
          4. 然后去該服務器查詢 baidu 這個二級域名
          5. 接下來三級域名的查詢其實是我們配置的,你可以給 www 這個域名配置一個 IP,然后還可以給別的三級域名配置一個 IP

          以上介紹的是 DNS 迭代查詢,還有種是遞歸查詢,區別就是前者是由客戶端去做請求,后者是由系統配置的 DNS 服務器做請求,得到結果后將數據返回給客戶端。

          TCP握手

          在進行完DNS解析之后,接下來就是 TCP 握手,應用層會下發數據給傳輸層,這里 TCP 協議會指明兩端的端口號,然后下發給網絡層。網絡層中的 IP 協議會確定 IP 地址,并且指示了數據傳輸中如何跳轉路由器。然后包會再被封裝到數據鏈路層的數據幀結構中,最后就是物理層面的傳輸了。

          TCP建立連接的三次握手

          首先假設主動發起請求的一端稱為客戶端,被動連接的一端稱為服務端。不管是客戶端還是服務端,TCP 連接建立完后都能發送和接收數據,所以 TCP 是一個全雙工的協議。

          起初,兩端都為 CLOSED 狀態。在通信開始前,雙方都會創建 TCB。 服務器創建完 TCB 后便進入 LISTEN 狀態,此時開始等待客戶端發送數據。

          第一次握手

          客戶端向服務端發送連接請求報文段。該報文段中包含自身的數據通訊初始序號。請求發送后,客戶端便進入 SYN-SENT 狀態。

          第二次握手

          服務端收到連接請求報文段后,如果同意連接,則會發送一個應答,該應答中也會包含自身的數據通訊初始序號,發送完成后便進入 SYN-RECEIVED 狀態。

          第三次握手

          當客戶端收到連接同意的應答后,還要向服務端發送一個確認報文。客戶端發完這個報文段后便進入 ESTABLISHED 狀態,服務端收到這個應答后也進入 ESTABLISHED 狀態,此時連接建立成功。

          第三次握手中可以包含數據,通過快速打開(TFO)技術就可以實現這一功能。其實只要涉及到握手的協議,都可以使用類似 TFO 的方式,客戶端和服務端存儲相同的 cookie,下次握手時發出 cookie 達到減少 RTT 的目的。

          TLS握手

          TLS 協議位于傳輸層之上,應用層之下,主要是對HTTP請求進行加密。首次進行 TLS 協議傳輸需要兩個 RTT ,接下來可以通過 Session Resumption 減少到一個 RTT。

          TLS 握手過程如下圖:

          1. 客戶端發送一個隨機值以及需要的協議和加密方式。
          2. 服務端收到客戶端的隨機值,自己也產生一個隨機值,并根據客戶端需求的協議和加密方式來使用對應的方式,并且發送自己的證書(如果需要驗證客戶端證書需要說明)
          3. 客戶端收到服務端的證書并驗證是否有效,驗證通過會再生成一個隨機值,通過服務端證書的公鑰去加密這個隨機值并發送給服務端,如果服務端需要驗證客戶端證書的話會附帶證書
          4. 服務端收到加密過的隨機值并使用私鑰解密獲得第三個隨機值,這時候兩端都擁有了三個隨機值,可以通過這三個隨機值按照之前約定的加密方式生成密鑰,接下來的通信就可以通過該密鑰來加密解密

          通過以上步驟可知,在 TLS 握手階段,兩端使用非對稱加密的方式來通信,但是因為非對稱加密損耗的性能比對稱加密大,所以在正式傳輸數據時,兩端使用對稱加密的方式通信。

          負載均衡服務器

          數據在進入服務端之前,可能還會先經過負責負載均衡的服務器,它的作用就是將請求合理的分發到多臺服務器上,這時假設服務端會響應一個 HTML 文件。

          首先瀏覽器會判斷狀態碼是什么,如果是 200 那就繼續解析,如果 400 或 500 的話就會報錯,如果 300 的話會進行重定向,這里會有個重定向計數器,避免過多次的重定向,超過次數也會報錯。

          瀏覽器解析

          瀏覽器開始解析文件,如果是 gzip 格式的話會先解壓一下,然后通過文件的編碼格式去解碼文件。

          文件解碼成功后會正式開始渲染流程,先會根據 HTML 構建 DOM 樹,有 CSS 的話會去構建 CSSOM 樹。如果遇到 script 標簽的話,會判斷是否存在 async 或者 defer ,前者會并行進行下載并執行 JS,后者會先下載文件,然后等待 HTML 解析完成后順序執行。

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

          CSSOM 樹和 DOM 樹構建完成后會開始生成 Render 樹,這一步就是確定頁面元素的布局、樣式等等諸多方面的東西

          在生成 Render 樹的過程中,瀏覽器就開始調用 GPU 繪制,合成圖層,將內容顯示在屏幕上了。

          總結

          總的來說,今天這篇文章主要是帶著大家從 DNS 查詢開始到渲染出畫面完整的了解一遍過程,里面涉及到DNS、HTTP、TLS、負載均衡和瀏覽器渲染等等內容,算不上非常詳細,但如果面試的時候能說出來這些,相信面試官也會對你刮目相看的。

          . 對 HTML 語義化的理解

          語義化是指根據內容的結構化(內容語義化),選擇合適的標簽(代 碼語義化)。通俗來講就是用正確的標簽做正確的事情。

          語義化的優點如下:

          對機器友好,帶有語義的文字表現力豐富,更適合搜索引擎的爬蟲爬 取有效信息,有利于 SEO。除此之外,語義類還支持讀屏軟件,根據 文章可以自動生成目錄;

          對開發者友好,使用語義類標簽增強了可讀性,結構更加清晰,開發 者能清晰地看出網頁的結構,便于團隊的開發與維護。

          常見的語義化標簽:

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

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

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

          CSS1Compat:標準模式(Strick mode),默認模式,瀏覽器使用 W3C 的標準解析渲染頁面。在標準模式中,瀏覽器以其支持的最高標準呈 現頁面。

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

          3. script 標簽中 defer 和 async 的區別

          如果沒有 defer 或 async 屬性,瀏覽器會立即加載并執行相應的腳本。它不會等待后續加載的文檔元素,讀取到就會開始加載和執行,這樣 就阻塞了后續文檔的加載。

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

          其中藍色代表 js 腳本網絡加載時間,紅色代表 js 腳本執行時間,綠 色代表 html 解析。

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

          執行順序:多個帶 async 屬性的標簽,不能保證加載的順序;多個帶 defer 屬性的標簽,按照加載順序執行;

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

          4. 行內元素有哪些?塊級元素有哪些? 空(void)元素有那 些?

          行內元素有:a b span img input select strong;

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

          空元素,即沒有內容的 HTML 元素。空元素是在開始標簽中關閉的,也就是空元素沒有閉合標簽:

          常見的有:<br>、<hr>、<img>、<input>、<link>、<meta>;

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

          5. 瀏覽器是如何對 HTML5 的離線儲存資源進行管理和加載?

          在線的情況下,瀏覽器發現 html 頭部有 manifest 屬性,它會請求 manifest 文件,如果是第一次訪問頁面 ,那么瀏覽器就會根據 manifest 文件的內容下載相應的資源并且進行離線存儲。如果已經 訪問過頁面并且資源已經進行離線存儲了,那么瀏覽器就會使用離線 的資源加載頁面,然后瀏覽器會對比新的 manifest 文件與舊的 manifest 文件,如果文件沒有發生改變,就不做任何操作,如果文 件改變了,就會重新下載文件中的資源并進行離線存儲。

          離線的情況下,瀏覽器會直接使用離線存儲的資源。

          6. Canvas 和 SVG 的區別

          (1)SVG:

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

          其特點如下:

          不依賴分辨率

          支持事件處理器

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

          復雜度高會減慢渲染速度(任何過度使用 DOM 的應用都不快)不適合游戲應用

          (2)Canvas:

          Canvas 是畫布,通過 Javascript 來繪制 2D 圖形,是逐像素進行渲 染的。其位置發生改變,就會重新進行繪制。

          其特點如下:

          依賴分辨率

          不支持事件處理器

          弱的文本渲染能力

          能夠以 .png 或 .jpg 格式保存結果圖像

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

          注:矢量圖,也稱為面向對象的圖像或繪圖圖像,在數學上定義為一 系列由線連接的點。矢量文件中的圖形元素稱為對象。每個對象都是

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

          7. 說一下 HTML5 drag API

          dragstart:事件主體是被拖放元素,在開始拖放被拖放元素時觸發。

          darg:事件主體是被拖放元素,在正在拖放被拖放元素時觸發。dragenter:事件主體是目標元素,在被拖放元素進入某元素時觸發。dragover:事件主體是目標元素,在被拖放在某元素內移動時觸發。dragleave:事件主體是目標元素,在被拖放元素移出目標元素是觸 發。

          drop:事件主體是目標元素,在目標元素完全接受被拖放元素時觸發。

          dragend:事件主體是被拖放元素,在整個拖放操作結束時觸發。

          三部分 附錄(因為暫時不支持插入超鏈接所以部分內容無法顯示


          附錄一 DIV命名規范


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


          • 注釋的寫法: /* Footer */ 內容區/* End Footer */
          • id的命名:
          • 頁面結構
          • 容器: container
          • 頁頭:header
          • 內容:content/container
          • 頁面主體:main
          • 頁尾:footer
          • 導航:nav
          • 側欄:sidebar
          • 欄目:column
          • 頁面外圍控制整體布局寬度:wrapper
          • 左右中:left right center

          • 導航
          • 導航:nav
          • 主導航:mainbav
          • 子導航:subnav
          • 頂導航:topnav
          • 邊導航:sidebar
          • 左導航:leftsidebar
          • 右導航:rightsidebar
          • 菜單:menu
          • 子菜單:submenu
          • 標題: title
          • 摘要: summary

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

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

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


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

          附錄三 一些tips解決方案


          頁面優化實踐


          • 從下面的幾個方面可以進行頁面的優化:
          • 減少請求數
          • 圖片合并
          • CSS文件合并
          • 減少內聯樣式
          • 避免在 CSS中使用 import
          • 減少文件大小
          • 選擇適合的圖片格式
          • 圖片壓縮
          • CSS 值縮寫(Shorthand Property)
          • 文件壓縮
          • 頁面性能
          • 調整文件加載順序
          • 減少標簽數量
          • 調整選擇器長度
          • 盡量使用CSS 制作顯示表現
          • 增強代碼可讀性與可維護性
          • 規范化
          • 語義化
          • 模塊化

          寫DIV+CSS 的一些常識


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

          常用代碼片段


          • 雅虎工程師提供的CSS初始化示例代碼【僅供參考】
          • 可以在html頭文件中直接引用,從而避免瀏覽器的不兼容帶來的錯誤。
          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標簽
          <meta name=”viewport” content=”width=320,target-densitydpi=dpi_value,initial-scale=1, user-scalable=no”/>
          
          • 表格不被撐開
          table-layout: fixed; word-break: break-all;;border-collapse: collapse
          
          • 不設寬高居中
          <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*/
          
          • 文字溢出點點省略
          white-space:nowrap;
          text-overflow:ellipsis;
          overflow:hidden;
          
          • 清除浮動的幾種方法
          • 方法一:投機取巧法 – 不推薦
          • 直接一個放到當作最后一個子標簽放到父標簽那兒,此方法屢試不爽,兼容性強
          • 方法二:overflow + zoom方法 –不推薦
          • .fix{overflow:hidden; zoom:1;}
          • 此方法優點在于代碼簡潔,涵蓋所有瀏覽器
          • 方法三:after + zoom方法 -推薦–此方法可以說是綜合起來最好的方法了
          • clearfix只應用在包含浮動子元素的父級元素上
          .fix{zoom:1;}
          .fix:after{
           display:block; 
           content:'clear'; 
           clear:both;
           line-height:0; 
           visibility:hidden;
          }
          
          • 更多代碼片段詳情
          • 實用的60個CSS代碼片段

          一些總結


          • 自動繼承屬性:
          • 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
          • 消除圖片底部間隙的方法
          • 圖片塊狀化-無基線對齊
          • img{display:block;}
          • 圖片底線對齊
          • img{vertical-align:bottom;}
          • 行高足夠小 - 基線位置上移
          • .box{line-height:0;}

          一些概念


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

          學習從來不是一個人的事情,要有個相互監督的伙伴,想要學習或交流前端問題的小伙伴可以私信“學習”小明加群獲取2019web前端最新入門資料,一起學習,一起成長!


          主站蜘蛛池模板: 日韩免费一区二区三区在线播放| 亚洲欧美日韩中文字幕一区二区三区| 无码人妻久久一区二区三区免费 | 中文字幕一精品亚洲无线一区| 国产精品视频一区麻豆| 国产日韩精品一区二区三区在线 | 成人免费一区二区三区| 午夜视频久久久久一区 | 国产精品一区二区三区高清在线| 3D动漫精品啪啪一区二区下载| 日韩一区二区电影| 精品女同一区二区三区免费站| 骚片AV蜜桃精品一区| 精品国产一区二区三区麻豆| 中文激情在线一区二区| 色一情一乱一区二区三区啪啪高| 日本一区二区三区免费高清| 正在播放国产一区| 久久精品一区二区国产| 国产手机精品一区二区| 日韩电影在线观看第一区| 上原亚衣一区二区在线观看| 少妇无码一区二区三区免费| 大帝AV在线一区二区三区| 中文字幕在线一区二区三区| tom影院亚洲国产一区二区| 日本丰满少妇一区二区三区| 亚洲高清美女一区二区三区| 内射少妇一区27P| 伊人色综合视频一区二区三区| 无码国产亚洲日韩国精品视频一区二区三区| 久久久久人妻精品一区三寸蜜桃| 精品无码人妻一区二区三区品| 日韩AV在线不卡一区二区三区 | 肥臀熟女一区二区三区| 国产乱码精品一区二区三区| 无码AV天堂一区二区三区| 无码人妻精品一区二区蜜桃AV| 亚洲AV无码片一区二区三区| 久久一区二区精品综合| 国产一区二区三区免费观在线|