Web前端知識體系精簡

JSONP 雖然可以解決跨域問題,但只能發送 GET 請求,並且沒有有效的錯誤捕獲機制 。為了解決這個問題,W3C 在 XMLHttpRequest Level2 中提出了 CORS 規範,即 “跨域資源共享”。它不是一個新的 API,而是一個標準規範 。當瀏覽器發現該請求需要跨域時,就會自動在頭信息中添加一個 Origin 字段,用以說明本次請求來自哪個源。服務器根據這個值,決定是否同意這次請求。 關於 CORS 的詳細介紹請參考:跨域資源共享 CORS 詳解

隨著移動端的快速發展,Web 技術的應用場景正在變得越來越複雜,“關注點分離” 原則在系統設計層面就顯得越來越重要,而 XMLHttpRequest 是 Ajax 最古老的一個接口,因而不太符合現代化的系統設計理念。因此,瀏覽器提供了一個新的 Ajax 接口,即 Fetch,Fetch 是基於 ES6 的 Promise 思想設計的,更符合關注點分離原則。關於 Fetch 的更多介紹請參考:傳統 Ajax 已死,Fetch 永生

8、模塊化

歷史上,JavaScript 規範一直沒有模塊(Module)體系,即無法將一個大程序拆分成互相依賴的小文件,再用簡單的方法拼裝起來。在 ES6 之前,為了實現 JS 模塊化編程,社區制定了一些模塊加載方案,最主要有 CMD 和 AMD 兩種,分別以 commonjs 和 requirejs 為代表。ES6 在語言標準的層面上,實現了模塊化編程,其設計思想是,儘量靜態化,使得編譯時就能確定模塊的依賴關係,即編譯時加載,而 CMD 和 AMD 是在運行時確定依賴關係,即運行時加載。關於 ES6 模塊化請參考:ES6模塊化

9、Node.js

Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境,它的運行不依賴於瀏覽器作為宿主環境,而是和服務端程序一樣可以獨立的運行,這使得 JavaScript 編程第一次從客戶端被帶到了服務端,Node.js 在服務端的優勢是,它採用單線程和異步 I/O 模型,實現了一個高併發、高性能的運行時環境。相比傳統的多線程模型,Node.js 實現簡單,並且可以減少資源開銷。關於 Node.js單線程模型請參考:Node.js 事件循環機制

10、ES6

ES6 是 ECMAScript 6.0 的簡寫,即 JavaScript 語言的下一代標準,已經在 2015年6月正式發佈了,它的目標是讓JS能夠方便的開發企業級大型應用程序,因此,ES6的一些規範正在逐漸向Java、C# 等後端語言標準靠近。在 ES6 規範中,比較重大的變化有以下幾個方面:

  • 新增 let、const 命令 來聲明變量,和var 相比,let 聲明的變量不存在變量提升問題,但沒有改變JS弱類型的特點,依然可以接受任意類型變量的聲明;const 聲明的變量不允許在後續邏輯中改變,提高了JS語法的嚴謹性。
  • 新增解構賦值、rest 語法、箭頭函數等,這些都是為了讓代碼看起來更簡潔,而包裝的語法糖。
  • 新增模塊化機制,這是 JavaScript 走向規範比較重要的一步,讓前端更方便的實現工程化。
  • 新增類和繼承的概念,配合模塊化,JavaScript 也可以實現高複用、高擴展的系統架構。
  • 新增模板字符串功能,高效簡潔,結束拼接字符串的時代。
  • 新增 Promise 機制,解決異步回調多層嵌套的問題。

CSS 篇

1、CSS選擇器

CSS 選擇器即通過某種規則來匹配相應的標籤,併為其設置 CSS 樣式,常用的有類選擇器、標籤選擇器、ID選擇器、後代選擇器、群組選擇器、偽類選擇器(before/after)、兄弟選擇器(+~)、屬性選擇器等等。

2、CSS Reset

HTML 標籤在不設置任何樣式的情況下,也會有一個默認的 CSS 樣式,而不同內核瀏覽器對於這個默認值的設置則不盡相同,這樣可能會導致同一套代碼在不同瀏覽器上的顯示效果不一致,而出現兼容性問題。因此,在初始化時,需要對常用標籤的樣式進行初始化,使其默認樣式統一,這就是 CSS Reset ,即 CSS 樣式重置,比如:

1

*{ margin:0; padding:0; }

