亚洲一区二区三区在线播放,伊人久久精品无码av一区,亚洲国产精品一区二区第一页免,无码aⅴ精品一区二区三区浪潮

熱門文章

最新文章

Web前端知識體系精簡

發(fā)布時間:2021-06-22 15:26:45

Web前端技術由 html、css 和 javascript 三大部分構(gòu)成,是一個龐大而復雜的技術體系,其復雜程度不低于任何一門后端語言。而我們在學習它的時候往往是先從某一個點切入,然后不斷地接觸和學習新的知識點,因此對于初學者很難理清楚整個體系的脈絡結(jié)構(gòu)。本文將對Web前端知識體系進行簡單的梳理,對應的每個知識點點到為止,不作詳細介紹。目的是幫助大家審查自己的知識結(jié)構(gòu)是否完善,如有遺漏或不正確的地方,希望共勉。

JAVASCRIPT 篇

0、基礎語法

Javascript 基礎語法包括:變量聲明、數(shù)據(jù)類型、函數(shù)、控制語句、內(nèi)置對象等。

在ES5 中,變量聲明有兩種方式,分別是  var 和 function ,var 用于聲明普通的變量,接收任意類型,function用于聲明函數(shù)。另外,ES6 新增了 let、const、import 和 class 等四個命令,分別用以聲明 普通變量、靜態(tài)變量、模塊 和 類 。

JS數(shù)據(jù)類型共有六種,分別是 String、Number、Boolean、Null、Undefined 和 Object 等, 另外,ES6 新增了 Symbol 類型。其中,Object 是引用類型,其他的都是原始類型(Primitive Type)。

原始類型也稱為基本類型或簡單類型,因為其占據(jù)空間固定,是簡單的數(shù)據(jù)段,為了便于提升變量查詢速度,將其存儲在棧(stack)中(按值訪問)。為了便于操作這類數(shù)據(jù),ECMAScript 提供了 3 個基本包裝類型:Boolean、Number 和 String 。基本包裝類型是一種特殊的引用類型,每當讀取一個基本類型值的時候,JS內(nèi)部就會創(chuàng)建一個對應的包裝對象,從而可以調(diào)用一些方法來操作這些數(shù)據(jù)。

引用類型由于其值的大小會改變,所以不能將其存放在棧中,否則會降低變量查詢速度,因此其存儲在堆(heap)中,存儲在變量處的值是一個指針,指向存儲對象的內(nèi)存處(按址訪問),對于引用類型的值,可以為其添加屬性和方法,也可以改變和刪除其屬性和方法;但基本類型不可以添加屬性和方法。關于更多介紹請參考:詳解 ECMAScript 數(shù)據(jù)類型

JavaScript 可以通過 typeof 來判斷原始數(shù)據(jù)類型,但不能判斷引用類型,要知道引用類型的具體類型,需要通過 Object 原型上的 toString 方法來判斷,關于數(shù)據(jù)類型判斷可以參考:判斷JS數(shù)據(jù)類型的4種方法

在 JavaScript 中,函數(shù)有三種角色,即普通函數(shù)、構(gòu)造函數(shù) 和 對象方法。同一個函數(shù),調(diào)用方式不同,函數(shù)的作用不一樣,所扮演的角色也不一樣。直接調(diào)用時就是普通函數(shù),通過new創(chuàng)建對象時就是構(gòu)造函數(shù),通過對象調(diào)用時就是方法。

JavaScript 常用的內(nèi)置對象有 Date、Array、JSON、RegExp 等等,Date 和 Array 使用場景最多,JSON主要用于對象的序列化和反序列化,還有一個作用就是實現(xiàn)對象的深拷貝。RegExp 即正則表達式,是處理字符串的利器。 關于更多介紹請參考:數(shù)組常用操作方法總結(jié) , 正則表達式基礎知識

1、函數(shù)原型鏈

JS是一種基于對象的語言,但在 ES6 之前是不支持繼承的,為了具備繼承的能力,JavaScript 在函數(shù)對象上建立了原型對象 prototype,并以函數(shù)對象為主線,從上至下,在JS內(nèi)部構(gòu)建了一條原型鏈。原型鏈把一個個獨立的對象聯(lián)系在一起,Object 則是所有對象的祖宗, 任何對象所建立的原型鏈最終都指向了 Object,并以 Object 終結(jié)。

簡單來說,就是建立了變量查找機制,當訪問一個對象的屬性時,先查找對象本身是否存在,如果不存在就去該對象所在的原型連上去找,直到 Object 對象為止,如果都沒有找到該屬性才會返回 undefined。因此,我們可以通過原型鏈來實現(xiàn)繼承機制。關于函數(shù)原型鏈請參考:認識原型對象和原型鏈

2、函數(shù)作用域

