首页 > 代码库 > 前端重点整理集合
前端重点整理集合
一、XHTML+CSS重点
一、各浏览器兼容问题和解决方法
1、3px的Bug:ie6下一个容器的浮动和文字之间会产生3px的间距,
解决方法:给浮动的盒子添加一个margin-right:-3px;(与浮动方向反方向)。
2、浮动双边距Bug:当一个盒子像左浮动的同时有一个向左的margin-left的时候,IE6解析这段代码时就会把margin-left解析为原来的2倍,这个就是所谓的浮动双边距BUG。
解决方法:浮动盒子添加属性display:inline;将浮动盒子属性改为内联,或单使用“_”来处理ie6
3、IE6下多出来的文字:产生的原因,是两个设置了float的元素之间加了个注释
解决方法:删除注释
二、布局有哪些方式
1、三列布局中间列自适应
2、让div元素上下左右居中
3、两列布局左固定右自适应,或右固定左列自适应布局
4、两个列的高度相同,根据内容自适应
三、样式的优化级
1、#:id
2、.:类选择器
3、div:标签选择器
4、h1 + p:相邻选择器
5、div < p:子选择器
6、div < li:后代选择器
7、*:通配符
8、input[type=“text”]:属性选择器
9、a:hover:伪类选择器
四、css hack
1、_ :用于IE6
2、*和+:用于IE6,IE7
3、\0:用于IE8,IE9
4、\9:用于 IE6,IE7,IE8,IE9
5、\9\0:用于IE9
6、!important:改变样式的优先级不能算做是hack了,不推荐使用
五、haslayout
IE浏览器下的很多bug都是haslayout = false 引起的:
1.文字消失,截断 2.边框消失 3.3像素偏差 4.绝对元素定位错误 5.滤镜不生效 6.滚动页面跳动 7其他(欢迎补充哦~)
使用css来触发haslayout,触发后haslayout=true;
触发方法:
1、position:absolute
2、float:left/right
3、display:inline-block
4、width,height:除“auto”外的任意值
5、zoom:除"normal"外 ...
六、DOCTYPE的各种模式详解
标准和怪异模式
将HTML中的DOCTYPE声明去掉就可以引发怪异模式,
IE下的怪异模式width是padding和border加到一起,而标准模式不会
二、HTML5重点
一、新增标签:
二、canvas功能:
三、本地存储:
存储5MB,分为localStorage永久和sessionStorage临时存储
存储:LocalStorage.setItem(key, val);
获取:localStorage.getItem(key);
全部清除:localStorage.clear();
四、离线存储:
就是将要缓存的文件存储在manifest文件中,cache下存储要缓存的文件,在<html lang="en" manifest=‘test.manifest‘>引用manifest文件,还需要在服务器端修改配置文件
五、 跨文档消息:
六、多线程webworks:
1 var oBox = document.getElementById("box"); 2 // 创建个多线程 3 var oWorks = new Worker("test.js"); 4 oWorks.postMessage(10000); // 向线程发消息 5 oWorks.onmessage = function(event){ // 接收消息事件 6 oBox.innerHTML = event.data; 7 } 8 9 test.js10 onmessage = function(event){11 var num = event.data;12 var result = 0;13 for(var i=0; i<num; i++){14 result += i;15 }16 17 // 向线程创建源送回消息18 postMessage(result);19 }
七、获取地理位置:
八、webSocket:
九、video和audio:
三、CSS3重点
四、JavaScript重点
一、DOM文档对象模型
二、函数
1、函数声明和函数表达式
函数声明:function test(){ … }
函数表达式:function test(函数名可写可不写)(){ … },如果不写名为匿名函数表达式
将匿名函数表达式赋给变量:
var oTest = function(){ … }
(function(w){ … })(winow);
2、递归
函数调用函数自身这个过程叫递的动作,在最后一次在判断中止条件,可以执行归的动作
1 function test(n){2 if(n==1){3 console.trace();4 return 1;5 }6 return n * test(n-1)7 }8 test(5); // 1*2*3*4*5
3、拉圾回收机制:
在执行完函数后,内部变量将会从内存中自动删除,除闭包外,因为闭包的一个函数还引用着外层函数的变量。
闭包:函数嵌套函数,内部函数调用外部函数的变量,导致拉圾回收机制不能回收,变量一直存在内存中,IE下容易内存泄露。
闭包的好处:1、希望一个变量长期的在内存中 2、避免全局变量的污染
1 function fn1(){ 2 var a1 = 5; 3 function fn2(){ 4 alert(a1); 5 } 6 return fn2; 7 } 8 var temp = fn1(); 9 temp();10 // 这个闭包会导致内存泄露,无论跳转到哪个页面oBox都存在,导致内存不断累加,cpu负载加重11 window.onload = function(){12 var oBox = document.getElementById("box");13 oBox.onclick = function(){14 oBox.innerHTML = "aaa";15 }16 17 // 解决方法,离开页面时将对象释放18 window.onunload = function(){19 oBox = null;20 }21 }
三、事件
1、 事件类型:
2、 事件捕获和冒泡:
3、 事件源:不管在哪个事件中,只要你操作的那个元素就是事件源
1 oUl.onmouseover = function(event){2 var ev = event || window.event;3 var target = ev.target || ev.srcElement; // 获取到事件源4 console.log(target.innerHTML);5 }
4、 事件委托:利用冒泡原理,把事件加到父级上,触发执行元素
好处:1、提高性能 2、新添加的元素也会有事件,因为事件是在父级上jquery里的live和delegate()事件都是通过事件委托原理
1 var oBox = getId("box1"); 2 oBox.onmouseover = function(event){ 3 var evt = event || window.event; 4 var target = evt.target || evt.srcElement; 5 // 判断一下处理的标签是否正确 6 if(target.tagName.toLowerCase() == "li"){ 7 target.style.backgroundColor = "#ffff00"; 8 } 9 }10 oBox.onmouseout= function(event){11 var evt = event || window.event;12 var target = evt.target || evt.srcElement;13 if(target.tagName. toLowerCase() == "li"){14 target.style.backgroundColor = "#fff";15 }16 }
四、对象
1、对象引用:
1 // 变量的赋值关系 2 var a = 10; 3 var b = a; 4 b += 10; 5 alert(b); // 20 6 alert(a); // 10 7 8 // 对象的引用 9 var a = [1, 2, 3];10 var b = a;11 b.push(4);12 alert(b); // 1,2,3,413 alert(a); // 1,2,3,414 15 var a = [1, 2, 3];16 var b = a;17 b = [1,2,3,4]; // 这块相当于b又创建了一个对象,而不是引用a18 alert(b); // 1,2,3,419 alert(a); // 1,2,3
2、克隆对象但不引用对象
1 // 如果这种方法克隆对象,改变obj2的时候obj属性也会改变 2 /* 3 var obj2 = obj; 4 obj2.test = 20; 5 6 alert("obj:" + obj.test); // 20 7 alert("obj2:" + obj2.test); // 20 8 */ 9 10 // 克隆方法,不改变obj,将每个键和值复制过去而不是对象11 function extend(o){12 var oObj = {};13 for(var key in o){14 console.log(o[key]);15 oObj[key] = o[key];16 }17 return oObj;18 }19 var obj2 = extend(obj);20 obj2.test = 20;21 alert("obj:" + obj.test); // 1022 alert("obj2:" + obj2.test); // 20
3、js、jquery将字符串和对象的互转
五、跨域请求
存在跨域和不存在跨域的问题:
1、 同域下和同域不同文件夹下,不存在跨域
2、 子域存在跨域
3、 不同域也是存在跨域问题
解决跨域的方法:
1、 子域了主域之间
方法1:将主域和子域都设置document.domain = “www.365.com”;
方法2:使用script标签的src,也就是jsonp的形式Jsonp=json+padding()
方法3:通过loaction.hash值
方法4:通过iframe、
方法5:window.name
方法6:flash
方法7:HTML5 postMessage
Jsonp:请求服务器端文件,服务器将函数和返回的值都打印到页面中,showBox来调用这个方法
1 <script>2 function showBox(json){3 console.log(json.data);4 }5 </script>6 <script src=http://www.mamicode.com/"jsonp.php?callback=showBox"></script>
六、操作iframe:
1、通过ifr.contentWindow来获取iframe的window对象,都兼容,但在chrome下需要有服务器环境才可以,chrome安全沙箱的原因
2、通过ifr.conentDocument来获取iframe的document对象,但ie6、7都不支持
例:父页面操作iframe页面
1 var oIfr = document.getElementById("ifr");2 var oBtn = document.getElementById("btn");3 oBtn.onclick = function(){4 var docIfr = oIfr.contentWindow.document.getElementById("listNum");5 docIfr.style.backgroundColor = "#ff0000";6 }
例:iframe页面操作父页面
通过window.parent(),返回的是父页面的window对象
1 var oSelectBtn = document.getElementById("selectBtn");2 selectBtn.onclick = function(){3 var parentIfr = window.parent.document.getElementById("ifr");4 parentIfr.style.width = "500px";5 parentIfr.style.height = "300px";6 }
通过window.top为找到最顶层,例如:index页面嵌套一个iframe为demo1.html,demo1中又嵌套一个iframe为demo2,这样如果在demo2中使用window.parent,其实找到的demo1这个页面,如果使用window.top就可以直接找到index.html这个页面
3、iframe的onload事件
1 window.onload = function(){ 2 var oIfr = document.getElementById("ifr"); 3 oIfr.src = http://www.mamicode.com/"index.html"; 4 addEvent(oIfr, "load", function(){ 5 alert("aa"); 6 }) 7 8 function addEvent(obj, type, fn){ 9 if(obj.addEventListener){10 obj.addEventListener(type, fn, true);11 }12 else{13 obj.attachEvent("on"+type, fn);14 }15 }16 }
七、正则表达式
1、 test()、search()、replace()、Match():
str.test(reg):返回一个布尔值,如果查找到返回true,否则返回false
str.search(reg):查找匹配的位置,如果没有找到返回-1
str.replace(reg, str1):匹配字符并替换
str.match(reg):若匹配不到返回null,否则返回数组
四、jQuery重点
五、javascript性能重点
一、js性能:
1、 尽可能减少Javascript与DOM的操作
1 var str = ""2 var oBox = $("#box");3 for(var i= 0,len=5000; i<len; i++){4 str += "s";5 }6 oBox.html(str);
2、 使用innerHTML要比appendChild要快
1 /* webkit内核:DOM的innerHTML性能要好 */ 2 var str = "" 3 var oBox = document.getElementById("box"); 4 for(var i= 0,len=5000; i<len; i++){ 5 str += "<li>"+ i +"</li>"; 6 } 7 oBox.innerHTML = str; 8 9 var str = ""10 var oBox = document.getElementById("box");11 for(var i= 0,len=5000; i<len; i++){12 var oLi = document.createElement("li");13 oBox.appendChild(oLi);14 }15 oBox.innerHTML = str;
3、 可以减少DOM操作的几个方法
1 // 第一种方法:cloneNode克隆节点 2 var oBox = document.getElementById("box"); 3 var oLi = document.createElement("li"); 4 oLi.innerHTML = "aa"; 5 6 console.time("a"); 7 for(var i= 0,len=5000; i<len; i++){ 8 var oCreateLi = oLi.cloneNode(true); 9 oBox.appendChild(oLi);10 }11 console.timeEnd("a");12 13 // 第二种方法:访问元素集合,尽量使用局部变量14 // 获取两个节点,但都使用了document对象15 var obox = document.getElementById("box");16 var oLis = document.getElementsByTagName("li");17 18 // 可以改成19 var oDoc = document;20 var obox = oDoc.getElementById("box");21 var oLis = obox.getElementsByTagName("li");
4、DOM与浏览器的优化
重排:改变页面的内容,当js改变了页面一个元素的位置、宽、高,这个过程叫重排。
重绘:浏览器显示的内容,当执行完重排后浏览器会把内容显示出来,这个过程叫重绘,重排和重绘都会消耗浏览器的性能。
如果比如改变元素的背景颜色文字颜色,这样只触发了重绘的过程不会进行操作重排
减少重排、重绘的几个方法:
1、 尽量在appendChild之前添加操作
1 var oBox = document.getElementById("box"); 2 var oLi = document.createElement("li"); 3 oLi.innerHTML = "aa"; 4 console.time("a"); 5 for(var i= 0,len=5000; i<len; i++){ 6 var oLi = document.createElement("li"); 7 oLi.innerHTML = "哈哈"; 8 9 // 如果将innerHTML放到appendChild下执行就会先执行重排在执行重绘10 // 如果放到appendChild之前执行,只执行重排,不会执行重绘11 oBox.appendChild(oLi);12 }13 console.timeEnd("a");
2、文档碎片
1 var oBox = document.getElementById("box");2 var oFrg = document.createDocumentFragment(); // 创建一个文档碎片3 for(var i= 0,len=5000; i<len; i++){4 var oLi = document.createElement("li");5 oFrg.appendChild(oLi); // 将创建的元素都放到文档碎片中,相当于放到这个袋子中6 }7 oBox.appendChild(oFrg); // 最后插入的只是袋子
六、前端新技术性能重点
一、css预处理less和sass
二、sea.js
用于模块化,对项目模块间依赖关系较强的处理比较好
三、nodejs
服务器端的js,可以处理线程,scoket、并发和数据库的操作
四、前端自动构建工具Grunt
五、新技术
1、懒加载lazyload
2、预加载
七、移动端重点
八、算法重点