就是最簡單 CSS Reset。 關於 CSS 重置請參考:Neat.css

3、盒子佈局

盒子模型是CSS比較重要的一個概念,也是CSS 佈局的基石。 常見的盒子模型有塊級盒子(block)和行內盒子(inline-block),與盒子相關的幾個屬性有:margin、border、padding和content 等,這些屬性的作用是設置盒子與盒子之間的關係以及盒子與內容之間的關係,而 box-sizing 屬性會影響盒子大小的計算方式。

需要注意的是:

只有普通文檔流中塊級盒子的垂直外邊距才會發生合併,而具有 BFC 特性盒子的外邊距不會合並。

4、浮動佈局

設置元素的 float 屬性值為 left 或 right,就能使該元素脫離普通文檔流,向左或向右浮動。一般在做宮格佈局時會用到,如果子元素全部設置為浮動,則父元素是塌陷的,這時就需要清除浮動,清除浮動的方法也很多,常用的方法是在元素末尾加空元素設置 clear: both,更高級一點的就給父容器設置 before/after 來模擬一個空元素,還可以直接設置 overflow 屬性為 auto/hidden 來清除浮動。除浮動可以實現宮格佈局,行內盒子(inline-block) 和 table 也可以實現同樣的效果。

5、定位佈局

設置元素的 position 屬性值為 relative/absolute/fixed,就可以使該元素脫離文檔流,並以某種參照座標進行偏移。其中,releave 是相對定位,它以自己原來的位置進行偏移,偏移後,原來的空間不會被其他元素佔用;absolute 是絕對定位,它以離自己最近的定位父容器作為參照進行偏移;為了對某個元素進行定位,常用的方式就是設置父容器的 poistion:relative,因為相對定位元素在不設置 top 和 left 值時,不會對元素位置產生影響;fixed 即固定定位,它則以瀏覽器窗口為參照物,PC網頁底部懸停的banner一般都可以通過fixed定位來實現,但fixed屬性在移動端有兼容性問題,因此不推薦使用,可替代的方案是:絕對定位+內部滾動。

6、彈性佈局

彈性佈局即 Flex 佈局,定義了 flex 的容器一個可伸縮容器,首先容器本身會根據容器中的元素動態設置自身大小;然後當Flex容器被應用一個大小時(width和height),將會自動調整容器中的元素適應新大小。Flex容器也可以設置伸縮比例和固定寬度,還可以設置容器中元素的排列方向(橫向和縱向)和是否支持元素的自動換行。有了這個神器,做頁面佈局的可以方便很多了。注意,設為Flex 佈局以後,子元素的 float、clear、inline-block 和 vertical-align 屬性將失效。關於 flexbox 請參考:圖解CSS3 Flexbox屬性

7、CSS3 動畫

CSS3 中規範引入了兩種動畫,分別是 transition 和 animation,transition 可以讓元素的 CSS 屬性值的變化在一段時間內平滑的過渡,形成動畫效果,為了使元素的變換更加豐富多彩,CSS3 還引入了 transfrom 屬性,它可以通過對元素進行 平移(translate)、旋轉(rotate)、放大縮小(scale)、傾斜(skew) 等操作,來實現 2D 和 3D 變換效果。transiton 還有一個結束事件 transitionEnd,該事件是在 CSS 完成過渡後觸發,但如果過渡在完成之前被移除,則不會觸發 transitionEnd 。

animation 需要設置一個 @keyframes,來定義元素以哪種形式進行變換, 然後再通過動畫函數讓這種變換平滑的進行,從而達到動畫效果,動畫可以被設置為永久循環演示。設置 animation-play-state:paused 可以暫停動畫,設置 animation-fill-mode:forwards 可以讓動畫完成後定格在最後一幀。

另外,還可以通過JS 監聽 animation 的“開始”、“結束” 和 “重複播放” 狀態,分別對應三個事件,即 animationStart、animationEnd、animationIteration 。需要注意的是:

當播放次數設置為1時,不會觸發 animationIteration 。

和 transition相比,animation 設置動畫效果更靈活更豐富,二者還有一個區別是:transition 只能通過主動改變元素的 css 值才能觸發動畫效果,而 animation 一旦被應用,就開始執行動畫。

另外,HTML5 還新增了一個動畫API,即 requestAnimationFrame,它通過JS來調用,並按照屏幕的繪製頻率來改變元素的CSS屬性,從而達到動畫效果,關於這個API的介紹請參考:requestAnimationFrame 知多少?