函數(shù)作用域就是變量在聲明它們的函數(shù)體以及這個函數(shù)體嵌套的任意函數(shù)體內(nèi)都是有定義的。通俗來講就是,在一個函數(shù)里,有些變量可以訪問,有些不可以訪問。那些能訪問的變量所形成的范圍,就是這個函數(shù)的作用域。

在 JavaScript 中,沒有塊級作用域,只有函數(shù)作用域,也就是說 if、while、for 語句不會形成獨立的作用域。但有一個特殊情況,即 with 語句和 catch 語句會形成臨時作用域,語句執(zhí)行結(jié)束后,該作用域就會被釋放。關于函數(shù)作用域請參考:函數(shù)作用域和作用域鏈

3、this 指針

this 指針存在于函數(shù)中,用以標識函數(shù)運行時所處的上下文。函數(shù)的類型不同,this 指向規(guī)則也不一樣:對于普通函數(shù),this 始終指向全局對象window;對于構(gòu)造函數(shù),this則指向新創(chuàng)建的對象;對于方法,this指向調(diào)用該方法的對象。另外,F(xiàn)unction 對象也提供了call、apply 和 bind 等方法來改變函數(shù)的 this 指向,其中,call 和 apply 主動執(zhí)行函數(shù),bind 一般在事件回調(diào)中使用,而 call 和 apply 的區(qū)別只是參數(shù)的傳遞方式不同。關于更多介紹請參考:深入理解 call,apply和 bind

如果往深的去理解,無論什么函數(shù),this 是否被改變, 本質(zhì)上,this 均指向觸發(fā)函數(shù)運行時的那個對象。而在函數(shù)運行時,this 的值是不能被改變的。

4、new 操作符

函數(shù)的創(chuàng)建有三種方式,即 顯式聲明、匿名定義 和 new Function() 。前面提到,JS 中的函數(shù)即可以是函數(shù),也可以是方法,還可以是構(gòu)造函數(shù)。

當使用 new 來創(chuàng)建對象時,該函數(shù)就是構(gòu)造函數(shù),JS 將新對象的原型鏈指向了構(gòu)造函數(shù)的原型對象,于是就在新對象和函數(shù)對象之間建立了一條原型鏈,通過新對象可以訪問到函數(shù)對象原型 prototype 中的方法和屬性。關于構(gòu)造函數(shù)和 new 操作符請參考: 深入理解 new 操作符

5、閉包

閉包不是一個孤立的概念,需要從函數(shù)作用域的角度來理解。

每個函數(shù)都有自己的作用域,如果在一個函數(shù)里定義了另一個函數(shù),那么對應的就有兩個作用域,這兩個作用域就會形成一個鏈條,俗稱作用域鏈。本質(zhì)上講,作用域鏈是一個自上而下的鏈表, 鏈表的最頂端是內(nèi)部函數(shù)作用域,鏈表的最底端是全局作用域。內(nèi)部函數(shù)有權(quán)訪問整個作用域鏈上的變量。正常情況下,每當一個函數(shù)執(zhí)行完畢,對應的作用域就會從該鏈表上移除,然后銷毀。

但如果函數(shù) A 把函數(shù) B 作為返回值返回時,情況又不一樣。

首先,函數(shù) A 返回的是函數(shù) B 的引用,也就是說,B 可能會在其他地方被調(diào)用。上面提到,函數(shù) B 的定義是位于函數(shù) A 內(nèi)部,因此 A 和 B 會形成一條作用域鏈,函數(shù) B 有可能會讀取 A 中的變量 。為了保證函數(shù) B 能夠在其他地方正確執(zhí)行,函數(shù) B 所在的這條作用域鏈就不能被破壞。所以,即使函數(shù) A 執(zhí)行返回后,A 的作用域也不能釋放,需要一直保存在內(nèi)存中,以確保函數(shù) B 能夠正常讀取里面的變量。函數(shù) B 具有永久訪問 A 作用域的特權(quán),確切說,函數(shù) B 就是閉包 。

總而言之,閉包就是一個有權(quán)訪問另一個函數(shù)作用域的函數(shù)。

6、單線程與事件循環(huán)

JavaScript 是單線程語言。在瀏覽器中,當JS代碼被加載時,瀏覽器會為其分配一個主線程來執(zhí)行任務,主線程會在棧中創(chuàng)建一個全局執(zhí)行環(huán)境 (全局作用域)。每當有一個函數(shù)進入執(zhí)行流時,就會形成一個對應的執(zhí)行環(huán)境(函數(shù)作用域),并將該執(zhí)行環(huán)境壓入棧中。每當一個函數(shù)執(zhí)行完畢以后,對應的執(zhí)行環(huán)境就會從棧中彈出,然后被銷毀。這就是執(zhí)行環(huán)境棧,執(zhí)行環(huán)境棧的作用就是保證所有的函數(shù)能按照正確的順序被執(zhí)行。

