整合營銷服務商

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

          免費咨詢熱線:

          你知道HTML、CSS、JS文件在瀏覽器中是如何轉化成頁面的嗎?

          前面一篇文章:「高頻面試題」瀏覽器從輸入url到頁面展示中間發生了什么 中,我們有對瀏覽器的渲染流程做了一個概括性的介紹,今天這篇文章我們將深入學習這部分內容。

          對于很多前端開發來說,平常做工主要專注于業務開發,對瀏覽器的渲染階段可能不是很了解。實際上這個階段很重要,了解瀏覽器的渲染過程,能讓我們知道我們寫的HTML、CSS、JS代碼是如何被解析,并最終渲染成一個頁面的,在頁面性能優化的時候有相應的解決思路。

          我們先來看一個問題:

          HTML、CSS、JS文件在瀏覽器中是如何轉化成頁面的?

          如果你回答不上來,那就往下看吧。

          按照渲染的時間順序,渲染過程可以分為下面幾個子階段:構建DOM樹、樣式計算、布局階段、分層、柵格化和合成顯示。

          下面詳細看下每個階段都做了哪些事情。

          1. 構建DOM樹

          HTML文檔描述一個頁面的結構,但是瀏覽器無法直接理解和使用HTML,所以需要通過HTML解析器將HTML轉換成瀏覽器能夠理解的結構——DOM樹。

          HTML文檔中所有內容皆為節點,各節點之間有層級關系,彼此相連,構成DOM樹。

          構建過程:讀取HTML文檔的字節(Bytes),將字節轉換成字符(Chars),依據字符確定標簽(Tokens),將標簽轉換成節點(Nodes),以節點為基準構建DOM樹。參考下圖:

          打開Chrome的開發者工具,在控制臺輸入 document 后回車,就能看到一個完整的DOM樹結構,如下圖所示:

          在控制臺打印出來的DOM結構和HTML內容幾乎一樣,但和HTML不同的是,DOM是保存在內存中的樹狀結構,可以通過JavaScript來查詢或修改其內容。

          2. 樣式計算

          樣式計算這個階段,是為了計算出DOM節點中每個元素的表現樣式。

          2.1 解析CSS

          CSS樣式可以通過下面三種方式引入:

          • 通過link引用外部的CSS文件
          • style 標簽內的CSS
          • 元素的style屬性內嵌的CSS

          和HTML一樣,瀏覽器無法直接理解純文本的CSS樣式,需要通過CSS解析器將CSS解析成 styleSheets 結構,也就是我們常說的 CSSOM樹

          styleSheets結構同樣具備查詢和修改功能:

          document.styleSheets

          2.2 屬性值標準化

          屬性值標準化看字面意思有點不好理解,我們通過下面一個例子來看看什么是屬性值標準化:

          在寫CSS樣式的時候,我們在設置color屬性值的時候,經常會用white、red等,但是這種值瀏覽器的渲染引擎不容易理解,所以需要將所有值轉換成渲染引擎容易理解的、標準化的計算值,這個過程就是屬性值標準化。

          white標準化后的值為 rgb(255, 255, 255)

          2.3 計算DOM樹中每個節點的樣式

          完成樣式的屬性值標準化后,就需要計算每個節點的樣式屬性,這個階段CSS有兩個規則我們需要清楚:

          • 繼承規則:每個DOM節點都包含有父節點的樣式
          • 層疊規則:層疊是CSS的一個基本特征,是一個定義了如何合并來自多個源的屬性值的算法。

          樣式計算階段是為了計算出DOM節點中每個元素的具體樣式,在計算過程中需要遵守CSS的繼承和層疊兩個規則。

          該階段最終輸出的內容是每個DOM節點的樣式,并被保存在 ComputedStyle 的結構中。

          3. 布局階段

          經過上面的兩個步驟,我們已經拿到了DOM樹和DOM樹中元素的樣式,接下來需要計算DOM樹中可見元素的幾何位置,這個計算過程就是布局。

          3.1 創建布局樹

          在DOM樹中包含了一些不可見的元素,例如 head 標簽,設置了 display:none 屬性的元素,所以我們需要額外構建一棵只包含可見元素的布局樹。

          構建過程:從DOM樹的根節點開始遍歷,將所有可見的節點加到布局樹中,忽略不可見的節點。

          3.2 布局計算

          到這里我們就有了一棵構建好的布局樹,就可以開始計算布局樹節點的坐標位置了。從根節點開始遍歷,結合上面計算得到的樣式,確定每個節點對象在頁面上的具體大小和位置,將這些信息保存在布局樹中。

          布局階段的輸出是一個盒子模型,它會精確地捕獲每個元素在屏幕內的確切位置與大小。

          4. 分層

          現在我們已經有了布局樹,也知道了每個元素的具體位置信息,但是還不能開始繪制頁面,因為頁面中會有像3D變換、頁面滾動、或者用 z-index 進行z軸排序等復雜效果,為了更方便實現這些效果,渲染引擎還需要為特定的節點生成專用的圖層,并生成一棵對應的圖層樹(LayerTree)。

          在Chrome瀏覽器中,我們可以打開開發者工具,選擇 Elements-Layers 標簽,就可以看到頁面的分層情況,如下圖所示:

          瀏覽器的頁面實際上被分成了很多圖層,這些圖層疊加后合成了最終的頁面。

          到這里,我們構建了兩棵樹:布局樹和圖層樹。下面我們來看下這兩棵樹之間的關系:

          正常情況下,并不是布局樹的每個節點都包含一個圖層,如果一個節點沒有對應的圖層,那么這個節點就從屬于父節點的圖層。

          那節點要滿足什么條件才會被提升為一個單獨的圖層?只要滿足下面其中一個條件即可:

          • 擁有層疊上下文屬性的元素會被提升為單獨的一個圖層
          • 需要剪裁(clip)的地方也會被創建為圖層。

          5. 圖層繪制

          構建好圖層樹之后,渲染引擎就會對圖層樹中的每個圖層進行繪制。

          渲染引擎實現圖層繪制,會把一個圖層的繪制拆分成很多小的繪制指令,然后將這些指令按照順序組成一個繪制列表。

          6. 柵格化(raster)操作

          繪制一個圖層時會生成一個繪制列表,這只是用來記錄繪制順序和繪制指令的列表,實際上繪制操作是由渲染引擎中的合成線程來完成的。

          通過下圖來看下渲染主線程和合成線程之間的關系:

          當圖層的繪制列表準備好后,主線程會把該繪制列表提交給合成線程,合成線程開始工作。

          首先合成線程會將圖層劃分為圖塊(tile),圖塊大小通常是 256256 或者 512512。

          然后合成線程會按照視口附近的圖塊來優先生成位圖,實際生成位圖的操作是由柵格化來執行的。所謂柵格化,是指將圖塊轉換為位圖。而圖塊是柵格化執行的最小單位。渲染進程維護了一個柵格化的線程池,所有的圖塊柵格化都是在線程池內執行的,運行方式如下圖所示:

          7. 合成和顯示

          一旦所有圖塊都被光柵化,合成線程就會生成一個繪制圖塊的命令——“DrawQuad”,然后將該命令提交給瀏覽器進程。

          瀏覽器進程里面有一個名字叫做 viz 的組件,用來接收合成線程發過來的 DrawQuad 命令,然后根據命令執行。 DrawQuad 命令,將其頁面內容繪制到內存中,最后再將內存顯示在屏幕上。

          多年開發老碼農福利贈送:網頁制作,網站開發,web前端開發,從最零基礎開始的的HTML+CSS+JavaScript。jQuery,Vue、React、Ajax,node,angular框架等到移動端小程序項目實戰【視頻+工具+電子書+系統路線圖】都有整理,需要的伙伴可以私信我,發送“前端”等3秒后就可以獲取領取地址,送給每一位對編程感興趣的小伙伴

          8. 總結

          一個完整的渲染流程可以總結如下:

          • 1、渲染進程將HTML內容轉換為瀏覽器能夠讀懂的DOM樹結構。
          • 2、渲染引擎將CSS樣式表轉化為瀏覽器可以理解的styleSheets,計算出DOM節點的樣式。
          • 3、創建布局樹,并計算所需元素的布局信息。
          • 4、對布局樹進行分層,并生成分層樹。
          • 5、為每個圖層生成繪制列表,并將其提交到合成線程。
          • 6、合成線程將圖層分圖塊,并柵格化將圖塊轉換成位圖。
          • 7、合成線程發送繪制圖塊命令給瀏覽器進程。瀏覽器進程根據指令生成頁面,并顯示到顯示器上。

          渲染過程中還有兩個我們經常聽到的概念:重排和重繪。在這篇文章中就不細說了,下一篇文章再詳細介紹。

          DF文件是工作學習中的常客,在使用過程中,常常需要對PDF格式進行轉換,包括但不限于PDF轉Word、PDF轉PPT、PDF轉圖片等等。

          不過WPS雖然應用廣泛,但是里面關于PDF的轉換工具必需要會員才可以使用,但又不愿意只為了轉換一次而花費錢去買會員,本文為大家提供了5款免費在線轉換PDF的網站,建議收藏以備不時之需~

          1、i love pdf

          I LOVE PDF是一款免費的PDF網站,界面設計簡潔,首頁沒有廣告,但每個功能的操作界面是有廣告的,不會影響使用。

          部分功能:合并PDF、拆分PDF、壓縮PDF、PDF轉換至Word、PDF轉換至PowerPoint、PDF轉換至Excel、word轉換至PDF文件、PowerPoint轉換至PDF、Excel轉換至PDF、PDF轉JPG、JPG轉PDF、頁碼、水印、旋轉PDF、HTML轉換PDF、PDF解密、PDF加密、排版PDF文件、PDF轉換PDF/A、修復PDF

          2、迅捷PDF轉換器

          免費的在線文檔格式轉換軟件,不僅有常見的格式,還有諸多不常見文檔格式在這里都有,包括電子書格式轉換,一個網站解決各種文檔格式轉換問題。

          部分功能:
          文檔轉換→DF轉換至Word、PDF轉換至PowerPoint、PDF轉換至Excel、word轉換至PDF文件、PowerPoint轉換至PDF、Excel轉換至PDF、PDF轉JPG、JPG轉PDF

          文檔處理→PDF臺并、PDF分割、PDF解密、PDF增加密碼、PDF修改密碼、PDF圖片獲取、PDF刪除頁、PDF頁面提取、PDF旋轉、PDF頁面編輯、PDF替換文字、PDF添加水印、PDF刪除水印、PDF添加文字、PDF刪除文字、PDF鏈接編輯、PDF添加頁碼、PDF刪除圖片、PDF背景顏色、PDF簽名等

          除此之外,還有音視頻格式轉等功能,網站功能免費,頁面沒有廣告,可以放心使用。

          3、PDF Candy

          轉換為PDF和20多種格式的文件。此外,PDF Candy提供47種在線工具來處理PDF:編輯、拆分、合并、壓縮等等。

          4、all to all

          ALL TO ALL在線格式轉換,國內最全類型的在線文件轉換平臺,免費、快速,無須下載安裝任何軟件。支持約200多種格式的文件轉換,包括:視頻、音頻、圖片、字體等多媒體文件,以及常見的office文件、PDF、電子書等文檔。

          5、online2pdf

          ONLINE2PDF是個完全免費的良心線上PDF編輯網站,需要配合自帶翻譯功能的瀏覽器使用,目前國內訪問正常,功能豐富,操作簡便。


          以上就是全部的內容推薦啦,如果有幫助,記得點個贊吖~

          Java實現根據svg模版動態生成圖片

          使用場景

          需要Java語言動態生成圖片

          用流程圖簡單說明下我這邊工作中使用的場景

          僅供參考

          所以這里就需要生成證書了

          我先給大家看下最終實現的圖片效果

          這里要先說明一下

          • 圖片上的文字都是動態變化的即不同的訂單對應的圖片內容都不一樣
          • 圖片上還可以嵌入圖片哦 比如上圖的logo圖片

          下面說下我是如何解決的

          通過PhantomJS來實現

          這種方式是不能實現這個需求的

          這個的原理就是對網頁截圖 但只能對于靜態頁面截圖 不能根據不同的參數值動態生成圖片

          所以不提倡使用這種方式

          但也介紹下這種使用方式 朋友們根據自己的實際需求情況有選擇的使用

          通過html代碼實現圖片的效果 放入web容器(比如nginx)中部署

          這是h5代碼

          test文件夾下面的內容

          安裝一個docker nginx 將test文件夾加載到nginx容器的/usr/share/nginx/html目錄下面

          docker run --name nginx80  -p 8000:80  -v /tmp/test:/usr/share/nginx/html -d docker.io/nginx
          

          訪問的頁面效果

          訪問該頁面進行截圖

          這張圖片是截圖生成的圖片 但url中的id值并沒有傳給頁面

          在h5代碼中請求后端接口獲取數據動態顯示出來也是不可以的

          所以這種方式使用局限性很窄

          簡單介紹下代碼原理

          大致原理是 通過http請求該url獲取該url的文件流然后解析h5代碼生成圖片

          通過SVG模版動態生成

          先寫svg模版(其實也是h5代碼)

          讀取svg模版 動態傳入參數生成圖片

          其實現原理大致為 讀取svg document h5代碼 將動態參數map解析到h5代碼中 轉換成字節數組 生成圖片格式

          Linux環境圖片中文亂碼

          我本地是mac系統沒有這個問題 在發布到測試環境linux系統出現了這個問題

          先看下問題的現象

          看到了沒 生成的圖片中文全是亂碼

          原因是因為linux系統沒有中文字體

          既然linux系統沒有中文字體 那么就安裝它嘛 let's 盤它!!!

          先看下mac環境的字體情況

          • 安裝字體管理工具
          brew install fontconfig
          
          • 查看支持中文
          fc-list :lang=zh    (注意‘:’前的空格)
          

          mac環境默認會安裝很多中文字體

          再看下linux環境

          • 安裝字體管理工具
          yum -y install fontconfig
          
          • 查看支持中文
          fc-list :lang=zh
          

          果然沒有中文字體

          開始安裝中文字體

          將mac環境的宋體上傳到linux環境

          a 先在mac系統中找到字體安裝目錄

          /System/Library/Fonts
          

          b 找到宋體對應的文件

          c 將該文件上傳到linux指定的目錄下

          /usr/share/fonts/chinese
          

          d 賦予文件夾操作權限

          chmod -R 755 /usr/share/fonts/chinese
          

          e 安裝ttmkfdir來搜索目錄中所有的字體信息,并匯總生成fonts.scale文件

          yum -y install ttmkfdir
          
          ttmkfdir -e /usr/share/X11/fonts/encodings/encodings.dir
          
          

          修改字體配置文件

          vi /etc/fonts/fonts.conf
          添加
          <dir>/usr/share/fonts/chinese</dir>
          

          刷新內存中的字體緩存

          fc-cache
          

          確認是否安裝成功

          在jdk中安裝該宋體

          a 找到jdk所在的安裝目錄

          echo $JAVA_HOME 
          

          b 將宋體文件復制過來

          cp /usr/share/fonts/chinese/STHeiti\ Light.ttc /usr/local/software/jdk1.8.0_141/jre/lib/fonts/fallback
          
          fallback代表存放后備語言的文件夾
          

          重啟java服務即可

          DEMO代碼

          https://gitee.com/pingfanrenbiji/resource/tree/master/image
          

          注意: 引入的依賴問題

            <!--phantomjs -->
            <dependency>
             <groupId>org.seleniumhq.selenium</groupId>
             <artifactId>selenium-java</artifactId>
             <version>2.53.1</version>
            </dependency>
            <dependency>
             <groupId>com.github.detro</groupId>
             <artifactId>ghostdriver</artifactId>
             <version>2.1.0</version>
            </dependency>
          
            <!--svg-->
            <dependency>
             <groupId>com.github.hui.media</groupId>
             <artifactId>svg-core</artifactId>
             <version>2.5</version>
            </dependency>
          
          

          這些依賴jar包我是上傳到了公司的私服上了

          若是朋友們下拉不下來

          我提供給大家這些底層jar包的實現源碼

          https://gitee.com/pingfanrenbiji/quick-media
          

          自行上傳到自己的私服即可


          主站蜘蛛池模板: 亚洲日本va一区二区三区| 日韩AV在线不卡一区二区三区| 波多野结衣一区在线| 亚洲福利一区二区精品秒拍| 国产一区中文字幕在线观看| 久久久99精品一区二区| 无码播放一区二区三区| 亚洲毛片αv无线播放一区| 午夜视频一区二区| 亚洲视频一区二区三区| 无码人妻精品一区二区| 亚洲人成网站18禁止一区| 国产精品美女一区二区三区| 国产福利精品一区二区| 又硬又粗又大一区二区三区视频 | 久久亚洲AV午夜福利精品一区| 精品一区二区ww| 78成人精品电影在线播放日韩精品电影一区亚洲| 免费看AV毛片一区二区三区| 亚洲一区二区三区丝袜| 国产对白精品刺激一区二区| 麻豆一区二区三区精品视频| 日本一区午夜艳熟免费| 中文字幕不卡一区| 久久精品一区二区三区AV| 无码一区二区三区老色鬼| 91在线一区二区三区| 亚洲av乱码一区二区三区香蕉| 亚洲爆乳精品无码一区二区三区 | 精品在线一区二区| 国产高清在线精品一区二区三区 | 一区二区三区高清在线| 中文字幕色AV一区二区三区| 无码人妻精品一区二区三区夜夜嗨| 日韩电影一区二区三区| 国产成人久久一区二区不卡三区 | 国产伦理一区二区| 亚洲中文字幕一区精品自拍| 一区二区三区电影在线观看| 日本一区二区三区在线观看| 日本国产一区二区三区在线观看|