首頁 web前端 css教學 詳解css載入會造成阻塞嗎_CSS教學_CSS_網頁製作

詳解css載入會造成阻塞嗎_CSS教學_CSS_網頁製作

Mar 21, 2018 pm 02:47 PM
css 教學

這次帶給大家詳解css載入會造成阻塞嗎,css載入造成阻塞的注意事項有哪些,下面就是實戰案例,一起來看一下。

終於考試完了,今天突然想起來前陣子找實習的時候,今日頭條面試官問我,js執行會阻塞DOM樹的解析和渲染,那麼css載入會阻塞DOM樹的解析和渲染嗎?所以,接下來我就來對css載入對DOM樹的解析和渲染做一個測試。

為了完成本次測試,先來科普一下,如何利用chrome來設定下載速度

#1、打開控制台(按下F12),可以看到下圖,重點在我畫紅圈的地方

2、點擊我畫紅圈的地方(No throttling),會看到下圖,我們選擇GPRS這個選項

3、這樣,我們對資源的下載速度上限就會被限製成20kb/s,好,那接下來就進入我們的正題

css載入會阻塞DOM樹的解析渲染嗎?

用程式碼說話:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>css阻塞</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
      h1 {
        color: red !important
      }
    </style>
    <script>
      function h () {
        console.log(document.querySelectorAll(&#39;h1&#39;))
      }
      setTimeout(h, 0)
    </script>
    <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet">
  </head>
  <body>
    <h1>这是红色的</h1>
  </body>
</html>
登入後複製

假設: css載入會阻塞DOM樹解析與渲染

假設結果: 在bootstrap.css還沒載入完之前,下面的內容不會被解析渲染,那麼我們一開始看到的應該是白屏,h1不會顯示出來。而此時console.log的結果應該是一個空數組。

實際結果:如下圖

css會阻塞DOM樹解析?

由上圖我們可以看到,當css還沒載入完成的時候,h1並沒有顯示,但是此時控制台輸出如下

#可以得知,此時DOM樹至少已經解析完成到了h1那裡,而此時css還沒載入完成,也就說明,css並不會阻塞DOM樹的解析。

css載入會阻塞DOM樹渲染?

由上圖,我們也可以看到,當css還沒載入出來的時候,頁面顯示白屏,直到css載入完成之後,紅色字體才顯示出來,也就是說,下面的內容雖然解析了,但並沒有被渲染出來。所以,css載入會阻塞DOM樹渲染。

個人對此機制的評價

其實我覺得,這可能也是瀏覽器的最佳化機制。因為你載入css的時候,可能會修改下面DOM節點的樣式,如果css載入不阻塞DOM樹渲染的話,那麼當css載入完之後,DOM樹可能又得重新重繪或回流了,這就造成了一些沒有必要的損耗。所以我乾脆就先把DOM樹的結構先解析完,把可以做的工作做完,然後等你css加載完之後,在根據最終的樣式來渲染DOM樹,這種做法性能方面確實會比較好一點。

css載入會阻塞js運行嗎?

由上面的推論,我們可以得到,css載入不會阻塞DOM樹解析,但會阻塞DOM樹渲染。那麼,css載入會不會阻塞js執行呢?

同樣,透過程式碼來驗證.

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>css阻塞</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script>
      console.log(&#39;before css&#39;)
      var startDate = new Date()
    </script>
    <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet">
  </head>
  <body>
    <h1>这是红色的</h1>
    <script>
      var endDate = new Date()
      console.log(&#39;after css&#39;)
      console.log(&#39;经过了&#39; + (endDate -startDate) + &#39;ms&#39;)
    </script>
  </body>
</html>
登入後複製

 

假設: css載入會阻塞後面的js執行

預期結果: 在link後面的js程式碼,應該要在css載入完成後才會執行

實際結果:

由上圖我們可以看出,位於css載入語句前的那個js程式碼先執行了,但是位於css載入語句後面的程式碼遲遲沒有執行,直到css載入完成後,它才執行。這也就說明了,css載入會阻塞後面的js語句的執行。詳細結果看下圖(css載入用了5600+ms):

#結論

##由上所述,我們可以得出以下結論:

1.css載入不會阻塞DOM樹的解析

2.css載入會阻塞DOM樹的渲染
3.css載入會阻塞後面js語句的執行

因此,為了避免讓使用者看到長時間的白螢幕時間,我們應該盡可能的提高css載入速度,例如可以使用以下幾種方法:

1.使用CDN(因為CDN會根據你的網路狀況,替你挑選最近的一個具有快取內容的節點為你提供資源,因此可以減少載入時間)
2.對css進行壓縮(可以用很多打包工具,例如webpack,gulp等,也可以透過開啟gzip壓縮)
3.合理的使用快取(設定cache-control,expires,以及E-tag都是不錯的,不過要注意一個問題,就是檔案更新後,你要避免快取而帶來的影響。就是不能緩存)

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

css如何做出0.5像素的線條

#css3的Transition平滑過渡選單列實作

以上是詳解css載入會造成阻塞嗎_CSS教學_CSS_網頁製作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1230
24
vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

了解HTML,CSS和JavaScript:初學者指南 了解HTML,CSS和JavaScript:初學者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

HTML,CSS和JavaScript的角色:核心職責 HTML,CSS和JavaScript的角色:核心職責 Apr 08, 2025 pm 07:05 PM

HTML定義網頁結構,CSS負責樣式和佈局,JavaScript賦予動態交互。三者在網頁開發中各司其職,共同構建豐富多彩的網站。

bootstrap怎麼寫分割線 bootstrap怎麼寫分割線 Apr 07, 2025 pm 03:12 PM

創建 Bootstrap 分割線有兩種方法:使用 標籤,可創建水平分割線。使用 CSS border 屬性,可創建自定義樣式的分割線。

bootstrap怎麼插入圖片 bootstrap怎麼插入圖片 Apr 07, 2025 pm 03:30 PM

在 Bootstrap 中插入圖片有以下幾種方法:直接插入圖片,使用 HTML 的 img 標籤。使用 Bootstrap 圖像組件,可以提供響應式圖片和更多樣式。設置圖片大小,使用 img-fluid 類可以使圖片自適應。設置邊框,使用 img-bordered 類。設置圓角,使用 img-rounded 類。設置陰影,使用 shadow 類。調整圖片大小和位置,使用 CSS 樣式。使用背景圖片,使用 background-image CSS 屬性。

bootstrap怎麼設置框架 bootstrap怎麼設置框架 Apr 07, 2025 pm 03:27 PM

要設置 Bootstrap 框架,需要按照以下步驟:1. 通過 CDN 引用 Bootstrap 文件;2. 下載文件並將其託管在自己的服務器上;3. 在 HTML 中包含 Bootstrap 文件;4. 根據需要編譯 Sass/Less;5. 導入定製文件(可選)。設置完成後,即可使用 Bootstrap 的網格系統、組件和样式創建響應式網站和應用程序。

bootstrap按鈕怎麼用 bootstrap按鈕怎麼用 Apr 07, 2025 pm 03:09 PM

如何使用 Bootstrap 按鈕?引入 Bootstrap CSS創建按鈕元素並添加 Bootstrap 按鈕類添加按鈕文本

bootstrap怎麼調整大小 bootstrap怎麼調整大小 Apr 07, 2025 pm 03:18 PM

要調整 Bootstrap 中元素大小,可以使用尺寸類,具體包括:調整寬度:.col-、.w-、.mw-調整高度:.h-、.min-h-、.max-h-

See all articles