但在瀏覽器中,有一些任務是非常耗時的,比如 ajax請求、定時器、事件等。為了保證主線程上的任務不被阻塞,JavaScript 內(nèi)部維護了一個任務隊列, 當這些耗時任務結(jié)束時(Ajax 請求返回、定時器超時、事件被觸發(fā)),就將對應的回調(diào)函數(shù)插入隊列中進行等待。這些任務的執(zhí)行時機并不確定,只有當所有同步任務執(zhí)行完畢后,執(zhí)行環(huán)境棧被清空(棧底的全局執(zhí)行環(huán)境會一直存在,直到進程退出)以后,然后再從任務隊列中依次讀取回調(diào)函數(shù),并將其壓入執(zhí)行環(huán)境棧中。于是,主線程開始執(zhí)行新的同步任務,執(zhí)行完畢后再從棧中彈出,棧被清空。

主線程從任務隊列中讀取任務是不斷循環(huán)的,每當棧被清空后,主線程就會從任務隊列中讀取新的任務并執(zhí)行,如果沒有新的任務,就會一直等待,直到有新的任務。JavaScript 的這種執(zhí)行機制就叫做任務循環(huán)。因為每個任務都由一個事件所觸發(fā),所以也叫 “事件循環(huán)”。

7、Ajax 和 跨域技術    

Ajax 是瀏覽器專門用來和服務器進行交互的異步通訊技術,其核心對象是 XMLHttpRequest,通過該對象可以創(chuàng)建一個 Ajax 請求。Ajax 請求是一個耗時的異步操作,當請求發(fā)出以后,Ajax 提供了兩個狀態(tài)位來描述請求在不同階段的狀態(tài),這兩個狀態(tài)位分別是 readyState 和 status ,readyState 通過 5個狀態(tài)碼來描述一個請求的 5 個階段:

  • 0 - 請求未發(fā)送,初始化階段

  • 1 - 請求發(fā)送中,服務器還未收到請求

  • 2 - 請求發(fā)送成功,服務器已收到請求

  • 3 - 服務器處理完成,開始響應請求,傳輸數(shù)據(jù)

  • 4 - 客戶端收到請求,并完成了數(shù)據(jù)下載,生成了響應對象

status 用于描述服務端對請求處理的情況,200 表示正確響應了請求,404 表示服務器找不到資源,500 代表服務器內(nèi)部異常等等。

Ajax 對象還可以設置一個 timeout 值,代表超時時間。切記:timeout 只會影響 readyState,而不會影響 status,因為超時只會中斷數(shù)據(jù)傳輸,但不會影響服務器的處理結(jié)果。 如果 timeout 設置的不合理,就會導致響應碼 status 是 200,但 response里卻沒有數(shù)據(jù),這種情況就是服務器正確響應了請求,但數(shù)據(jù)的下載被超時中斷了。

為了保證用戶信息的安全,瀏覽器引入了同源策略,對腳本請求做了限制,不允許 Ajax 跨域請求服務器 ,只允許請求和當前地址同域的服務器資源。但不限制 HTML 標簽發(fā)送跨域請求,比如 script、img、a 標簽等,因此可以利用標簽跨域能力來實現(xiàn)跨域請求,這就是 JSONP 能夠跨域的原理。

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

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

8、模塊化

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

9、Node.js

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

10、ES6

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

  • 新增 let、const 命令 來聲明變量,和var 相比,let 聲明的變量不存在變量提升問題,但沒有改變JS弱類型的特點,依然可以接受任意類型變量的聲明;const 聲明的變量不允許在后續(xù)邏輯中改變,提高了JS語法的嚴謹性。

  • 新增解構(gòu)賦值、rest 語法、箭頭函數(shù)等,這些都是為了讓代碼看起來更簡潔,而包裝的語法糖。

  • 新增模塊化機制,這是 JavaScript 走向規(guī)范比較重要的一步,讓前端更方便的實現(xiàn)工程化。

  • 新增類和繼承的概念,配合模塊化,JavaScript 也可以實現(xiàn)高復用、高擴展的系統(tǒng)架構(gòu)。

  • 新增模板字符串功能,高效簡潔,結(jié)束拼接字符串的時代。

  • 新增 Promise 機制,解決異步回調(diào)多層嵌套的問題。

CSS 篇

1、CSS選擇器

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

2、CSS Reset

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

1
*{ margin:0; padding:0; }

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

3、盒子布局

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

需要注意的是:

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

4、浮動布局

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

5、定位布局

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

6、彈性布局

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

7、CSS3 動畫

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

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

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

當播放次數(shù)設置為1時,不會觸發(fā) animationIteration 。

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

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

8、BFC

