本文用於記載我的前端進階之路,整理知識體系。順便練習一下Markdown語法。javascript
HTML 屬於結構層,負責描繪出內容的結構。
複製代碼
簡單來講,就是合適的標籤作合適的事情,這樣具備如下好處:css
簡單來講,能用
<header>
、<footer>
等 H5 新標籤的就不用<div class="header">
,不要使用<div>
來存放段落等……html
行內元素和其餘行內元素都會在一條水平線上排列,都是在同一行的;塊級元素卻老是會在新的一行開始排列,各個塊級元素獨佔一行,垂直向下排列,若想使其水平方向排序,可以使用左右浮動(
float:left/right
)讓其水平方向排列。前端
行內元素:a span i img input select b
等vue
塊級元素:div ul ol li h1~h6 p table
等html5
空元素:br hr link
等java
瀏覽器內核又能夠分紅兩部分:渲染引擎和JS引擎。webpack
瀏覽器 | IE | Chrome | Firefox | Safari |
---|---|---|---|---|
內核 | Trident | Blink(WebKit分支) | Gecko | WebKit |
header footer nav section article aside
等audio video
date
(從一個日期選擇器選擇一個日期) email
(包含 e-mail 地址的輸入域) number
(數值的輸入域) range
(必定範圍內數字值的輸入域) search
(用於搜索域) tel
(定義輸入電話號碼字段) 等localStorage,sessionStorage
SVG
繪圖drag
Cookie | session | sessionStorage | localStorage | |
---|---|---|---|---|
生命週期 | 可設置失效時間,沒有設置的話,默認是關閉瀏覽器後失效 | 存儲於服務器端的數據。服務器會清理長時間不用的session | 僅在當前網頁會話下有效,關閉頁面或瀏覽器後就會被清除 | 除非被手動清除,不然將會永久保存 |
存儲大小 | 4kb | 過多影響服務器會性能 | 能夠保存5MB | 能夠保存5MB |
Http請求 | 每次都會攜帶在HTTP頭中,若是使用cookie保存過多數據會帶來性能問題 | 存儲於服務器端的數據 session 存儲特定用戶會話所需的屬性和配置信息 | 僅在客戶端(即瀏覽器)中保存,不參與和服務器的通訊 | 同sessionStorage |
區別:
src
用於替代這個元素,而href
用於創建這個標籤與外部資源之間的關係git
<link href="style.css" rel="stylesheet/>
瀏覽器加載到這裏的時候,html的渲染和解析不會暫停,css文件的加載是同時進行的<script src="script.js"></script>
當瀏覽器解析到這句代碼時,頁面的加載和解析都會暫停直到瀏覽器拿到並執行完這個js文件CSS 屬於表示層,負責如何顯示有關內容。
複製代碼
css的盒模型由
content
(內容)、padding
(內邊距)、border
(邊框)、margin
(外邊距)組成。但盒子的大小由content
+padding
+border
這幾部分決定。box-sizing
是一個CSS3
屬性,與盒子模型有着密切聯繫。即決定元素的寬高如何計算,box-sizing
有三個屬性:github
box-sizing: content-box|border-box|inherit:
複製代碼
content-box
中,整個 div的寬、高,則不包括上面元素。就是content
大小。border-box
中,整個 div 的寬、高,包括 margin、padding、border。計算方式content
+ padding
+ border
= 自己元素大小,即縮小了content大小。inherit
中, inherit 指定box-sizing屬性的值,應該從父元素繼承CSS 經常使用選擇器
複製代碼
CSS 選擇器權重
!important
->行內樣式
->#id
->.class
->元素和僞元
素 -> * ->繼承
->默認
static
: 默認值。沒有定位,元素出如今正常的流中relative
(相對定位):生成相對定位的元素,相對於其正常(原先自己)位置進行定位absolute
(絕對定位):生成絕對定位的元素,相對於static定位之外的第一個父元素進行定位fixed
(固定定位):生成絕對定位的元素,相對於瀏覽器窗口進行定位推薦文章:css position
margin
屬性調整位置css
屬性float:left/right/none
左浮動/右浮動/不浮動(默認)推薦文章:css float
display的幾個經常使用的屬性值,inline , block, inline-block
複製代碼
推薦文章:css display
`px`和`em`和`rem`的區別
複製代碼
px
: 像素,相對長度單位。像素px是相對於顯示器屏幕分辨率而言的
em
的值並非固定的,會繼承父級元素的字體大小,表明倍數
rem
的值並非固定的,始終是基於根元素 的,也表明倍數
BFC 就是 塊級格式上下文,它是一個獨立的渲染區域,讓處於 BFC 內部的元素和外部的元素相互隔離,使內外元素的定位不會相互影響。
複製代碼
必定的 CSS 聲明能夠生成 BFC,瀏覽器對生成的 BFC 有一系列的渲染規則,利用這些渲染規則能夠達到必定的佈局效果。
爲何須要 BFC 呢?
如何產生 BFC?
工做中通常可能不會顧及這個:float 不多使用了,儘量使用 flex
推薦文章:我對BFC的理解
推薦文章:
一句話:迴流必將引發重繪,重繪不必定會引發迴流。
複製代碼
當Render Tree
中部分或所有元素的尺寸、結構、或某些屬性發生改變時,瀏覽器從新渲染部分或所有文檔的過程稱爲迴流。
當頁面中元素樣式的改變並不影響它在文檔流中的位置時(例如:color、background-color、visibility
等),瀏覽器會將新樣式賦予給元素並從新繪製它,這個過程稱爲重繪。
border-radius
,陰影box-shadow
,邊框圖片border-image
text-shadow
,強制文本換行word-wrap
,線性漸變linear-gradient
transform:rotate(90deg)
,縮放scale(0.85,0.90)
,translate(0px,-30px)
定位,傾斜skew(-9deg,0deg)
;::selection
;@media
,多欄佈局flex
transition
動畫 animation
提供了一種css的書寫方式,常見的就是 SAAS文檔 和 LESS文檔
複製代碼
DNS解析
TCP三次握手
發送請求,分析url,設置請求報文(頭,主題)
把請求回來的html代碼 通過解析生成DOM樹
解析css代碼生成,生成樣式樹
結合DOM和style樹生成渲染樹
推薦文章:從輸入url到頁面加載完成發生了什麼
location 對象:主要存儲 url 相關信息
history 對象:瀏覽歷史信息相關
- `history.go()` // 前進或後退指定的頁面數 history.go(num);
- `history.back()` // 後退一頁
- `history.forward()` // 前進一頁
複製代碼
navigator 對象:瀏覽器信息相關
- `navigator.userAgent`返回用戶代理頭的字符串表示(就是包括瀏覽器版本信息等的字符串)
- `navigator.cookieEnabled` // 返回瀏覽器是否支持(啓用)cookie
複製代碼
Http協議的特色
http狀態碼有那些?分別表明是什麼意思 首先,咱們大體區分下狀態碼:
而後,常見的狀態碼:
200 OK
服務器成功處理了請求301/302 Moved Permanently
(重定向)請求的URL已移走404 Not Found
(頁面丟失)未找到資源403
服務器拒絕請求408
(請求超時) 服務器等候請求時發生超時501 Internal Server Error
服務器遇到一個錯誤,使其沒法對請求提供服務
http
: 是互聯網上應用最爲普遍的一種網絡協議,是一個客戶端和服務器端請求和應答的標準(TCP
),用於從WWW
服務器傳輸超文本到本地瀏覽器的傳輸協議,它可使瀏覽器更加高效,使網絡傳輸減小
https
: 是以安全爲目標的HTTP
通道,簡單講是HTTP
的安全版,即HTTP
下加入SSL
層,HTTPS
的安全基礎是SSL
,所以加密的詳細內容就須要SSL
http
是超文本傳輸協議,信息是明文傳輸,https
則是具備安全性的 ssl
加密傳輸協議http
和 https
使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是 80
,後者是 443
http
的鏈接很簡單,是無狀態的;HTTPS
協議是由 SSL+HTTP
協議構建的可進行加密傳輸、身份認證的網絡協議,比 http
協議安全6種原始數據類型:
修改器方法:
訪問方法:
迭代方法:
簡單來講,閉包就是可以讀取其餘函數內部變量的函數
function Person() {
var name = 'hello'
function say () {
console.log(name)
}
return say()
}
Person() // hello
複製代碼
用途
最大用處有兩個,一個是前面提到的能夠讀取函數內部的變量,另外一個就是讓這些變量的值始終保持在內存中
注意點
因爲閉包會使得函數中的變量都被保存在內存中,內存消耗很大,因此不能濫用閉包,不然會形成網頁的性能問題,在IE中可能致使內存泄露
推薦文章:從閉包提及
每一個構造函數(constructor)都有一個原型對象(prototype),原型對象都包含一個指向構造函數的指針,而實例(instance)都包含一個指向原型對象的內部指針.
原型示意圖
原型鏈示意圖
在 JavaScript 中,研究 this 通常都是 this 的指向問題,核心就是 this 永遠指向最終調用它的那個對象,除非改變 this 指向或者箭頭函數那種特殊狀況
function test() {
console.log(this);
}
test() // window
var obj = {
foo: function () { console.log(this.bar) },
bar: 1
};
var foo = obj.foo;
var bar = 2;
obj.foo() // 1
foo() // 2
// 函數調用的環境不一樣,所獲得的結果也是不同的
複製代碼
apply,call,bind做用:三者均可以改變 this 的指向
var obj = {
name : 'sss'
}
function func(firstName, lastName){
console.log(firstName + ' ' + this.name + ' ' + lastName);
}
func.apply(obj, ['A', 'B']); // A sss B
複製代碼
var obj = {
name: 'sss'
}
function func(firstName, lastName) {
console.log(firstName + ' ' + this.name + ' ' + lastName);
}
func.call(obj, 'C', 'D'); // C sss D
複製代碼
var obj = {
name: 'sss'
}
function func() {
console.log(this.name);
}
var func1 = func.bind(null, 'xixi');
func1();
複製代碼
淺拷貝
...
深拷貝
推薦文章:JavaScript中的淺拷貝與深拷貝
JavaScript 是單線程語言
JavaScript 的 Event Loop 是 JS 的執行機制, 也就是事件循環
console.log(1)
setTimeout(function(){
console.log(2)
},0)
console.log(3)
// 1 3 2
複製代碼
JavaScript 將任務分爲同步任務和異步任務,執行機制就是先執行同步任務,將同步任務加入到主線程,遇到異步任務就先加入到 event table ,當全部的同步任務執行完畢,若是有可執行的異步任務,再將其加入到主線程中執行
setTimeout(function(){console.log(1);},0);
new Promise(function(resolve){
console.log(2);
for(var i = 0; i < 10000; i++){
i == 99 && resolve();
}
}).then(function(){
console.log(3)
});
console.log(4);
// 2 4 3 1
複製代碼
在異步任務中,定時器也屬於特殊的存在。有人將其稱之爲 宏任務、微任務,定時器就屬於宏任務的範疇。
推薦文章: 這一次,完全弄懂 JavaScript 執行機制
ES6新增的特性
ES6 容許使用「箭頭」(=>)定義函數
var f = v => v;
// 等同於
var f = function (v) {
return v;
}
複製代碼
Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大.所謂Promise,簡單說就是一個容器,裏面保存着某個將來纔會結束的事件(一般是一個異步操做)的結果 --ES6入門-阮一峯
在 MVVM 架構下,View 和 Model 之間並無直接的聯繫,而是經過 ViewModel 進行交互,Model 和 ViewModel 之間的交互時雙向的,所以 View 數據會同步到 Model 中,而 Model 數據的變化也會當即反應到 View 上。
ViewModel 經過雙向數據綁定把 View 層和 Model 層鏈接了起來,而 View 和 Model 之間的同步工做徹底是自動的,無需人爲干涉,所以開發者只須要關注業務邏輯,不須要手動操做 DOM,不須要關注數據狀態的同步問題,複雜的數據狀態維護徹底由 MVVM 來統一管理。
M - Model。Model 表明數據模型,也能夠在 Model 中定義數據修改和操做的業務邏輯。
V - View。View 表明 UI 組件,它負責將數據模型轉化爲 UI 展示出來。 VM - ViewModel。ViewModel 監聽模型數據的改變和控制視圖行爲、處理用戶交互,簡單理解就是一個同步 View 和 Model 的對象,鏈接 Model 和 View。
請大體講下 Vue 的生命週期?
什麼是 Vue 生命週期?
Vue 實例從建立到銷燬的過程,就是生命週期。從開始建立、初始化數據、編譯模板、掛載 DOM -> 渲染、更新 -> 渲染、銷燬等一系列過程,稱之爲 Vue 的生命週期。
Vue 有幾個生命週期,它們的做用主要是什麼?
8 個,建立前/建立後、掛載前/掛載後、更新前/更新後、銷燬前/銷燬後。Vue 生命週期的做用是方便咱們經過它的生命週期,在業務代碼中更好地操做數據,實現相關功能。
第一次頁面加載會觸發 Vue 哪幾個鉤子?
會觸發 4 個生命鉤子:建立前/建立後、掛載前/掛載後
DOM 渲染在哪一個週期就已經完成?
在 beforeMounted 時它執行了 render 函數,對 $el 和 data 進行了初始化,但此時仍是掛載到虛擬的 DOM 節點,而後它在 mounted 時就完成了 DOM 渲染,這時候咱們通常還進行 Ajax 交互。
微信小程序項目結構主要有四個文件類型
主要文件
小程序直接 this.data 的屬性是不能夠同步到視圖的,必須調用:
this.setData({
// 這裏設置
})
複製代碼
使用全局變量實現數據傳遞 在 app.js 文件中定義全局變量 globalData, 將須要存儲的信息存放在裏面
// app.js
App({
// 全局變量
globalData: {
userInfo: null
}
})
複製代碼
使用的時候,直接使用
getApp()
拿到存儲的信息
使用
wx.navigateTo
與wx.redirectTo
的時候,能夠將部分數據放在 url 裏面,並在新頁面onLoad
的時候初始化
//pageA.js
// Navigate
wx.navigateTo({
url: '../pageD/pageD?name=raymond&gender=male',
})
// Redirect
wx.redirectTo({
url: '../pageD/pageD?name=raymond&gender=male',
})
// pageB.js
...
Page({
onLoad: function(option){
console.log(option.name + 'is' + option.gender)
this.setData({
option: option
})
}
})
複製代碼
須要注意的問題:
首先在全局 config 中的 window 配置 enablePullDownRefresh 在 Page 中定義 onPullDownRefresh 鉤子函數,到達下拉刷新條件後,該鉤子函數執行,發起請求方法 請求返回後,調用 wx.stopPullDownRefresh 中止下拉刷新
相同點:首先他們都是做爲點擊事件函數,就是點擊時觸發。在這個做用上他們是同樣的,能夠不作區分
不一樣點:他們的不一樣點主要是bindtap是不會阻止冒泡事件的,catchtap是阻值冒泡的
wx.navigateTo()
, wx.redirectTo()
, wx.switchTab()
, wx.navigateBack()
, wx.reLaunch()
的區別wx.navigateTo()
:保留當前頁面,跳轉到應用內的某個頁面。可是不能跳到 tabbar
頁面wx.redirectTo()
:關閉當前頁面,跳轉到應用內的某個頁面。可是不容許跳轉到 tabbar
頁面wx.switchTab()
:跳轉到 abBar
頁面,並關閉其餘全部非 tabBar
頁面wx.navigateBack()
關閉當前頁面,返回上一頁面或多級頁面。可經過getCurrentPages()
獲取當前的頁面棧,決定須要返回幾層wx.reLaunch()
:關閉全部頁面,打開到應用內的某個頁面入口(entry)
- 入口起點(entry point)指示 webpack 應該使用哪一個模塊,來做爲構建其內部依賴圖的開始
- 能夠經過在 webpack 配置中配置 entry 屬性,來指定一個入口起點(或多個入口起點)
複製代碼
module.exports = {
entry: './path/to/my/entry/file.js'
};
複製代碼
輸出(output)
loader
插件(plugins)
模式
module.exports = {
mode: 'production'
};
複製代碼
推薦文檔:官方文檔
推薦文章
在進軍前端的路上,路遇蛋總,jsLiang等大佬的知識分享。因而乎也想整理一下本身這段時間學習的知識體系。
dog蛋 掘金-蛋總
jsLiang GitHub-jsLiang
RoaMan GitHub-RoaMan
不熬夜,晚安。