各公司秋招很快就開始了,最近在準備面試的東西,乾脆將發現的各種面試題整理一下共享出來,大部分面試題是沒有標準答案的,我給出的答案也是僅供參考,若是有更好的解答歡迎在評論區留言。css
上一篇從常見數據結構算法、JavaScript兩個方面從面試的角度進行了整理,本文將對其他內容進行補充。html
常見內聯元素(行內元素)有a、b、span、i 、em、input、select 、img等html5
常見的塊元素有div、ul、li、h1~h六、talbe、ol、 ul、td、p等jquery
浮動佈局指將元素脫離普通流/文檔流,使其能夠左右移動,直至它的外邊緣遇到包含框或者另外一個浮動框的邊緣。浮動框不屬於文檔中的普通流,當一個元素浮動以後,不會影響到塊級元素的佈局而只會影響內聯元素的排列。web
正由於浮動元素脫離了文檔流,其父級元素並不知道它的存在,所以會表現爲高度爲0,不管浮動元素如何變化,其父級元素也不會隨它變化將其包裹,這種現象也叫做「高度塌陷」。面試
下面的例子中,無論#floatDom高度如何變化,#parent高度始終爲0,這將致使父元素邊框不能被撐開,背景不能顯示等問題ajax
<div id="parent"> <div id="floatDOM" style="float:left;width:300px;height:300px;"> </div>
由於高度塌陷的存在(這每每不是咱們所指望的),必需要清除浮動,下面介紹清除浮動的幾種方式:算法
<div id="parent"> <div id="floatDOM" style="float:left;width:300px;height:300px;"> <div style="clear:both"> </div>
也能夠添加br標籤,其自帶clear:both屬性json
<div id="parent"> <div id="floatDOM" style="float:left;width:300px;height:300px;"> <br/> </div>
利用這種方式清除浮動的優勢在於通俗易懂,容易掌握,缺點也很明顯,增長了不少無心義的標籤,這個在後期維護中是很痛苦的。跨域
<div id="parent" style="overflow:hidden"> <div id="floatDOM" style="float:left;width:300px;height:300px;"> </div>
利用這種方式不存在結構和語義化問題並且代碼量極少,然而在內容增多的時候容易形成不會自動換行致使內容被隱藏掉,沒法顯示須要溢出的元素。
<style type="text/css"> .clearfix:after {content:"."; display:block; height:0; visibility:hidden; clear:both; } .clearfix { *zoom:1; } </style> <div id="parent" class="clearfix"> <div id="floatDOM" style="float:left;width:300px;height:300px;"> </div>
利用這種方式,僅需在目標元素上添加一個類,也是目前使用最多的一種方式。
Reference
iyunlu.com/view/css-xht
相對佈局和絕對佈局最本質的區別在因而否脫離文檔流。
相對佈局未脫離文檔流,即設置元素相對佈局後,文檔流仍然保持其原始的位置,經過設置top、left等屬性可設置其相對於原始位置的偏移量。
絕對佈局是脫離文檔流的,即文檔流中的要素並不知道該絕對佈局要素的存在,絕對佈局的定位是相對於父元素中具備相對佈局或絕對佈局的要素,若都不存在則相對於body佈局。
盒模型定義了一個元素的顯示形式,包括content(內容)、padding(內邊距)、border(邊界)以及margin(外邊距)幾部分組成,目前有兩種盒模型標準,一種是W3C標準盒子模型,還有一種是IE盒子模型,採用的是Microsoft本身的標準。
這兩種盒模型的區別主要在於元素寬度的計算。標準模式下css中定義的width即爲content(內容)的寬度,整個元素在頁面中佔有的寬度,計算公式爲:
DOM_Width = width + padding + border + margin
而在IE盒子模型中,css中定義的width爲content + padding + border,所以在IE盒子模型中,整個元素在頁面中佔有的寬度爲(高度同理)
DOM_Width = width + margin
在CSS3中利用box-sizing
保留了兩種盒子模型,當咱們設置box-sizing: content-box
(默認),採用的是W3C標準盒模型,當設置box-sizing:border-box
時,採用的是IE盒模型。
每一個瀏覽器都有一些自帶的樣式,並且各個瀏覽器這些自帶的樣式每每又存在不一樣,這給咱們佈局上帶來了一些不便。所以在實踐中每每須要對瀏覽器的css樣式進行「清零」,即CSS reset。最簡單的一種reset代碼以下:
*{ margin:0; padding:0; }
這種方式雖然簡單但太過「暴力」,由於不少要素像div、li等自己默認就沒有margin、padding樣式,這無異於形成大量冗餘,更推薦的方式根據本身須要編寫reset代碼。
Reference:
www.zhangxinxu.com/wordpress/2010/08/html5-css-reset
因爲不一樣的瀏覽器對CSS的解析和支持是不一樣的,這會致使相同的CSS代碼在不一樣瀏覽器中的顯示方式並非徹底一致的,這就須要經過CSS Hack來解決不一樣瀏覽器的兼容性問題。針對不一樣瀏覽器寫不一樣的樣式的這個過程就稱爲CSS hack。
CSS Hack常見的形式有以下幾種:
好比IE6能識別_width
以及*width
,而在IE7中能識別*width
,可是不能識別_width
,在FireFox中兩個都不識別。
好比IE6能識別*html .class{}
,IE7能識別*+html .class{}
或者*:first-child+html .class{}
。
IE條件註釋是微軟從IE5開始就提供的一種非標準邏輯語句。好比針對全部IE:
<!–[if IE]> <!–Your Code–> <![endif]–>
針對IE6及如下版本:
<!–[if lt IE 7]> <!–Your Code–> <![endif]–>
這類Hack不只對CSS生效,對寫在判斷語句裏面的全部代碼都會生效。
Reference
www.3lian.com/edu/2014/10-10/171039.html
漸進加強指針對低版本瀏覽器進行構建頁面,保證最基本的功能,而後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優雅降級指一開始就構建完整的功能,而後再針對低版本瀏覽器進行兼容。
二者的區別在於優雅降級是從複雜的現狀開始,並試圖減小用戶體驗的供給,而漸進加強則是從一個很是基礎的,可以起做用的版本開始,並不斷擴充,以適應將來環境的須要。降級(功能衰減)意味着往回看;而漸進加強則意味着朝前看,同時保證其根基處於安全地帶。
利用CSS Reset(參見第5條)
將其該塊級元素display設置爲inline
min-height的做用是做用是當容器的內容較少時,能保持一個最小的高度,以避免破壞了佈局或UI設計效果。而當容器內的內容增長的時候,容器可以自動的伸展以適應內容的變化。
經過這種下面的方式能夠解決:
#targetDom{ background:#ccc; min-height:100px; height:auto!important; height:100px; overflow:visible; }
addEventListener
,而IE使用的是attachEvent
經過條件判斷分別寫兩條綁定語句或者使用jquery這類web框架庫綁定。
後來標準認爲冒泡更合理,利用設置addEventListener第三個參數兼容兩種機制,事件冒泡爲默認值。
標準瀏覽器是做爲參數帶入,而ie是window.event方式得到,得到目標元素ie爲e.srcElement 標準瀏覽器爲e.target
200 OK 一切正常,對GET和POST請求的應答文檔跟在後面。
201 Created服務器已經建立了文檔,Location頭給出了它的URL。
202 Accepted 已經接受請求,但處理還沒有完成。
304 Not Modified 客戶端有緩衝的文檔併發出了一個條件性的請求(通常是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告 訴客戶,原來緩衝的文檔還能夠繼續使用。
400 Bad Request 請求出現語法錯誤。
404 Not Found 沒法找到指定位置的資源。這也是一個經常使用的應答。
405 Method Not Allowed 請求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)對指定的資源不適用。(HTTP 1.1新)
500 Internal Server Error 服務器遇到了意料不到的狀況,不能完成客戶的請求。
502 Bad Gateway 服務器做爲網關或者代理時,爲了完成請求訪問下一個服務器,但該服務器返回了非法的應答。
//在IE5和IE6中模擬XMLHttpRequest方法 if(window.XMLHttpRequest === undefined){ window.XMLHttpRequest = function(){ try{ return new ActiveXObject("Msxml2.XMLHttp.6.0"); //可用,使用最新ActiveX對象 } catch(e1){ try{ return new ActiveXObject("Msxml2.XMLHttp.3.0");//不可用,退後更早的版本 } catch(e2){ throw new Error("XMLHttpRequest is not supported"); } } } } //get請求 function xhrGet(url,callback){ var request = new XMLHttpRequest(); request.open('GET',url,true); request.onreadystatechange = function(){ if(request.readyState === 4 && request.status == 200){ callback&&callback(request.responseText); } }; request.send(null); } //post請求 function xhrPost(url,data,callback){ var request = new XMLHttpRequest(); request.open('POST',url,true); request.setRequestHeader('Content-Type','application/json'); request.onreadystatechange = function(){ if(request.readyState === 4 && request.status == 200){ callback&&callback(request); } }; request.send(JSON.stringfy(data)); }
這是XMLHttpRequest傳統的用法,XMLHttpRequest Level 2提出了不少新的方法,咱們常提到的CORS也是源自該方法。
要了解詳細XHR2推薦 XMLHttpRequest Level 2 使用指南
當咱們在頁面中經過ajax請求其它服務器的數據時,因爲瀏覽器對於JavaScript的同源策略,客戶端就會發生跨域問題。所謂同源策略,指的是一段腳本只能請求來自相同來源(相同域名、端口號、協議)的資源。
若是上面XMLHttpRequest請求的服務地址與當前文件不一樣源的話,瀏覽器中會出現以下錯誤:
那麼該如何解決這類跨域問題?
(1)利用CORS跨域
"跨域資源共享"(Cross-origin resource sharing,簡稱CORS)。CORS是是在XHR2中拓展的能力,使用方法很簡單,在服務端設置:
Header set Access-Control-Allow-Origin *
這種設置將接受全部域名的跨域請求,也能夠指定具體網址,也能夠對域名進行限定:
Header set Access-Control-Allow-Origin http://www.test.com
然而,這種方式的侷限性在於要求客戶端支持,而且服務端進行相關設置。在這二者知足的狀況下,經過CORS進行跨域不只支持全部類型的HTTP請求,並且開發者可使用普通的XMLHttpRequest發起請求和得到數據,比起JSONP有更好的錯誤處理。
(2)利用JSONP實現跨越
對於較老的瀏覽器,它們每每不支持CORS,所以使用JSONP進行跨域也是很常見的一種方式。
咱們知道在網頁中經過<script>
元素的src指定加載目標腳本時是不受同源策略的影響的,所以可使用它們從其餘服務器請求數據,這種利用<script>
元素做爲Ajax傳輸的技術就稱爲JSONP。
JSONP實現的原理以下:
function getJSONP(url, callback){ var funcName = getUniqueName();//利用時間戳或指自增計數器得到惟一函數名 url += "?callback=" + funcName; //將函數名做爲參數添加至url中 var script = document.createElement('script');//動態構建script標籤 //回調函數 getJSONP[funcName] = function(response){ try{ callback(response); //處理響應數據 } finally{ //即便回調函數或響應拋出錯誤,清除動態增長內容 delete getJSONP[funcName]; script.parentNode.removeChild(scirpt); } } //觸發HTTP請求 script.src = url; document.body.appendChild(script); }
JSONP也存在一些弊端,首先JSONP支持GET不支持POST方法,另外使用<script>
元素進行Ajax請求,這意味着容許Web頁面能夠執行遠程服務器發送過來的任何JavaScript代碼,所以對於不信任的服務器,不該該採用該技術。
(3)利用window.name進行跨域
window對象有個name屬性,該屬性有個特徵:即在一個窗口(window)的生命週期內,窗口載入的全部的頁面都是共享一個window.name的,每一個頁面對window.name都有讀寫的權限,window.name是持久存在一個窗口載入過的全部頁面中的,並不會因新頁面的載入而進行重置,所以能夠藉助window.name在不一樣源的頁面中傳遞數據。
如www.a.com/a.html想要得到www.b.com/b.html中的數據,原理以下:
a) 在b.html中將數據存儲在window.name中
b) 在a.html中構建一個隱藏(display:none)的iframe標籤,假設id設爲proxy,src設置爲和a.html同源便可。
c) 經過以下代碼在a.html中獲取到data
var proxy = document.getElementById('proxy'); proxy.onload = function(){ var data = proxy.contentWindow.name;//獲取到數據 }
d) 移除相關元素
(4) 使用window.postMessage進行跨域
這種方式比較簡單,在a頁面中利用windowObj.postMessage(message, targetOrigin)向目標頁面發送信息,而在b頁面中經過監聽message事件獲取信息。這種方式是在HTML5中新增的方法,對於IE六、IE7等老版本瀏覽器沒法使用。
請參看博主的另外兩篇文章:
發現新內容會持續更新...
博文做者:vicfeel
博文出處:http://www.cnblogs.com/vicfeel 本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做! 若是閱讀了本文章,以爲有幫助,您能夠爲個人博文點擊「推薦一下」!