<div>
<section class="a1">a1</section>
<section class="a2">a2</section>
<section class="a3">a3</section>
<section class="a4">a4</section>
<section class="a5">a5</section>
</div>
div {
width: 180px;
height: 50px;
}
section {
float: left;
}
.a1 {
width: 50px;
height: 50px;
background-color: tan;
}
.a2 {
float: right;
width: 50px;
height: 50px;
background-color: tan;
}
.a3 {
width: 80px;
height: 25px;
background-color: red;
}
.a4 {
width: 40px;
height: 25px;
background-color: #ddd;
}
.a5 {
width: 40px;
height: 25px;
background-color: #666;
}
複製代碼
div {
width: 180px;
height: 50px;
position: relative;
}
.a1 {
position: absolute;
width: 50px;
height: 50px;
background-color: red;
}
.a2 {
position: absolute;
left: 50px;
width: 80px;
height: 25px;
background-color: blue;
}
.a3 {
position: absolute;
left: 50px;
top: 25px;
width: 40px;
height: 25px;
background-color: green;
}
.a4 {
position: absolute;
left: 90px;
top: 25px;
width: 40px;
height: 25px;
background-color: tan;
}
.a5 {
position: absolute;
width: 50px;
height: 50px;
left: 130px;
background-color: red;
}
複製代碼
div {
width: 180px;
height: 50px;
display: flex;
flex-flow: column wrap;
align-content: flex-start;
}
.a1 {
width: 50px;
height: 50px;
background-color: red;
}
.a2 {
width: 80px;
height: 25px;
background-color: tan;
}
.a3 {
flex-grow: 1;
background-color: aqua;
}
.a4 {
width: 25px;
height: 50px;
background-color: #fff;
}
.a5 {
flex-grow: 1;
background-color: red;
}
複製代碼
div {
width: 180px;
height: 50px;
display: flex;
background-color: tan;
}
section {
flex: auto;
}
.a1 {
background-color: #fff;
}
.a2 {
background-color: #444;
}
.a3 {
background-color: red;
}
複製代碼
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
複製代碼
div {
width: 100px;
height: 100px;
position: relative;
background-color: tan;
display: table-cell;
vertical-align: middle;
text-align: center;
}
span {
background-color: red;
}
複製代碼
div {
width: 100px;
height: 100px;
position: relative;
background-color: tan;
}
section {
width: 50px;
height: 50px;
display: inline-block;
margin: 25px;
background-color: red;
}
複製代碼
div {
width: 100px;
height: 100px;
position: relative;
background-color: tan;
}
section {
width: 50px;
height: 50px;
margin: 25px;
float: left;
background-color: red;
}
複製代碼
div {
width: 100px;
height: 100px;
background-color: tan;
text-align: center;
line-height: 100px;
}
span{
background-color: #fff;
vertical-align: middle;
}
複製代碼
margin-box, border-box, padding-box, content-box
首先是最內層content-box,用來顯示元素信息
向外是padding-box,主要用於設置元素四個方向的內邊距,
再向外是border-box,用於設置元素四個方向的邊框樣式,
最外層是margin-box,爲了讓元素與其餘元素隔開,對於垂直方向上的BFC元素的margin會發生合併,去較大的值
padding-box和margin-box是透明的,padding-box會受元素的背景的影響,能夠經過box-sizing設置
padding-box和border-box不能去負值,margin-box能夠取負值
還有元素的溢出屬性,處理空白空間及文本溢出
* css中每一個元素都看做多個盒子的組合,咱們能夠經過設置這些盒子的屬性來改變元素的樣式
* 若是設置 box-sizing 爲 content-box,那麼寬度就是內容區的寬度
* 若是設置爲 border-box,那麼寬度就死活內容區寬度+padding+border
複製代碼
text-overflow:ellipsis; white-space:nowrap; overflow:hidden;javascript
浮動,絕對定位,overflow不爲visible,非塊級盒子塊級容器
觸發:
1. float 除了none之外的值
 2. overflow 除了visible 之外的值(hidden,auto,scroll )
 3. display (table-cell,table-caption,inline-block, flex, inline-flex)
 4. position值爲(absolute,fixed)