8、BFC

BFC 是頁面上的一個隔離的獨立容器,容器裡面的子元素不會影響到外面元素。比如:內部滾動就是一個 BFC,當一個父容器的 overflow-y 設置為 auto 時,並且子容器的長度大於父容器時,就會出現內部滾動,無論內部的元素怎麼滾動,都不會影響父容器以外的佈局,這個父容器的渲染區域就叫 BFC。滿足下列條件之一就可觸發 BFC:

  • 根元素,即 HTML 元素
  • float 的值不為 none
  • overflow 的值不為 visible
  • display 的值為 inline-block、table-cell、table-caption
  • position 的值為 absolute 或 fixed

9、Sprite,Iconfont,font-face

對於大型站點,為了減少 http 請求的次數,一般會將常用的小圖標排到一個大圖中,頁面加載時只需請求一次網絡, 然後在 css 中通過設置 background-position 來控制顯示所需要的小圖標,這就是 Sprite 圖。

Iconfont,即字體圖標,就是將常用的圖標轉化為字體資源存在文件中,通過在 CSS 中引用該字體文件,然後可以直接用控制字體的css屬性來設置圖標的樣式,字體圖標的好處是節省網絡請求、其大小不受屏幕分辨率的影響,並且可以任意修改圖標的顏色。

font-face 是 CSS3 中的一個模塊,通過 font-face 可以定義一種全新的字體,然後就可以通過 css 屬性 font-family 來使用這個字體了,即使操作系統沒有安裝這種字體,網頁上也會正常顯示出來。

10、CSS HACK

早期,不同內核瀏覽器對CSS屬性的解析存在著差異,導致顯示效果不一致,比如 margin 屬性在 ie6 中顯示的距離會比其他瀏覽器中顯示的距離寬 2 倍,也就是說 margin-left:20px; 在ie6中距左側元素的實際顯示距離是 40px,而在非 ie6 的瀏覽器上顯示正常。因此,如果要想讓所有瀏覽器中都顯示是 20px 的寬度,就需要在CSS樣式中加入一些特殊的符號,讓不同的瀏覽器識別不同的符號,以達到應用不同的CSS樣式的目的,這種方式就是 “css hack”, 對於 ie6 中的 margin 應用 hack 就會變成這樣:

HTML 篇

1、BOM

BOM 是 Browser Object Model 的縮寫,即瀏覽器對象模型,當一個瀏覽器頁面初始化時,會在內存創建一個全局的對象,用以描述當前窗口的屬性和狀態,這個全局對象被稱為瀏覽器對象模型,即BOM。BOM的核心對象就是 window,window 對象也是BOM的頂級對象,其包含了瀏覽器的六個核心模塊:

  • document - 即文檔對象,渲染引擎在解析HTML代碼時,會為每一個元素生成對應的DOM對象,由於元素之間有層級關係,因此整個HTML代碼解析完以後,會生成一個由不同節點組成的樹形結構,俗稱DOM樹,document 用於描述DOM樹的狀態和屬性,並提供了很多操作DOM的API。
  • frames - HTML 子框架,即在瀏覽器裡嵌入另一個窗口,父框架和子框架擁有獨立的作用域和上下文。
  • history - 以棧(FIFO)的形式保存著頁面被訪問的歷史記錄,頁面前進即入棧,頁面返回即出棧。
  • location - 提供了當前窗口中加載的文檔相關信息以及一些導航功能。
  • navigator - 用來描述瀏覽器本身,包括瀏覽器的名稱、版本、語言、系統平臺、用戶特性字符串等信息。
  • screen - 提供了瀏覽器顯示屏幕的相關屬性,比如顯示屏幕的寬度和高度,可用寬度和高度。

2、DOM 系統