BFC 是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面元素。比如:內(nèi)部滾動就是一個 BFC,當一個父容器的 overflow-y 設置為 auto 時,并且子容器的長度大于父容器時,就會出現(xiàn)內(nèi)部滾動,無論內(nèi)部的元素怎么滾動,都不會影響父容器以外的布局,這個父容器的渲染區(qū)域就叫 BFC。滿足下列條件之一就可觸發(fā) BFC:

  • 根元素,即 HTML 元素

  • float 的值不為 none

  • overflow 的值不為 visible

  • display 的值為 inline-block、table-cell、table-caption

  • position 的值為 absolute 或 fixed

9、Sprite,Iconfont,font-face

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

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

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

10、CSS HACK

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

1
2
3
4
.el {
  margin-left: 20px; // 其他
  _margin-left: 10px;// ie6
}

兼容各大瀏覽器的 css hack 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.element {
    color: #000;     // W3c標準
    [;color:#f00;];  // Webkit(Chrome/Safari)
    color: #666\9;   // IE8
    *color: #999;    // IE7
    _color: #333;    // IE6 
}
:root .element {color: #0f0\9;} // IE9
// Opera
@media all and (-webkit-min-device-pixel-ratio:10000),
not all and (-webkit-min-device-pixel-ratio:0) {
    .element {color:#336699;}
}
// Firefox
@-moz-document url-prefix() {
    .element {color: #f1f1f1}
}  

HTML 篇

1、BOM 

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

  • document - 即文檔對象,渲染引擎在解析HTML代碼時,會為每一個元素生成對應的DOM對象,由于元素之間有層級關系,因此整個HTML代碼解析完以后,會生成一個由不同節(jié)點組成的樹形結(jié)構(gòu),俗稱DOM樹,document 用于描述DOM樹的狀態(tài)和屬性,并提供了很多操作DOM的API。

  • frames - HTML 子框架,即在瀏覽器里嵌入另一個窗口,父框架和子框架擁有獨立的作用域和上下文。

  • history - 以棧(FIFO)的形式保存著頁面被訪問的歷史記錄,頁面前進即入棧,頁面返回即出棧。

  • location - 提供了當前窗口中加載的文檔相關信息以及一些導航功能。

  • navigator - 用來描述瀏覽器本身,包括瀏覽器的名稱、版本、語言、系統(tǒng)平臺、用戶特性字符串等信息。

  • screen - 提供了瀏覽器顯示屏幕的相關屬性,比如顯示屏幕的寬度和高度,可用寬度和高度。

2、DOM 系統(tǒng)

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

  • 1級DOM - 在1998年10月份成為W3C的提議,由 DOM 核心與 DOM HTML 兩個模塊組成。DOM核心能映射以XML為基礎的文檔結(jié)構(gòu),允許獲取和操作文檔的任意部分。DOM HTML通過添加HTML專用的對象與函數(shù)對DOM核心進行了擴展。

  • 2級DOM - 鑒于1級DOM僅以映射文檔結(jié)構(gòu)為目標,DOM 2級面向更為寬廣。通過對原有DOM的擴展,2級DOM通過對象接口增加了對鼠標和用戶界面事件(DHTML長期支持鼠標與用戶界面事件)、范圍、遍歷(重復執(zhí)行DOM文檔)和層疊樣式表(CSS)的支持。同時也對DOM 1的核心進行了擴展,從而可支持XML命名空間。

  • 3級DOM - 通過引入統(tǒng)一方式載入和保存文檔和文檔驗證方法對DOM進行進一步擴展,DOM3包含一個名為“DOM載入與保存”的新模塊,DOM核心擴展后可支持XML1.0的所有內(nèi)容,包括XML Infoset、 XPath、和XML Base。

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

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

3、事件系統(tǒng)

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

  • 第一根手指放下,觸發(fā) touchstart,除此之外什么都不會發(fā)生

  • 手指滑動時,觸發(fā)touchmove

  • 第二根手指放下,觸發(fā) gesturestart 

  • 觸發(fā)第二根手指的 touchstart 

  • 立即觸發(fā) gesturechange 

  • 任意手指移動,持續(xù)觸發(fā) gesturechange

  • 第二根手指彈起時,觸發(fā) gestureend,以后將不會再觸發(fā) gesturechange 

  • 觸發(fā)第二根手指的 touchend 

  • 觸發(fā)touchstart (多根手指在屏幕上,提起一根,會刷新一次全局touch)  

  • 彈起第一根手指,觸發(fā) touchend 

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

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

  • 事件捕獲:當用戶觸發(fā)點擊事件后,頂層對象 document 就會發(fā)出一個事件流,從最外層的 DOM 節(jié)點向目標元素節(jié)點傳遞,最終到達目標元素。

  • 事件處理:當?shù)竭_目標元素之后,執(zhí)行目標元素綁定的處理函數(shù)。如果沒有綁定監(jiān)聽函數(shù),則不做任何處理。

  • 事件冒泡:事件流從目標元素開始,向最外層DOM節(jié)點傳遞,途中如果有節(jié)點綁定了事件處理函數(shù),這些函數(shù)就會被執(zhí)行。

利用事件冒泡原理可以實現(xiàn) “事件委托”。

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

4、HTML 渲染流程

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

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

  • HTML Parser 解析 HTML 文檔,并將各標記逐個轉(zhuǎn)化為 DOM 節(jié)點,生成 “DOM樹”。

  • CSS Parser 解析外部 CSS 文件以及樣式元素中的樣式數(shù)據(jù),生成 “CSSOM樹”。

  • “DOM樹” 和 “CSSOM樹” 通過 “附著” 將創(chuàng)建另一個樹結(jié)構(gòu):“渲染樹”。

  • 渲染樹包含多個帶有視覺屬性(如顏色和尺寸)的矩形,這些矩形的排列順序就是它們將在屏幕上顯示的順序。

  • 渲染樹構(gòu)建完畢之后,進入“布局” 處理階段,也就是為每個節(jié)點分配一個應出現(xiàn)在屏幕上的確切坐標。

  • 下一個階段是 “繪制”,渲染引擎會遍歷渲染樹,由用戶界面后端層將每個節(jié)點繪制出來。

需要注意的是:

這是一個漸進的過程。為達到更好的用戶體驗,呈現(xiàn)引擎會力求盡快將內(nèi)容顯示在屏幕上。它不必等到整個 HTML 文檔解析完畢之后,就會開始構(gòu)建呈現(xiàn)樹和設置布局。在不斷接收和處理來自網(wǎng)絡的其余內(nèi)容的同時,呈現(xiàn)引擎會將部分內(nèi)容解析并顯示出來。

5、重繪與回流

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

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

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

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

  • 添加、刪除元素(回流+重繪)

  • 隱藏元素,display: none(回流+重繪),visibility:hidden(只重繪,不回流)

  • 移動元素,比如改變 top、left 的值,或者移動元素到另外一個父元素中。(重繪+回流)

  • 對 style 的操作(對不同的屬性操作,影響不一樣)

  • 還有一種是用戶的操作,比如改變?yōu)g覽器大小,改變?yōu)g覽器的字體大小等(回流+重繪)

注意問題:

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

6、本地存儲

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

  • Firefox 和 Safari 允許 cookie 多達 4097 個字節(jié),包括名(name)、值(value) 和 等號。

  • Opera 允許 cookie 多達 4096 個字節(jié),包括:名(name)、值(value) 和 等號。

  • Internet Explorer 允許 cookie 多達4095個字節(jié),包括:名(name)、值(value) 和 等號。

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

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

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

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

7、瀏覽器緩存機制

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

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

Last-Modified 是標識文件在服務器上的最新更新時間。下次請求時,如果文件緩存過期,瀏覽器通過 If-Modified-Since 字段帶上這個時間,發(fā)送給服務器,由服務器比較時間戳來判斷文件是否有修改。如果沒有修改,服務器返回304告訴瀏覽器繼續(xù)使用緩存;如果有修改,則返回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 標準中新加的字段,功能一樣,都是控制緩存的有效時間。當這兩個字段同時出現(xiàn)時,Cache-Control 是高優(yōu)化級的。

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

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

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

8、History

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

  • window.history.back( )  返回到上一個頁面

  • window.history.forward( )  進入到下一個頁面

  • window.history.go( [delta] )  跳轉(zhuǎn)到指定頁面

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

  • pushState 是往 history 對象里添加一個新的歷史記錄。

  • replaceState 是替換 history 對象中的當前歷史記錄。

  • onpopstate 當點擊瀏覽器后退按鈕或JS調(diào)用 history.back 都會觸發(fā)該事件。

onpopstate 和 onhashchange 的區(qū)別:

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

9、HTML5 離線緩存

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

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

  • CACHE MANIFEST - 在此標題下列出的文件將在首次下載后進行緩存

  • NETWORK - 在此標題下列出的文件需要與服務器的連接,且不會被緩存

  • FALLBACK - 在此標題下列出的文件規(guī)定當頁面無法訪問時的回退頁面(比如 404 頁面)

離線緩存為應用帶來三個優(yōu)勢:

  • 離線瀏覽 - 用戶可在應用離線時使用它們

  • 速度 - 已緩存資源加載得更快

  • 減少服務器負載 - 瀏覽器將只從服務器下載更新過或更改過的資源。

10、Web語義化與SEO

Web語義化是指使用語義恰當?shù)臉撕灒鬼撁嬗辛己玫慕Y(jié)構(gòu),頁面元素有含義,能夠讓人和搜索引擎都容易理解。

