web前端常见面试题
1、什么是盒子模型?CSS 盒模型(Box Model),又称框模型。它包括:content、padding、border、margin,所有HTML元素都可以看作盒子。注: 当通过CSS指定一个元素的宽度和高度属性时,只是设置了实际内容区域的宽度和高度。一旦为页面设置了恰当的 DTD,浏览器会使用标准盒模型(标准模式),而DTD缺失则在ie6,ie7,ie8下将会使用IE盒模型(怪异模式)。标准盒模型 元素总宽度 = width + (padding + border + margin)* 2IE盒模型 元素总宽度 = width + margin * 2 2、行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素:a、b、span、img、input、strong、select、label、em、button、textarea块级元素:div、form、ul、li、dl、dt、dd、p、h1-h6、blockquote空元素:即系没有内容的HTML元素,例如: meta、link 、br、hr、input、img 3、CSS实现垂直水平居中方法一:给元素设置一个显示宽度,并设置左右margin为auto方法二:父元素设置相对定位position: relative;子元素设置绝对定位,并设置top、left、margin-top、margin-left等属性 position:absolute; top:50%; left:50% margin-top:-(高度 / 2) margin-left:-(宽度 / 2)方法三:父元素设置相对定位position: relative;子元素设置绝对定位,并设置top、left、margin-top、margin-left等属性 position:absolute; top:50%; left:50% transform:translate(-50%, -50%); // translate的参数会以自身的长宽做参考方法四:内联元素水平居中利用 text-align:center; 可以实现在块级元素内部的内联元素水平居中。此方法对内联元素(inline), 内联块(inline-block), 内联表(inline-table), inline-flex元素水平居中都有效。 4、简述一下src与href的区别href (Hypertext Reference) 超文本引用,用在link和a等元素上,指向网络资源所在位置,建立与当前元素或当前文档之间的超链接。src指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部。 补充:link和@import的区别两者都是外部引用CSS的方式,但是存在一定的区别。区别1:link是XHTML标签,除了加载CSS外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS。区别2:link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入以后加载。区别3:link是XHTML标签,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持。区别4:link支持使用Javascript控制DOM去改变样式;而@import不支持。 5、什么是CSS Hack?一般来说是针对不同的浏览器写不同的CSS,就是 CSS Hack。IE浏览器Hack一般又分为三种,条件Hack、属性级Hack、选择符Hack(详细参考CSS文档:css文档)。例如: // 1、条件Hack <!--[if IE]> <style> .test{color:red;} </style> <![endif]--> // 2、属性Hack .test{ color:#0909; /* 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 */6、简述同步和异步的区别同步是阻塞模式,异步是非阻塞模式。同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。7、px和em的区别px和em都是长度单位,区别是,px的值是固定的,指定是多少就是多少,计算比较容易。em的值不是固定的,并且em会继承父级元素的字体大小。浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em8、什么叫优雅降级和渐进增强?渐进增强 progressive enhancement:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。优雅降级 graceful degradation:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。区别:a. 优雅降级是从复杂的现状开始,并试图减少用户体验的供给b. 渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要c. 降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带 9、浏览器的内核分别是什么?IE: trident内核Firefox:gecko内核Safari:webkit内核Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核Chrome:Blink(基于webkit,Google与Opera Software共同开发) 10、怎样添加、移除、移动、复制、创建和查找节点?1)创建新节点createDocumentFragment() //创建一个DOM片段createElement() //创建一个具体的元素createTextNode() //创建一个文本节点2)添加、移除、替换、插入parentnode.appendChild(newnode) //添加parentnode.removeChild(oldnode) //移除parentnode.replaceChild(newnode, oldnode) //替换parentnode.insertBefore(newnode, oldnode) //插入3)查找getElementsByTagName() //通过标签名称getElementsByName() //通过元素的Name属性的值getElementById() //通过元素Id,唯一性 11、如何消除一个数组里面重复的元素?方法一: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]); }}console.log(arr2); var arr1 =[1,2,2,2,3,3,3,4,5,6], arr2 = []; arr1.forEach(function (item, index) { if (arr2.indexOf(item) < 0) { arr2.push(item); }})console.log(arr2);方法二:var arr1 =[1,2,2,2,3,3,3,4,5,6], arr2 = []; arr1.sort(function (a, b) { return a - b; }) for (var i = 0, len = arr1.length; i < len; i++) { if (arr1[i] != arr1[i + 1]) { arr2.push(arr1[i]); } } console.log(arr2); 12、实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制。typeof能返回六种数据类型,undefined、number、string、boolean、object、function function clone(obj) { var o; switch(typeof obj) { case "undefined": break; case "string": o = obj; break; case "number": o = obj; break; case "boolean": o = obj; break; case "object": if (obj === null) { o = null; } else if(obj.constructor === Array) { o = []; obj.forEach(function (item, index) { o[index] = clone(item); }) } else { o = {}; for (var key in obj) { o[key] =clone(obj[key]); } } break; default: o = obj; break; } return o; } 13、javascript中的call、apply、bind参考:https://www.cnblogs.com/coco1s/p/4833199.htmlapply 、 call 、bind 三者都是用来改变函数的this对象的指向;apply 、 call 、bi