特性:
在BFC中,盒子從頂端開始垂直地一個接一個地排列。
盒子垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰盒子垂直方向的margin會發生重疊。
在BFC中,每個盒子的左外邊距(margin-left)會觸碰到容器的左外邊緣(border-left)。
BFC不會與浮動盒子產生交集,而是緊貼浮動元素邊緣。
計算BFC高度BFC時,天然也會檢測浮動的子盒子高度。
應用:
自適應兩欄佈局
解決margin疊加問題:下面元素添加父元素:overflow: hidden;
清除浮動,計算BFC高度
複製代碼
只要協議、主機、端口不一致,就會有跨域的問題css
function jsonp(url, value, cb) {
let cbName = 'JSONP_CALLBACK_' + Date.now() + '_' + Math.random().toString().slice(2)
window[cbName] = cb
url = url + '?q=' + value + '&callback=' + cbName
let script = document.createElement('script')
script.src = url
script.onload = () => {
document.body.removeChild(script)
delete window[cbName]
}
document.body.appendChild(script)
}
function ajax(url = '', data = {}, type = 'GET') {
if (type === "GET") {
let urlStr = ""
Object.keys(data).forEach(key => {
urlStr += key + '=' + data[key] + '&'
})
if (urlStr) {
urlStr = urlStr.substring(0, urlStr.length - 1)
url += '?' + urlStr
}
return axios.get(url)
} else if (type === "POST") {
return axios.post(url, data)
}
}
複製代碼
Less的變量名使用@符號開始 Sass的變量是必須$開始html
聲明:@mixin a($borderWidth:2px){}
調用:@include error();
複製代碼
聲明:.error(@borderWidth:2px){}
調用:.error();
複製代碼
@extend .block; /*繼承.block選擇器下全部樣式*/
複製代碼
.block;/*繼承.block選擇器下全部樣式*/
複製代碼
客戶端發送一個HTTP請求到服務器的請求消息包括如下格式:
請求行(request line)、請求頭部(header)、請求體組成
請求行:
方法:
GET 獲取資源
POST 向服務器端發送數據,傳輸實體主體
PUT 傳輸文件
HEAD 獲取報文首部
DELETE 刪除文件
OPTIONS 詢問支持的方法
TRACE 追蹤路徑
URL
協議/版本號
請求頭:
通用首部(General Header)
請求首部(Request Header)
響應首部(Response Header)
實體首部(Entity Header Fields)
請求體
複製代碼
HTTP響應組成:響應行、響應頭、響應體。
響應行
(HTTP/1.1)代表HTTP版本爲1.1版本,狀態碼爲200,狀態消息爲(ok)
響應頭
Date:生成響應的日期和時間;
Content-Type:指定了MIME類型的HTML(text/html),編碼類型是ISO-8859-1
響應體
複製代碼
首先Websocket是基於HTTP協議的,或者說借用了HTTP的協議來完成一部分握手。
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
複製代碼
http long poll 和 ajax 輪詢均可以實現實時信息傳遞前端
特色:java
socket.io 是一個能實現多人遠程實時通訊(聊天)的庫 它包裝的是 H5, WebSocket和輪詢, 若是是較新的瀏覽器內部使用 WebSocket,若是瀏覽器不支持, 那內部就會使用輪詢實現實時通訊react
1 輸入網址 2 發送到DNS服務器,並獲取域名對應的web服務器對應的ip地址 3 與web服務器創建TCP鏈接 4 瀏覽器向web服務器發送http請求 5 web服務器響應請求,並返回指定url的數據(或錯誤信息,或重定向的新的url地址) 6 瀏覽器下載web服務器返回的數據及解析html源文件 7 生成DOM樹,解析css和js,渲染頁面,直至顯示完成webpack
// reduce
function reduce(ary, f, initVal) {
var start = 0
if (arguments.length == 2) {
initVal = ary[0]
start = 1
}
for (var i = start; i < ary.length; i++) {
initVal = f(initVal, ary[i], i, ary)
}
return initVal
}
// flattenDeep
function flattenDeep(ary) {
return [].concat(...ary.map(val => {
if (Array.isArray(val)) {
return flattenDeep(val)
} else {
return val
}
}))
}
複製代碼
123${a}456
,\var imgs = document.querySelectorAll('img');
//offsetTop是元素與offsetParent的距離,循環獲取直到頁面頂部
function getTop(e) {
var T = e.offsetTop;
while(e = e.offsetParent) {
T += e.offsetTop;
}
return T;
}
function lazyLoad(imgs) {
var H = document.documentElement.clientHeight;//獲取可視區域高度
var S = document.documentElement.scrollTop || document.body.scrollTop;
for (var i = 0; i < imgs.length; i++) {
if (H + S > getTop(imgs[i])) {
imgs[i].src = imgs[i].getAttribute('data-src');
}
}
}
window.onload = window.onscroll = function () { //onscroll()在滾動條滾動的時候觸發
lazyLoad(imgs);
}
複製代碼
Cookie 能夠保持登陸信息到用戶下次與服務器的會話,換句話說,下次訪問同一網站時,用戶會發現沒必要輸入用戶名和密碼就已經登陸了(固然,不排除用戶手工刪除Cookie),Cookie知足同源策略 Cookie 在生成時就會被指定一個Expire值,這就是Cookie的生存週期,在這個週期內Cookie有效,超出週期Cookie就會被清除。有些頁面將Cookie的生存週期設置爲「0」或負值,這樣在關閉瀏覽器時,就立刻清除Cookie,不會記錄用戶信息,更加安全。ios
因爲HTTP協議是無狀態的協議,因此服務端須要記錄用戶的狀態時,就須要用某種機制來識具體的用戶,這個機制就是Session.典型的場景好比購物車,當你點擊下單按鈕時,因爲HTTP協議無狀態,因此並不知道是哪一個用戶操做的,因此服務端要爲特定的用戶建立了特定的Session,用用於標識這個用戶,而且跟蹤用戶,這樣才知道購物車裏面有幾本書。這個Session是保存在服務端的,有一個惟一標識。web
Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據能夠保存在集羣、數據庫、文件中; Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。ajax
第一步確認宏任務,微任務
宏任務:script,setTimeout,setImmediate,promise中的executor
微任務:promise.then,process.nextTick
process.nextTick優先級高於Promise.then
timers: setTimeout / setInterval
I/O callbacks: 不在其餘階段的全部回調函數
poll: 獲取新的I/O事件
check:執行setImmediate
close callback: 執行關閉事件的回調函數
在整個輪詢的開始執行process.nextTick
而後再執行setTimeOut、setInterval
再執行其餘的回調函數
最後執行setImmediate
複製代碼
axios / fetch
複製代碼
Node核心思想:1.非阻塞;  2.單線程;  3.事件驅動。
Node 是一個服務器端 JavaScript 解釋器
當線程遇到IO操做的時候,不會以阻塞的方式等待IO操做完成或者數據的返回,而是將IO操做發送給操做系統,
而後接着執行下一個操做,當操做系統執行完IO操做以後,以事件的方式通知執行IO的線程,
線程會在特定的時候執行這個事件。這一切的前提條件就是,系統須要一個事件循環,
以不斷的去查詢有沒有未處理的事件,而後給預處理。
複製代碼
redux 是一個獨立的專門用於狀態管理的js庫
能夠管理react應用中多個組件共享的狀態
用redux對組件的狀態進行集中式管理
組件:兩個方面
展示數據 狀態顯示
與用戶交互更新數據 更新狀態
redux核心是一個store(倉庫)
組件直接從store中讀取狀態
更新狀態:
1. Action Creators ==>> dispatch(action) :傳兩個值(type和data) type是傳的類型(刪除,增長,建立,更新)
2. store
3. Reducers ==>> 接受(previousState, action) 返回(newState)
4. React Component
createStore()
store: 管理state, reducer
方法: getState() , dispatch(action) , subscribe(listener)
action對象
reducer返回的是新的狀態
applyMiddleware 中間件
thunk 異步
複製代碼
function connect(mapStateToProps,mapDispatchToProps){
return function(com){
return class extends React.Component{
render(){
return (
<Consumer> {store=>{ state = mapStateToProps(store.getState()) dispatch = mapDispatchToProps(store.dispatch) return <Comp {...state}{...dispatch}></Comp> }} </Consumer>
) }
}
}
}
複製代碼
由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。 其中ACK報文是用來應答的,SYN報文是用來同步的。 可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET, 因此只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。 只有等到我Server端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。
action: 是store惟一的信息來源,把action發送給store必須經過store的dispatch方法。
每一個action必須有一個type屬性描述action的類型。
複製代碼
當系統面臨大量用戶訪問,負載太高的時候,一般會使用增長服務器數量來進行橫向擴展,使用集羣和負載均衡提升整個系統的處理能力
1. 原型鏈繼承
將父類的實例做爲子類的原型
function Cat() {}
Cat.prototype = new Animal()
Cat.prototype.name = 'cat'
var cat = new Cat()
2. 構造繼承
使用父類的構造函數來加強子類的實例,等因而複製父類的實例屬性給子類
function Cat(name) {
Animal.call(this)
instance.name = name || 'Tom'
}
var cat = new Cat()
3. 實例繼承
爲父類實例添加新特性,做爲子類的實例返回
function Cat(name) {
var instance = new Animal()
instance.name = name || 'Tom'
return instance
}
var cat = new Cat()
複製代碼