SEO是指在了解搜索引擎自然排名機制的基礎之上,對網(wǎng)站進行內(nèi)部及外部的調(diào)整優(yōu)化,改進網(wǎng)站在搜索引擎中關鍵詞的自然排名,獲得更多的展現(xiàn)量,吸引更多目標客戶點擊訪問網(wǎng)站,從而達到互聯(lián)網(wǎng)營銷及品牌建設的目標。

搜索引擎通過爬蟲技術獲取的頁面就是由一堆 html 標簽組成的代碼,人可以通過可視化的方式來判斷頁面上哪些內(nèi)容是重點,而機器做不到。 但搜索引擎會根據(jù)標簽的含義來判斷內(nèi)容的權(quán)重,因此,在合適的位置使用恰當?shù)臉撕灒拐麄€頁面的語義明確,結(jié)構(gòu)清晰,搜索引擎才能正確識別頁面中的重要內(nèi)容,并予以較高的權(quán)值。比如h1~h6這幾個標簽在SEO中的權(quán)值非常高,用它們作頁面的標題就是一個簡單的SEO優(yōu)化。


返回頂部
亚洲一区二区三区在线播放,伊人久久精品无码av一区,亚洲国产精品一区二区第一页免,无码aⅴ精品一区二区三区浪潮
<span id="fu32q"></span>
    1. <li id="fu32q"><meter id="fu32q"><th id="fu32q"></th></meter></li>
      成人h动漫精品一区二区| caoporm超碰国产精品| 国产精品一二三| jvid福利写真一区二区三区| 爽好多水快深点欧美视频| 免费一级片91| 成人毛片老司机大片| 免费一级片91| 99久久精品国产精品久久| 捆绑紧缚一区二区三区视频| 成人免费视频免费观看| 久久激情综合网| www..com久久爱| 国产精品18久久久久久久网站| 91麻豆国产香蕉久久精品| 久久精品国产77777蜜臀| 97久久精品人人澡人人爽| 国产在线精品一区二区三区不卡| 99国产麻豆精品| 国产一区视频网站| 日本va欧美va欧美va精品| 国产91丝袜在线18| 久久成人免费日本黄色| 91丨九色丨黑人外教| 国产精品一区三区| 美国毛片一区二区三区| 91麻豆福利精品推荐| 成人综合婷婷国产精品久久| 精品伊人久久久久7777人| 日韩综合小视频| 成人av网站在线| 国产盗摄视频一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产成人在线视频播放| 韩国精品免费视频| 美女mm1313爽爽久久久蜜臀| 日本不卡高清视频| 日本va欧美va精品| 欧美aa在线视频| 天堂va蜜桃一区二区三区漫画版| 盗摄精品av一区二区三区| 国产成人免费视频网站高清观看视频| 精品在线免费观看| 精品写真视频在线观看| 精品在线亚洲视频| 国产精品一区二区x88av| 韩国三级在线一区| 国产一区二区三区在线观看免费| 久久99久久99小草精品免视看| 免费高清视频精品| 美女在线视频一区| 精品一区二区三区视频在线观看| 久久超级碰视频| 激情成人午夜视频| 国产精品一色哟哟哟| 国产99久久精品| 成a人片亚洲日本久久| 白白色亚洲国产精品| 97se狠狠狠综合亚洲狠狠| 91日韩精品一区| 欧美a级一区二区| 狠狠色2019综合网| 国产一区 二区 三区一级| 国产黄色精品网站| av资源站一区| 免费看欧美女人艹b| 久久精品国产精品亚洲红杏| 国产盗摄女厕一区二区三区| 91污在线观看| 久久99精品久久久| 风间由美性色一区二区三区| 91影院在线观看| 美女视频第一区二区三区免费观看网站 | 99久久er热在这里只有精品15| www..com久久爱| 蜜桃精品视频在线| 国产酒店精品激情| 97久久精品人人做人人爽50路| 免费的国产精品| 国产成人在线视频播放| 99re在线精品| 国产一区二区三区免费| 99精品国产99久久久久久白柏| 久久国产综合精品| 成年人网站91| 国产一区二区三区四区在线观看| www.亚洲激情.com| 精品午夜久久福利影院| 国产91富婆露脸刺激对白| 人人狠狠综合久久亚洲| 国产福利精品导航| 蜜桃91丨九色丨蝌蚪91桃色| 国产69精品久久久久777| 日韩不卡一二三区| 东方aⅴ免费观看久久av| 蜜臀va亚洲va欧美va天堂| 国产成人av福利| 美女高潮久久久| 91麻豆精东视频| 粉嫩久久99精品久久久久久夜| 美国十次了思思久久精品导航| 北条麻妃国产九九精品视频| 国产精品一二三区| 精品一二三四区| 日韩不卡一二三区| 91在线播放网址| av在线不卡免费看| 国产成人自拍网| 激情偷乱视频一区二区三区| 日本视频一区二区三区| av不卡在线播放| 国产成人在线视频网站| 国产真实乱对白精彩久久| 另类小说综合欧美亚洲| 日韩中文字幕av电影| 91蜜桃免费观看视频| 成人午夜在线播放| 国产又粗又猛又爽又黄91精品| 99国产一区二区三精品乱码| 国产91精品在线观看| 国产一区二区伦理片| 麻豆国产精品官网| 视频一区二区国产| 成人av网站免费| 本田岬高潮一区二区三区| 成人a免费在线看| 粉嫩aⅴ一区二区三区四区五区| 国产在线一区二区综合免费视频| 韩国v欧美v日本v亚洲v| 国内欧美视频一区二区| 久久精品久久久精品美女| 美女一区二区久久| 麻豆91精品91久久久的内涵| 久久精品国产精品亚洲综合| 美国欧美日韩国产在线播放| 韩国一区二区在线观看| 国产一区二区久久| 国产成人免费在线视频| 成人动漫一区二区| 丝袜a∨在线一区二区三区不卡| 91污片在线观看| 秋霞午夜av一区二区三区| 免费成人av资源网| 狠狠狠色丁香婷婷综合激情| 国产精品亚洲一区二区三区妖精| 国产aⅴ综合色| av一区二区三区在线| 爽爽淫人综合网网站| 美女视频黄久久| 国产精品91一区二区| 岛国一区二区三区| 热久久一区二区| 国产寡妇亲子伦一区二区| 99久久精品国产导航| 美女脱光内衣内裤视频久久网站 | 丁香啪啪综合成人亚洲小说 | av福利精品导航| 免费av成人在线| 国产传媒日韩欧美成人| 99精品偷自拍| 久久99国产精品久久| 国产69精品久久久久毛片| 日韩av午夜在线观看| 韩国v欧美v亚洲v日本v| 91在线你懂得| 国产中文字幕一区| 91看片淫黄大片一级在线观看| 老司机精品视频在线| 成人综合在线网站| 麻豆精品视频在线| 不卡一卡二卡三乱码免费网站| 三级久久三级久久| 国产成人综合精品三级| 日本欧美一区二区| 粉嫩av一区二区三区在线播放| 日韩国产在线观看| 国产成人在线视频网站| 免费成人性网站| 97久久超碰国产精品电影| 精彩视频一区二区| 丝袜美腿亚洲一区二区图片| 国产精品亚洲成人| 免费高清在线视频一区·| 成人小视频在线观看| 国产一区福利在线| 日本成人在线一区| av午夜一区麻豆| 国产美女一区二区三区| 日本欧美韩国一区三区| 成人久久18免费网站麻豆 | 日本vs亚洲vs韩国一区三区 | av成人老司机| 国产大片一区二区| 国产一区二区三区av电影 | 男人的j进女人的j一区| 国产成人精品网址| 久久99久久久欧美国产| 美腿丝袜亚洲三区| 日本欧美韩国一区三区| 日韩—二三区免费观看av| 成人av综合一区| 大白屁股一区二区视频| 国产白丝精品91爽爽久久| 国产一区二区三区国产| 国产一区在线精品| 国产在线播放一区三区四| 久久99国产精品麻豆| 加勒比av一区二区| 国产乱码精品1区2区3区| 国产综合色在线| 精品在线亚洲视频| 激情六月婷婷久久| 国产精品一区专区| 成人一级视频在线观看| 国产91精品一区二区| 国产成人在线视频免费播放| 粉嫩av一区二区三区在线播放| 成人午夜激情影院| 成人免费毛片片v| av亚洲产国偷v产偷v自拍| 91在线视频18| 老色鬼精品视频在线观看播放| 精品一区中文字幕| 国产成人av电影| 成人免费的视频| 99re热这里只有精品视频| 日韩精品五月天| 日韩av一区二区在线影视| 美女爽到高潮91| 国产精品99久久久久久久女警| 成人丝袜高跟foot| 91亚洲男人天堂| 看电视剧不卡顿的网站| 国产在线精品一区二区| 成人免费视频app| 欧美96一区二区免费视频| 国产一区二区三区免费在线观看| 成人免费视频网站在线观看| 91视频在线看| 久久99精品国产麻豆婷婷洗澡| 国产一区二区三区日韩| 99国产欧美久久久精品| 精品一区二区av| 不卡的电视剧免费网站有什么| 丝袜亚洲另类欧美综合| 国产一区二区三区黄视频| 99re视频这里只有精品| 国内精品第一页| 91麻豆高清视频| 国产一区不卡在线| 日韩专区一卡二卡| 国产乱淫av一区二区三区 | 激情综合色丁香一区二区| 波多野结衣精品在线| 美国毛片一区二区| 91在线一区二区三区| 九九热在线视频观看这里只有精品| 国产91丝袜在线播放0| 美女在线一区二区| 99国产精品久| 国产一区二区三区在线观看免费视频 | www.亚洲激情.com| 国产一区二区成人久久免费影院 | 国产精品一卡二卡| 日韩电影免费在线看| 国产成人精品1024| 久久机这里只有精品| 91麻豆福利精品推荐| 国产成人精品亚洲日本在线桃色| 美国欧美日韩国产在线播放| 99久久精品99国产精品| 国产不卡高清在线观看视频| 久久av中文字幕片| 日韩国产精品91| 波多野结衣中文字幕一区二区三区| 老色鬼精品视频在线观看播放| 91在线视频18| caoporn国产一区二区| 国产成人一区二区精品非洲| 久草精品在线观看| 蜜臀av在线播放一区二区三区| 91香蕉视频污| 99久久er热在这里只有精品66| 国产不卡一区视频| 国产xxx精品视频大全| 精品一区二区在线视频| 麻豆91在线播放| 另类小说欧美激情| 久久成人免费电影| 麻豆久久久久久| 久久99九九99精品| 男人的j进女人的j一区| 免费观看在线色综合| 日本女优在线视频一区二区| 日本不卡一区二区三区高清视频| 三级一区在线视频先锋| 首页国产欧美日韩丝袜| 天堂在线一区二区| 日韩主播视频在线| 男女视频一区二区| 美女一区二区视频| 狠狠色狠狠色合久久伊人| 国产在线观看一区二区| 国产精品一二三区在线| 成人免费毛片高清视频| av电影一区二区| 日本在线不卡视频一二三区| 青草国产精品久久久久久| 欧美96一区二区免费视频| 另类综合日韩欧美亚洲| 国产原创一区二区| 国产v综合v亚洲欧| av电影一区二区| 日本va欧美va精品发布| 精品在线免费观看| 国产成人精品午夜视频免费| 99精品国产91久久久久久| 日本美女一区二区三区视频| 极品少妇一区二区三区精品视频 | 麻豆精品国产传媒mv男同 | 国产一区二区三区日韩| 国产 欧美在线| 高清不卡一二三区| 成人av一区二区三区| 日韩国产欧美在线播放| 韩国精品在线观看| 不卡在线观看av| 久久99国产精品尤物| 成人亚洲一区二区一| 人人超碰91尤物精品国产| 国产精品一二一区| 99久久免费视频.com| 麻豆91在线播放| 成a人片国产精品| 久久99热这里只有精品| www.在线成人| 韩国av一区二区| 91女人视频在线观看| 美腿丝袜亚洲综合| 不卡一卡二卡三乱码免费网站| 久久国内精品视频| 99久久国产综合精品色伊| 激情六月婷婷久久| 日韩和欧美的一区| 成人永久免费视频| 九一久久久久久| 天堂久久久久va久久久久| 国产精品一区二区在线播放| 国产成人啪午夜精品网站男同| 喷水一区二区三区| av电影在线观看完整版一区二区| 久久精品久久综合| 日韩精品一二三| 北条麻妃一区二区三区| 国产精品亚洲一区二区三区妖精| 秋霞午夜鲁丝一区二区老狼| av在线不卡观看免费观看| 国产原创一区二区| 另类欧美日韩国产在线| 91丨porny丨蝌蚪视频| 成人激情校园春色| 国产综合色在线视频区| 久久精品国产久精国产| 日韩黄色免费网站| 丝袜亚洲另类丝袜在线| 波多野结衣一区二区三区 | 美女高潮久久久| 91美女视频网站| aa级大片欧美| 成人永久aaa| 丁香婷婷综合网| 国产不卡视频一区二区三区| 国产剧情一区在线| 国产在线观看免费一区| 激情六月婷婷综合| 精品一区二区久久| 国产原创一区二区三区| 狠狠色综合日日| 国产九色精品成人porny| 久久99国产精品麻豆| 九色综合狠狠综合久久| 久久精品99久久久| 韩国一区二区视频| 国产乱子轮精品视频| 国产乱一区二区| 国产v综合v亚洲欧| av在线播放不卡| 视频在线观看国产精品| 日韩中文字幕麻豆| 美女精品自拍一二三四| 精品一区二区日韩| 国产福利91精品一区| 成人综合婷婷国产精品久久蜜臀| 成人福利电影精品一区二区在线观看| 成人激情av网| 日韩主播视频在线| 久久精品国产精品亚洲精品 | 日本vs亚洲vs韩国一区三区二区| 日本不卡视频一二三区| 激情综合色播五月|