DOM 是 Document Object Model 的縮寫,即 文檔對象模型,是所有瀏覽器公共遵守的標準,DOM 將HTML和XML文檔映射成一個由不同節點組成的樹型結構,俗稱DOM樹。其核心對象是document,用於描述DOM樹的狀態和屬性,並提供對應的DOM操作API。隨著歷史的發展,DOM 被劃分為1級、2級、3級,共3個級別:

  • 1級DOM - 在1998年10月份成為W3C的提議,由 DOM 核心與 DOM HTML 兩個模塊組成。DOM核心能映射以XML為基礎的文檔結構,允許獲取和操作文檔的任意部分。DOM HTML通過添加HTML專用的對象與函數對DOM核心進行了擴展。
  • 2級DOM - 鑑於1級DOM僅以映射文檔結構為目標,DOM 2級面向更為寬廣。通過對原有DOM的擴展,2級DOM通過對象接口增加了對鼠標和用戶界面事件(DHTML長期支持鼠標與用戶界面事件)、範圍、遍歷(重複執行DOM文檔)和層疊樣式表(CSS)的支持。同時也對DOM 1的核心進行了擴展,從而可支持XML命名空間。
  • 3級DOM - 通過引入統一方式載入和保存文檔和文檔驗證方法對DOM進行進一步擴展,DOM3包含一個名為“DOM載入與保存”的新模塊,DOM核心擴展後可支持XML1.0的所有內容,包括XML Infoset、 XPath、和XML Base。

瀏覽器對不同級別DOM的支持情況如下所示:

Web前端知識體系精簡

從圖中可以看出,移動端常用的 webkit 內核瀏覽器目前只支持 DOM2,而不支持 DOM3 。

3、事件系統

事件是用戶與頁面交互的基礎,到目前為止,DOM事件從PC端的 鼠標事件(mouse) 發展到了 移動端的 觸摸事件(touch) 和 手勢事件(guesture),touch事件描述了手指在屏幕操作的每一個細節,guesture 則是描述多手指操作時更為複雜的情況,總結如下:

  • 第一根手指放下,觸發 touchstart,除此之外什麼都不會發生
  • 手指滑動時,觸發touchmove
  • 第二根手指放下,觸發 gesturestart
  • 觸發第二根手指的 touchstart
  • 立即觸發 gesturechange
  • 任意手指移動,持續觸發 gesturechange
  • 第二根手指彈起時,觸發 gestureend,以後將不會再觸發 gesturechange
  • 觸發第二根手指的 touchend
  • 觸發touchstart (多根手指在屏幕上,提起一根,會刷新一次全局touch)
  • 彈起第一根手指,觸發 touchend

更多關於手勢事件的介紹請參考:gesture事件處理複雜手勢

DOM2.0 模型將事件處理流程分為三個階段,即 事件捕獲階段事件處理階段事件冒泡階段,如圖所示:

Web前端知識體系精簡

  • 事件捕獲:當用戶觸發點擊事件後,頂層對象 document 就會發出一個事件流,從最外層的 DOM 節點向目標元素節點傳遞,最終到達目標元素。
  • 事件處理:當到達目標元素之後,執行目標元素綁定的處理函數。如果沒有綁定監聽函數,則不做任何處理。
  • 事件冒泡:事件流從目標元素開始,向最外層DOM節點傳遞,途中如果有節點綁定了事件處理函數,這些函數就會被執行。

利用事件冒泡原理可以實現 “事件委託”。

所謂事件委託,就是在父元素上添加事件監聽器,用以監聽和處理子元素的事件,避免重複為子元素綁定相同的事件。當目標元素的事件被觸發以後,這個事件就從目標元素開始,向最外層元素傳遞,最終冒泡到父元素上,父元素再通過 event.target 獲取到這個目標元素,這樣做的好處是,父元素只需綁定一個事件監聽,就可以對所有子元素的事件進行處理了,從而減少了不必要的事件綁定,對頁面性能有一定的提升。

4、HTML 渲染流程

渲染引擎一開始會從網絡層獲取請求文檔的內容,內容的大小一般限制在 8000 個塊以內。

然後進行如下所示的基本流程:

Web前端知識體系精簡

  • HTML Parser 解析 HTML 文檔,並將各標記逐個轉化為 DOM 節點,生成 “DOM樹”。
  • CSS Parser 解析外部 CSS 文件以及樣式元素中的樣式數據,生成 “CSSOM樹”。
  • “DOM樹” 和 “CSSOM樹” 通過 “附著” 將創建另一個樹結構:“渲染樹”。
  • 渲染樹包含多個帶有視覺屬性(如顏色和尺寸)的矩形,這些矩形的排列順序就是它們將在屏幕上顯示的順序。
  • 渲染樹構建完畢之後,進入“佈局” 處理階段,也就是為每個節點分配一個應出現在屏幕上的確切座標。
  • 下一個階段是 “繪製”,渲染引擎會遍歷渲染樹,由用戶界面後端層將每個節點繪製出來。

