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 日韩免费视频播放,韩国高清色www在线安全,日本免费一区视频

          整合營銷服務(wù)商

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

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

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

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

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

          我們先來看一個(gè)問題:

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

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

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

          下面詳細(xì)看下每個(gè)階段都做了哪些事情。

          1. 構(gòu)建DOM樹

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

          HTML文檔中所有內(nèi)容皆為節(jié)點(diǎn),各節(jié)點(diǎn)之間有層級關(guān)系,彼此相連,構(gòu)成DOM樹。

          構(gòu)建過程:讀取HTML文檔的字節(jié)(Bytes),將字節(jié)轉(zhuǎn)換成字符(Chars),依據(jù)字符確定標(biāo)簽(Tokens),將標(biāo)簽轉(zhuǎn)換成節(jié)點(diǎn)(Nodes),以節(jié)點(diǎn)為基準(zhǔn)構(gòu)建DOM樹。參考下圖:

          打開Chrome的開發(fā)者工具,在控制臺輸入 document 后回車,就能看到一個(gè)完整的DOM樹結(jié)構(gòu),如下圖所示:

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

          2. 樣式計(jì)算

          樣式計(jì)算這個(gè)階段,是為了計(jì)算出DOM節(jié)點(diǎn)中每個(gè)元素的表現(xiàn)樣式。

          2.1 解析CSS

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

          • 通過link引用外部的CSS文件
          • style 標(biāo)簽內(nèi)的CSS
          • 元素的style屬性內(nèi)嵌的CSS

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

          styleSheets結(jié)構(gòu)同樣具備查詢和修改功能:

          document.styleSheets

          2.2 屬性值標(biāo)準(zhǔn)化

          屬性值標(biāo)準(zhǔn)化看字面意思有點(diǎn)不好理解,我們通過下面一個(gè)例子來看看什么是屬性值標(biāo)準(zhǔn)化:

          在寫CSS樣式的時(shí)候,我們在設(shè)置color屬性值的時(shí)候,經(jīng)常會(huì)用white、red等,但是這種值瀏覽器的渲染引擎不容易理解,所以需要將所有值轉(zhuǎn)換成渲染引擎容易理解的、標(biāo)準(zhǔn)化的計(jì)算值,這個(gè)過程就是屬性值標(biāo)準(zhǔn)化。

          white標(biāo)準(zhǔn)化后的值為 rgb(255, 255, 255)

          2.3 計(jì)算DOM樹中每個(gè)節(jié)點(diǎn)的樣式

          完成樣式的屬性值標(biāo)準(zhǔn)化后,就需要計(jì)算每個(gè)節(jié)點(diǎn)的樣式屬性,這個(gè)階段CSS有兩個(gè)規(guī)則我們需要清楚:

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

          樣式計(jì)算階段是為了計(jì)算出DOM節(jié)點(diǎn)中每個(gè)元素的具體樣式,在計(jì)算過程中需要遵守CSS的繼承和層疊兩個(gè)規(guī)則。

          該階段最終輸出的內(nèi)容是每個(gè)DOM節(jié)點(diǎn)的樣式,并被保存在 ComputedStyle 的結(jié)構(gòu)中。

          3. 布局階段

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

          3.1 創(chuàng)建布局樹

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

          構(gòu)建過程:從DOM樹的根節(jié)點(diǎn)開始遍歷,將所有可見的節(jié)點(diǎn)加到布局樹中,忽略不可見的節(jié)點(diǎn)。

          3.2 布局計(jì)算

          到這里我們就有了一棵構(gòu)建好的布局樹,就可以開始計(jì)算布局樹節(jié)點(diǎn)的坐標(biāo)位置了。從根節(jié)點(diǎn)開始遍歷,結(jié)合上面計(jì)算得到的樣式,確定每個(gè)節(jié)點(diǎn)對象在頁面上的具體大小和位置,將這些信息保存在布局樹中。

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

          4. 分層

          現(xiàn)在我們已經(jīng)有了布局樹,也知道了每個(gè)元素的具體位置信息,但是還不能開始繪制頁面,因?yàn)轫撁嬷袝?huì)有像3D變換、頁面滾動(dòng)、或者用 z-index 進(jìn)行z軸排序等復(fù)雜效果,為了更方便實(shí)現(xiàn)這些效果,渲染引擎還需要為特定的節(jié)點(diǎn)生成專用的圖層,并生成一棵對應(yīng)的圖層樹(LayerTree)。

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

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

          到這里,我們構(gòu)建了兩棵樹:布局樹和圖層樹。下面我們來看下這兩棵樹之間的關(guān)系:

          正常情況下,并不是布局樹的每個(gè)節(jié)點(diǎn)都包含一個(gè)圖層,如果一個(gè)節(jié)點(diǎn)沒有對應(yīng)的圖層,那么這個(gè)節(jié)點(diǎn)就從屬于父節(jié)點(diǎn)的圖層。

          那節(jié)點(diǎn)要滿足什么條件才會(huì)被提升為一個(gè)單獨(dú)的圖層?只要滿足下面其中一個(gè)條件即可:

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

          5. 圖層繪制

          構(gòu)建好圖層樹之后,渲染引擎就會(huì)對圖層樹中的每個(gè)圖層進(jìn)行繪制。

          渲染引擎實(shí)現(xiàn)圖層繪制,會(huì)把一個(gè)圖層的繪制拆分成很多小的繪制指令,然后將這些指令按照順序組成一個(gè)繪制列表。

          6. 柵格化(raster)操作

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

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

          當(dāng)圖層的繪制列表準(zhǔn)備好后,主線程會(huì)把該繪制列表提交給合成線程,合成線程開始工作。

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

          然后合成線程會(huì)按照視口附近的圖塊來優(yōu)先生成位圖,實(shí)際生成位圖的操作是由柵格化來執(zhí)行的。所謂柵格化,是指將圖塊轉(zhuǎn)換為位圖。而圖塊是柵格化執(zhí)行的最小單位。渲染進(jìn)程維護(hù)了一個(gè)柵格化的線程池,所有的圖塊柵格化都是在線程池內(nèi)執(zhí)行的,運(yùn)行方式如下圖所示:

          7. 合成和顯示

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

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

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

          8. 總結(jié)

          一個(gè)完整的渲染流程可以總結(jié)如下:

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

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

          我們?nèi)粘W(xué)習(xí)和日常工作中,如果想要將PDF文件轉(zhuǎn)換為HTML文件要怎么辦呢?隨著需求的增加,我們需要會(huì)的技能也要增加了。不止要將PDF文件轉(zhuǎn)換為TXT,轉(zhuǎn)換為Word。還要會(huì)將PDF轉(zhuǎn)換為HTML。

          那么如果你遇見要將PDF文件轉(zhuǎn)換為HTML的問題要怎么解決呢?今天小編就和大家分享如何轉(zhuǎn)換PDF文件為HTML的四種實(shí)用方法。

          第一款:PDF to HTML

          PDF to HTML這款軟件可以將PDF文件輕松轉(zhuǎn)換為HTML格式。支持批量轉(zhuǎn)換跑到福清群文件并且盡量保留PDF文件的原始文本、格式以及布局。

          第二款:風(fēng)云PDF轉(zhuǎn)換器

          風(fēng)云PDF轉(zhuǎn)換器這款軟件可以將PDF文件快速轉(zhuǎn)換為HTML格式,除此外,軟件支持將PDF文件與常見的格式之間相互轉(zhuǎn)換,比如PDF與Word文檔,PPT、圖片、TXT格式、Excel等。軟件還包括將PDF文件合并、PDF壓縮、PDF頁面提取、PDF拆分等功能,軟件功能全面,頁面整潔。支持一鍵轉(zhuǎn)換,批量轉(zhuǎn)換、拖拽添加文件等便捷操作。

          第三款:TriSun pdf to HTML

          TriSun pdf to HTML這款軟件可以將PDF文件轉(zhuǎn)換為HTML。軟件支持轉(zhuǎn)換有所限制的PDF文件,比如不允許拷貝內(nèi)容、保存為文本的PDF文件等。

          第四款:PDF to Html Converter

          PDF to Html Converter這款軟件功能簡單,除了將PDF文件轉(zhuǎn)換為HTML之外,沒有多余的選項(xiàng)以及功能。但是可以對添加的PDF文件進(jìn)行管理,可移除與清理。

          以上就是小編整理的四款可以將PDF文件轉(zhuǎn)換為HTML的軟件,希望可以幫助到大家。

          擬機(jī)為我們提供了一個(gè)無限可能的世界。在這個(gè)世界里,我們可以嘗試、學(xué)習(xí)、甚至犯錯(cuò),而不必?fù)?dān)心現(xiàn)實(shí)生活中的后果。Emacs,作為一款強(qiáng)大的文本編輯器,它的Org模式更是讓人們在組織復(fù)雜信息時(shí)如魚得水。但是,當(dāng)我們嘗試將Org文件轉(zhuǎn)換為HTML格式時(shí),有時(shí)會(huì)遇到一個(gè)令人困惑的問題:“source block missing language specification #include”。這是什么意思?它又該如何解決呢?

          在深入探討之前,讓我們先來思考一個(gè)問題:為什么我們要將Org文件轉(zhuǎn)換為HTML?答案可能各有不同,但一個(gè)共同點(diǎn)是,我們都希望能夠更好地分享和展示我們的工作。HTML作為一種廣泛支持的格式,能夠讓我們的內(nèi)容在不同的平臺上呈現(xiàn)出一致的效果。這就像是我們穿上了一件合身的外衣,讓內(nèi)在的價(jià)值得以外顯。

          當(dāng)我們遇到“source block missing language specification #include”的提示時(shí),我們應(yīng)該怎么辦呢?首先,我們需要理解這個(gè)提示的含義。在Emacs的Org模式中,當(dāng)我們使用源代碼塊時(shí),通常需要指定語言類型,比如#+BEGIN_SRC python。這樣,Emacs就能夠知道如何高亮和格式化我們的代碼。但如果我們忘記了這一步,就會(huì)收到上述的提示。

          解決這個(gè)問題的方法其實(shí)很簡單。我們只需要回到源代碼塊的開始,確保正確地指定了語言類型。如果是包含在文件中的代碼,比如C語言的頭文件,我們可以使用#+INCLUDE: "file.h" src c這樣的語法來引入。

          通過這個(gè)簡單的修正,我們就能夠順利地將Org文件轉(zhuǎn)換為HTML,而不會(huì)再有任何阻礙。這個(gè)過程就像是我們在虛擬世界中解決了一個(gè)謎題,獲得了前進(jìn)的鑰匙。

          并且可以嘗試以下幾種方法來解決:

          方法一:添加語言規(guī)范

          在 Org 文檔中,對于包含代碼塊的文本,需要添加語言規(guī)范,以便 Org-mode 正確地解析和轉(zhuǎn)換代碼。

          具體步驟如下:

          在代碼塊的開頭,添加一行指示語言規(guī)范的注釋。例如,對于 C 語言代碼,可以添加以下注釋:

          #lang c

          再次嘗試將 Org 文檔轉(zhuǎn)換為 HTML。

          方法二:使用 org-babel

          org-babel 是 Org-mode 的一個(gè)擴(kuò)展包,可以用于將代碼塊轉(zhuǎn)換為各種格式,包括 HTML。

          具體步驟如下:

          安裝 org-babel 擴(kuò)展包。

          M-x package-install RET org-babel

          在 Org 文檔中,將代碼塊標(biāo)記為 babel 塊。例如,對于 C 語言代碼,可以使用以下標(biāo)記:

          #+begin_src c#include <stdio.h>int main() {  printf("Hello, world!\n");  return 0;}#+end_src

          再次嘗試將 Org 文檔轉(zhuǎn)換為 HTML。

          方法三:使用 org-html-export-filter

          org-html-export-filter 是 Org-mode 的一個(gè)函數(shù),可以用于在導(dǎo)出 HTML 時(shí)自定義代碼塊的轉(zhuǎn)換。

          具體步驟如下:

          在 Emacs 配置文件中,添加以下代碼:

          (defun my-org-html-export-filter (block)  "自定義代碼塊的轉(zhuǎn)換。"  (if (string-match-p "^#lang\s+c\s*$" (org-block-property block :language))    (org-html-export-filter-block-as-code block "c" "highlight")    (org-html-export-filter-block-as-verbatim block)))(add-hook 'org-html-export-filter-alist 'my-org-html-export-filter)

          再次嘗試將 Org 文檔轉(zhuǎn)換為 HTML。

          以上三種方法都可以解決 Org 轉(zhuǎn)為 HTML 時(shí)提示“source block missing language specification #include<stdio.h>”的問題。具體選擇哪種方法,可以根據(jù)自己的實(shí)際情況和需求來決定。


          主站蜘蛛池模板: 在线视频一区二区| 亚洲国产日韩在线一区| 国产主播福利精品一区二区| 国产熟女一区二区三区四区五区 | 久久精品一区二区三区资源网| 国产在线不卡一区二区三区| 在线精品亚洲一区二区三区 | 乱人伦一区二区三区| 午夜福利一区二区三区在线观看| 福利一区二区三区视频在线观看| AA区一区二区三无码精片| 日本在线一区二区| 人妻无码一区二区视频| 国产精品日本一区二区不卡视频 | 三上悠亚日韩精品一区在线| 精品女同一区二区三区免费播放 | 日本精品一区二区三区在线观看| 无码AV一区二区三区无码| 一区二区免费视频| 久久99热狠狠色精品一区 | 一区二区三区四区精品视频| 精品亚洲一区二区三区在线播放| 精品免费国产一区二区三区| 精品无码一区二区三区爱欲九九| 无码人妻精品一区二区三区99仓本| 国产一区三区二区中文在线| 538国产精品一区二区在线| 国产精品一区视频| 无码av中文一区二区三区桃花岛| 天堂va视频一区二区| 国产成人高清亚洲一区久久| 中文字幕国产一区| 中文字幕亚洲综合精品一区| 在线日产精品一区| 亚洲国产一区二区三区在线观看| 日韩视频在线观看一区二区| 国产一区二区女内射| 国产精品伦一区二区三级视频| 蜜臀AV在线播放一区二区三区| 国产成人一区二区三区| 亚洲色大成网站www永久一区|