第一種:css
<style> .container { display: table; } .inner { display: table-cell; vertical-align:middle; text-align:center; } </style>
<div class="container">
<div class="inner">
you own content
</div>
</div>
複製代碼
第二種:html
<style> .container { position: relative; } .inner { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style>
<div class="container">
<div class="inner">
your own content
</div>
</div>
複製代碼
第三種:前端
<style> .container{ text-align: center; } .container:before { content: ''; display: inline-block; height: 100%; vertical-align: middle; } .inner { display: inline-block; } </style>
<div class="container">
<div class="inner">
this is a box fixed in center of screen<br>The second line
</div>
</div>
複製代碼
px
表示「絕對尺寸」(並不是真正的絕對),實際上就是css中定義的像素(此像素與設備的物理像素有必定的區別,後續詳細說明見文末說明1),利用 px
設置字體大小及元素寬高等比較穩定和精確。font-size
(若是當前對象內文本的 font-size
計量單位也是em,則當前對象內文本的 font-size
的參考對象爲父元素文本 font-size
)。rem
也表示相對尺寸,其參考對象爲根元素<html>
的 font-size
,所以只須要肯定這一個 font-size
。Undefined
、Null
、Boolean
、Number
、String
、Symbol
、Object
例子🌰:java
function create() {
// 建立一個空的對象
let obj = new Object()
// 得到構造函數
let Con = [].shift.call(arguments)
// 連接到原型
obj.__proto__ = Con.prototype
// 綁定 this,執行構造函數
let result = Con.apply(obj, arguments)
// 確保 new 出來的是個對象
return typeof result === 'object' ? result : obj
}
複製代碼
var scope = 'global scope';
function checkScope() {
var scope = 'local scope';
function f() {
return scope;
}
return f;
}
checkScope()(); // local scope
複製代碼
javaScript權威指南上的解釋是: call() 、apply()能夠看做是某個對象的方法,經過調用方法的形式來間接調用函數。bind() 就是將某個函數綁定到某個對象上。node
關於call() 和 apply() 在犀牛書上的解釋可能比較生澀難懂,個人理解就是,它們的做用是: 讓函數在某個指定的對象下執行。正則表達式
var obj = {x: 1}
function foo() {console.log(this.x)}
foo.call(obj) // 打印結果:1
複製代碼
call() 和apply()的第一個參數相同,就是指定的對象。這個對象就是該函數的執行上下文。後端
call()和apply()的區別就在於,二者之間的參數。數組
call()在第一個參數以後的 後續全部參數就是傳入該函數的值。apply() 只有兩個參數,第一個是對象,第二個是數組,這個數組就是該函數的參數。promise
var obj = {};
function foo(a, b, c) {
console.log(b);
}
foo.call(obj, 1, 2, 3) // 打印結果:2;
複製代碼
var obj = {};
function foo(a, b, c) {
console.log(b);
}
foo.apply(obj, [1, 2, 3]) // 打印結果:2;
複製代碼
bind() 方法和前二者不一樣在於: bind() 方法會返回執行上下文被改變的函數而不會當即執行,而前二者是直接執行該函數。他的參數和call()相同。瀏覽器
這三個方法的做用都是改變函數的執行上下文!
function stringToCamelCase(str){
var reg=/-(\w)/g; //子項()表示子項
return str.replace(reg,function($0, $1){
// $0表明正則總體,replace()方法中的第二個參數如果回調函數,那麼這個回調函數中的參數就是匹配成功後的結果
// 若回調函數中有多個參數時,第一個參數表明整個正則匹配結果,第二個參數表明第一個子項
alert($0); // -b
alert($1); // b
return $1.toUpperCase();
});
}
複製代碼
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success');
}, 1000);
})
const promise2 = promise1.then(() => {
throw new Error('error~~~');
});
console.log('promise1', promise1);
console.log('promise2', promise2);
setTimeout(() => {
console.log('promise1', promise1);
console.log('promise2', promise2);
}, 2000);
複製代碼
promise1 Promise {} promise2 Promise {} promise1 Promise {: "success"} Promise {: Error: error~~~at promise1.then (:8:11)}
CommonJS
CommonJS
是以在瀏覽器環境以外構建 JavaScript
生態系統爲目標而產生的項目,好比在服務器和桌面環境中,Node.JS
遵循CommonJS
的規範 CommonJS
規範是爲了解決 JavaScript
的做用域問題而定義的模塊形式,可使每一個模塊它自身的命名空間中執行。該規範的主要內容是,模塊必須經過 module.exports
導出對外的變量或接口,經過 require()
來導入其餘模塊的輸出到當前模塊做用域中。
var clock = require('clock');
clock.start();
複製代碼
CommonJS
是同步加載模塊
AMD
基於CommonJS
規範的nodeJS
出來之後,服務端的模塊概念已經造成,很天然地,你們就想要客戶端模塊。並且最好二者可以兼容,一個模塊不用修改,在服務器和瀏覽器均可以運行。可是,因爲一個重大的侷限,使得CommonJS
規範不適用於瀏覽器環境。若是將上面的代碼運行在客戶端瀏覽器,就會報錯。
上面的require
方法是同步的。這對服務器端不是一個問題,由於全部的模塊都存放在本地硬盤,能夠同步加載完成,等待時間就是硬盤的讀取時間。可是,對於瀏覽器,這倒是一個大問題,由於模塊都放在服務器端,等待時間取決於網速的快慢,可能要等很長時間,瀏覽器處於"假死"狀態。
所以,瀏覽器端的模塊,不能採用"同步加載",只能採用"異步加載"。這就是AMD規範誕生的背景。
CommonJS
是主要爲了JS
在後端的表現制定的,他是不適合前端的,AMD
出現了,它就主要爲前端JS的表現制定規範。
AMD
是Asynchronous Module Definition
的縮寫,意思就是"異步模塊定義"。它採用異步方式加載模塊,模塊的加載不影響它後面語句的運行。全部依賴這個模塊的語句,都定義在一個回調函數中,等到加載完成以後,這個回調函數纔會運行。 AMD
也採用require()
語句加載模塊,可是不一樣於CommonJS
,它要求兩個參數:
require([module], callback);
require(['clock'],function(clock){
clock.start();
});
複製代碼
requireJs
就是AMD
規範的實現
CMD
CMD
(Common Module Definition), 是seajs
推崇的規範,CMD則是依賴就近,用的時候再require
。它寫起來是這樣的:
define(function(require, exports, module) {
var clock = require('clock');
clock.start();
});
複製代碼
AMD
和CMD
最大的區別是對依賴模塊的執行時機處理不一樣,而不是加載的時機或者方式不一樣,兩者皆爲異步加載模塊。
AMD
依賴前置,js能夠方便知道依賴模塊是誰,當即加載;而CMD
就近依賴,須要使用把模塊變爲字符串解析一遍才知道依賴了那些模塊
MVC:
MVP:
MVVM:
惟一的區別是, 它採用雙向數據綁定,(data-binding) : View 的變更。自動反映在 ViewModel, 反之亦然。 Angular 和 Ember 都採用這種模式
v-if 是銷燬刪除節點、而且渲染時不會渲染 v-show是顯示隱藏節點、至關於display:none