需要注意的是:

這是一個漸進的過程。為達到更好的用戶體驗,呈現引擎會力求儘快將內容顯示在屏幕上。它不必等到整個 HTML 文檔解析完畢之後,就會開始構建呈現樹和設置佈局。在不斷接收和處理來自網絡的其餘內容的同時,呈現引擎會將部分內容解析並顯示出來。

5、重繪與迴流

當渲染樹中的一部分(或全部)因為元素的規模尺寸、佈局、隱藏等改變而需要重新構建,就稱為 “迴流”。

當渲染樹中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀,風格,而不會影響佈局,就稱為 “重繪”。

迴流必將引起重繪,而重繪不一定會引起迴流。

引起重繪和迴流的操作如下:

  • 添加、刪除元素(迴流+重繪)
  • 隱藏元素,display: none(迴流+重繪),visibility:hidden(只重繪,不迴流)
  • 移動元素,比如改變 top、left 的值,或者移動元素到另外一個父元素中。(重繪+迴流)
  • 對 style 的操作(對不同的屬性操作,影響不一樣)
  • 還有一種是用戶的操作,比如改變瀏覽器大小,改變瀏覽器的字體大小等(迴流+重繪)

注意問題:

transform 操作不會引起重繪和迴流,是一種高效率的渲染。這是因為transform屬於合成屬性,對合成屬性進行transition/animation 動畫時將會創建一個合成層,這使得動畫元素在一個獨立的層中進行渲染,當元素的內容沒有發生改變,就沒必要進行重繪,瀏覽器會通過重新複合來創建動畫幀。

6、本地存儲

本地存儲最原始的方式就是 cookie,cookie 是存放在本地瀏覽器的一段文本,數據以鍵值對的形式保存,可以設置過期時間。 但是 cookie 不適合大量數據的存儲,因為每請求一次頁面,cookie 都會發送給服務器,這使得 cookie 速度很慢而且效率也不高。因此cookie的大小被限制為4k左右(不同瀏覽器可能不同,分HOST),如下所示:

  • Firefox 和 Safari 允許 cookie 多達 4097 個字節,包括名(name)、值(value) 和 等號。
  • Opera 允許 cookie 多達 4096 個字節,包括:名(name)、值(value) 和 等號。
  • Internet Explorer 允許 cookie 多達4095個字節,包括:名(name)、值(value) 和 等號。

在所有瀏覽器中,任何 cookie 大小超過限制都被忽略,且永遠不會被設置。

html5 提供了兩種在客戶端存儲數據的新方法:localStorage 和 sessionStorage, 它們都是以 key/value 的形式來存儲數據,前者是永久存儲,後者的存儲期限僅限於瀏覽器會話(session),即當瀏覽器窗口關閉後,sessionStorage中的數據被清除。

localStorage 的存儲空間大約5M左右(不同瀏覽器可能不同,分 HOST),這個相當於一個5M大小的前端數據庫,相比於cookie,可以節約帶寬,但localStorage在瀏覽器隱私模式下是不可讀取的,當存儲數據超過了localStorage 的存儲空間後會拋出異常。

此外,H5還提供了 websql 和 indexedDB,允許前端以關係型數據庫的方式來存儲本地數據,相對來說,這個功能目前應用的場景比較少,此處不作介紹。

7、瀏覽器緩存機制

瀏覽器緩存機制是指通過 HTTP 協議頭裡的 Cache-Control (或 Expires) 和 Last-Modified (或 Etag) 等字段來控制文件緩存的機制。

Cache-Control 用於控制文件在本地緩存有效時長。最常見的,比如服務器回包:Cache-Control:max-age=600 表示文件在本地應該緩存,且有效時長是600秒 (從發出請求算起)。在接下來600秒內,如果有請求這個資源,瀏覽器不會發出 HTTP 請求,而是直接使用本地緩存的文件。

Last-Modified 是標識文件在服務器上的最新更新時間。下次請求時,如果文件緩存過期,瀏覽器通過 If-Modified-Since 字段帶上這個時間,發送給服務器,由服務器比較時間戳來判斷文件是否有修改。如果沒有修改,服務器返回304告訴瀏覽器繼續使用緩存;如果有修改,則返回200,同時返回最新的文件。

Cache-Control 通常與 Last-Modified 一起使用。一個用於控制緩存有效時間,一個在緩存失效後,向服務查詢是否有更新。

