在網(wǎng)頁中,一個元素占有空間的大小由幾個部分構(gòu)成,其中包括元素的內(nèi)容(content),元素的內(nèi)邊距(padding),元素的邊框(border),元素的外邊距(margin)四個部分。這四個部分占有的空間中,有的部分可以顯示相應(yīng)的內(nèi)容,而有的部分只用來分隔相鄰的區(qū)域或區(qū)域。4個部分一起構(gòu)成了css中元素的盒模型。
行內(nèi)元素:a、b、span、img、input、strong、select、label、em、button、textarea
塊級元素:div、ul、li、dl、dt、dd、p、h1-h6、blockquote
空元素:即系沒有內(nèi)容的HTML元素,例如:br、meta、hr、link、input、img
一道經(jīng)典的問題,實現(xiàn)方法有很多種,以下是其中一種實現(xiàn):
HTML結(jié)構(gòu):
<div class="wrapper">
<div class="content"></div>
</div>
CSS:
.wrapper { position: relative; width: 500px; height: 500px; background-color: #ddd; } .content{ background-color:#6699FF; width:200px; height:200px; position: absolute; //父元素需要相對定位 top: 50%; left: 50%; margin-top:-100px ; //二分之一的height,width margin-left: -100px; }
href 是指向網(wǎng)絡(luò)資源所在位置,建立和當(dāng)前元素(錨點)或當(dāng)前文檔(鏈接)之間的鏈接,用于超鏈接。
src是指向外部資源的位置,指向的內(nèi)容將會嵌入到文檔中當(dāng)前標(biāo)簽所在位置;在請求src資源時會將其指向的資源下載并應(yīng)用到文檔內(nèi),例如js腳本,img圖片和frame等元素。當(dāng)瀏覽器解析到該元素時,會暫停其他資源的下載和處理,直到將該資源加載、編譯、執(zhí)行完畢,圖片和框架等元素也如此,類似于將所指向資源嵌入當(dāng)前標(biāo)簽內(nèi)。這也是為什么將js腳本放在底部而不是頭部。
一般來說是針對不同的瀏覽器寫不同的CSS,就是 CSS Hack。
IE瀏覽器Hack一般又分為三種,條件Hack、屬性級Hack、選擇符Hack(詳細參考CSS文檔:css文檔)。例如:
// 1、條件Hack <!--[if IE]> <style>
.test{color:red;} </style> <![endif]-->
// 2、屬性Hack
.test{ color:#090\9; /* For IE8+ */
*color:#f00; /* For IE7 and earlier */ _color:#ff0; /* For IE6 and earlier */
} // 3、選擇符Hack
* html .test{color:#090;} /* For IE6 and earlier */
* + html .test{color:#ff0;} /* For IE7 */
同步是阻塞模式,異步是非阻塞模式。
同步就是指一個進程在執(zhí)行某個請求的時候,若該請求需要一段時間才能返回信息,那么這個進程將會一直等待下去,直到收到返回信息才繼續(xù)執(zhí)行下去;
異步是指進程不需要一直等下去,而是繼續(xù)執(zhí)行下面的操作,不管其他進程的狀態(tài)。當(dāng)有消息返回時系統(tǒng)會通知進程進行處理,這樣可以提高執(zhí)行的效率。
px和em都是長度單位,區(qū)別是,px的值是固定的,指定是多少就是多少,計算比較容易。em得值不是固定的,并且em會繼承父級元素的字體大小。
瀏覽器的默認字體高都是16px。所以未經(jīng)調(diào)整的瀏覽器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em
漸進增強 progressive enhancement:
針對低版本瀏覽器進行構(gòu)建頁面,保證最基本的功能,然后再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優(yōu)雅降級 graceful degradation:
一開始就構(gòu)建完整的功能,然后再針對低版本瀏覽器進行兼容。
區(qū)別:
a. 優(yōu)雅降級是從復(fù)雜的現(xiàn)狀開始,并試圖減少用戶體驗的供給
b. 漸進增強則是從一個非常基礎(chǔ)的,能夠起作用的版本開始,并不斷擴充,以適應(yīng)未來環(huán)境的需要
c. 降級(功能衰減)意味著往回看;而漸進增強則意味著朝前看,同時保證其根基處于安全地帶
IE: trident內(nèi)核
Firefox:gecko內(nèi)核
Safari:webkit內(nèi)核
Opera:以前是presto內(nèi)核,Opera現(xiàn)已改用Google Chrome的Blink內(nèi)核
Chrome:Blink(基于webkit,Google與Opera Software共同開發(fā))
1)創(chuàng)建新節(jié)點
createDocumentFragment() //創(chuàng)建一個DOM片段
createElement() //創(chuàng)建一個具體的元素
createTextNode() //創(chuàng)建一個文本節(jié)點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過標(biāo)簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
/** * 對象克隆 * 支持基本數(shù)據(jù)類型及對象 * 遞歸方法 */function clone(obj) { var o; switch (typeof obj) { case "undefined": break; case "string":
o = obj + ""; break; case "number":
o = obj - 0; break; case "boolean":
o = obj; break; case "object": // object 分為兩種情況 對象(Object)或數(shù)組(Array)
if (obj === null) {
o = null; } else { if (Object.prototype.toString.call(obj).slice(8, -1) === "Array") {
o = []; for (var i = 0; i < obj.length; i++) { o.push(clone(obj[i])); } } else {
o = {}; for (var k in obj) {
o[k] = clone(obj[k]); } } } break; default:
o = obj; break; } return o;}
// 方法一:var arr1 =[1,2,2,2,3,3,3,4,5,6],
arr2 = [];for(var i = 0,len = arr1.length; i< len; i++){ if(arr2.indexOf(arr1[i]) < 0){ arr2.push(arr1[i]); }}document.write(arr2); // 1,2,3,4,5,6
偽數(shù)組(類數(shù)組):無法直接調(diào)用數(shù)組方法或期望length屬性有什么特殊的行為,但仍可以對真正數(shù)組遍歷方法來遍歷它們。典型的是函數(shù)的argument參數(shù),還有像調(diào)用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬于偽數(shù)組。可以使用Array.prototype.slice.call(fakeArray)將數(shù)組轉(zhuǎn)化為真正的Array對象。
function log(){ var args = Array.prototype.slice.call(arguments);
//為了使用unshift數(shù)組方法,將argument轉(zhuǎn)化為真正的數(shù)組
args.unshift('(app)');
console.log.apply(console, args);};
caller是返回一個對函數(shù)的引用,該函數(shù)調(diào)用了當(dāng)前函數(shù);
callee是返回正在被執(zhí)行的function函數(shù),也就是所指定的function對象的正文。
sessionStorage用于本地存儲一個會話(session)中的數(shù)據(jù),這些數(shù)據(jù)只有在同一個會話中的頁面才能訪問并且當(dāng)會話結(jié)束后數(shù)據(jù)也隨之銷毀。因此sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。而localStorage用于持久化的本地存儲,除非主動刪除數(shù)據(jù),否則數(shù)據(jù)是永遠不會過期的。
web storage和cookie的區(qū)別
Web Storage的概念和cookie相似,區(qū)別是它是為了更大容量存儲設(shè)計的。Cookie的大小是受限的,并且每次你請求一個新的頁面的時候Cookie都會被發(fā)送過去,這樣無形中浪費了帶寬,另外cookie還需要指定作用域,不可以跨域調(diào)用。
除此之外,Web Storage擁有setItem,getItem,removeItem,clear等方法,不像cookie需要前端開發(fā)者自己封裝setCookie,getCookie。但是Cookie也是不可以或缺的:Cookie的作用是與服務(wù)器進行交互,作為HTTP規(guī)范的一部分而存在 ,而Web Storage僅僅是為了在本地“存儲”數(shù)據(jù)而生。
var str = "aaaabbbccccddfgh";var obj = {};for(var i=0;i<str.length;i++){ var v = str.charAt(i); if(obj[v] && obj[v].value == v){
obj[v].count = ++ obj[v].count; }else{
obj[v] = {};
obj[v].count = 1;
obj[v].value = v; }}for(key in obj){ document.write(obj[key].value +'='+obj[key].count+' '); // a=4 b=3 c=4 d=2 f=1 g=1 h=1 }
基本流程:
a. 域名解析
b. 發(fā)起TCP的3次握手
c. 建立TCP連接后發(fā)起http請求
d. 服務(wù)器端響應(yīng)http請求,瀏覽器得到html代碼
e. 瀏覽器解析html代碼,并請求html代碼中的資源
f. 瀏覽器對頁面進行渲染呈現(xiàn)給用戶
關(guān)于快排算法的詳細說明,可以參考阮一峰老師的文章快速排序
"快速排序"的思想很簡單,整個排序過程只需要三步:
(1)在數(shù)據(jù)集之中,選擇一個元素作為"基準(zhǔn)"(pivot)。
(2)所有小于"基準(zhǔn)"的元素,都移到"基準(zhǔn)"的左邊;所有大于"基準(zhǔn)"的元素,都移到"基準(zhǔn)"的右邊。
(3)對"基準(zhǔn)"左邊和右邊的兩個子集,不斷重復(fù)第一步和第二步,直到所有子集只剩下一個元素為止。
參考代碼:
var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));};
二分法查找,也稱折半查找,是一種在有序數(shù)組中查找特定元素的搜索算法。查找過程可以分為以下步驟:
(1)首先,從有序數(shù)組的中間的元素開始搜索,如果該元素正好是目標(biāo)元素(即要查找的元素),則搜索過程結(jié)束,否則進行下一步。
(2)如果目標(biāo)元素大于或者小于中間元素,則在數(shù)組大于或小于中間元素的那一半?yún)^(qū)域查找,然后重復(fù)第一步的操作。
(3)如果某一步數(shù)組為空,則表示找不到目標(biāo)元素。
參考代碼:
// 非遞歸算法
function binary_search(arr, key) { var low = 0,
high = arr.length - 1; while(low <= high){ var mid = parseInt((high + low) / 2); if(key == arr[mid]){ return mid; }else if(key > arr[mid]){
low = mid + 1; }else if(key < arr[mid]){
high = mid -1; }else{ return -1; } } }; var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86]; var result = binary_search(arr,10); alert(result); // 9 返回目標(biāo)元素的索引值
// 遞歸算法
function binary_search(arr,low, high, key) { if (low > high){ return -1; } var mid = parseInt((high + low) / 2); if(arr[mid] == key){ return mid; }else if (arr[mid] > key){
high = mid - 1; return binary_search(arr, low, high, key); }else if (arr[mid] < key){
low = mid + 1; return binary_search(arr, low, high, key); } }; var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86]; var result = binary_search(arr, 0, 13, 10); alert(result); // 9 返回目標(biāo)元素的索引值
(1)XSS(Cross-Site Scripting,跨站腳本攻擊):指通過存在安全漏洞的Web網(wǎng)站注冊用戶的瀏覽器內(nèi)運行非法的HTML標(biāo)簽或者JavaScript進行的一種攻擊。
(2)SQL注入攻擊
(3)CSRF(Cross-Site Request Forgeries,跨站點請求偽造):指攻擊者通過設(shè)置好的陷阱,強制對已完成的認證用戶進行非預(yù)期的個人信息或設(shè)定信息等某些狀態(tài)更新。
function trim(str) { if (str && typeof str === "string") { return str.replace(/(^\s*)|(\s*)$/g,""); //去除前后空白符
}}
var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/; var email = "example@qq.com"; console.log(reg.test(email)); // true
a. 前端是最貼近用戶的程序員,前端的能力就是能讓產(chǎn)品從 90分進化到 100 分,甚至更好
b. 參與項目,快速高質(zhì)量完成實現(xiàn)效果圖,精確到1px;
c. 與團隊成員,UI設(shè)計,產(chǎn)品經(jīng)理的溝通;
d. 做好的頁面結(jié)構(gòu),頁面重構(gòu)和用戶體驗;
e. 處理hack,兼容、寫出優(yōu)美的代碼格式;
f. 針對服務(wù)器的優(yōu)化、擁抱最新前端技術(shù)。