Cache-Control 還有一個同功能的字段:Expires。Expires 的值一個絕對的時間點,如:Expires: Thu, 10 Nov 2015 08:45:11 GMT,表示在這個時間點之前,緩存都是有效的。

Expires 是 HTTP1.0 標準中的字段,Cache-Control 是 HTTP1.1 標準中新加的字段,功能一樣,都是控制緩存的有效時間。當這兩個字段同時出現時,Cache-Control 是高優化級的。

Etag 也是和 Last-Modified 一樣,對文件進行標識的字段。不同的是,Etag 的取值是一個對文件進行標識的特徵字串。在向服務器查詢文件是否有更新時,瀏覽器通過 If-None-Match 字段把特徵字串發送給服務器,由服務器和文件最新特徵字串進行匹配,來判斷文件是否有更新。沒有更新回包304,有更新回包200。Etag 和 Last-Modified 可根據需求使用一個或兩個同時使用。兩個同時使用時,只要滿足基中一個條件,就認為文件沒有更新。

瀏覽緩存的基本框架如下圖所示:

Web前端知識體系精簡

關於更多瀏覽器緩存介紹請參考:H5 緩存機制淺析 移動端 Web 加載性能優化

8、History

用戶訪問網頁的歷史記錄通常會被保存在一個類似於棧的對象中,即 history 對象,點擊返回就出棧,跳下一頁就入棧。 它提供了以下方法來操作頁面的前進和後退:

  • window.history.back( ) 返回到上一個頁面
  • window.history.forward( ) 進入到下一個頁面
  • window.history.go( [delta] ) 跳轉到指定頁面

HTML5 對History Api 進行了增強,新增了兩個Api 和一個事件,分別是 pushState、replaceState 和 onpopstate:

  • pushState 是往 history 對象裡添加一個新的歷史記錄。
  • replaceState 是替換 history 對象中的當前歷史記錄。
  • onpopstate 當點擊瀏覽器後退按鈕或JS調用 history.back 都會觸發該事件。

onpopstate 和 onhashchange 的區別:

onhashchange 本來是用來監聽hash變化的,但可以被利用來做客戶端前進和後退事件的監聽,而 onpopstate 是專門用來監聽瀏覽器前進後退的,不僅可以支持 hash,非 hash 的同源 url 也支持。

9、HTML5 離線緩存

HTML5離線緩存又叫Application Cache,是從瀏覽器的緩存中分出來的一塊緩存區,如果要在這個緩存中保存數據,可以使用一個描述文件(manifest file),列出要下載和緩存的資源。

manifest 文件是簡單的文本文件,它告知瀏覽器被緩存的內容(以及不緩存的內容)。manifest 文件可分為三個部分:

  • CACHE MANIFEST - 在此標題下列出的文件將在首次下載後進行緩存
  • NETWORK - 在此標題下列出的文件需要與服務器的連接,且不會被緩存
  • FALLBACK - 在此標題下列出的文件規定當頁面無法訪問時的回退頁面(比如 404 頁面)

離線緩存為應用帶來三個優勢:

  • 離線瀏覽 - 用戶可在應用離線時使用它們
  • 速度 - 已緩存資源加載得更快
  • 減少服務器負載 - 瀏覽器將只從服務器下載更新過或更改過的資源。

10、Web語義化與SEO

Web語義化是指使用語義恰當的標籤,使頁面有良好的結構,頁面元素有含義,能夠讓人和搜索引擎都容易理解。

SEO是指在瞭解搜索引擎自然排名機制的基礎之上,對網站進行內部及外部的調整優化,改進網站在搜索引擎中關鍵詞的自然排名,獲得更多的展現量,吸引更多目標客戶點擊訪問網站,從而達到互聯網營銷及品牌建設的目標。

搜索引擎通過爬蟲技術獲取的頁面就是由一堆 html 標籤組成的代碼,人可以通過可視化的方式來判斷頁面上哪些內容是重點,而機器做不到。 但搜索引擎會根據標籤的含義來判斷內容的權重,因此,在合適的位置使用恰當的標籤,使整個頁面的語義明確,結構清晰,搜索引擎才能正確識別頁面中的重要內容,並予以較高的權值。比如h1~h6這幾個標籤在SEO中的權值非常高,用它們作頁面的標題就是一個簡單的SEO優化。


分享到:


相關文章: