前端面试题及答案整理(二)

Part1 CSS相关

1 内联元素(inline-element)和块元素(block element)分别有哪些

常见内联元素(行内元素)有a、b、span、i 、em、input、select 、img等
常见的块元素有div、ul、li、h1~h6、talbe、ol、 ul、td、p等

2 浮动相关

浮动布局指将元素脱离普通流/文档流,使其可以左右移动,直至它的外边缘遇到包含框或者另一个浮动框的边缘。浮动框不属于文档中的普通流,当一个元素浮动之后,不会影响到块级元素的布局而只会影响内联元素的排列。
正因为浮动元素脱离了文档流,其父级元素并不知道它的存在,因此会表现为高度为0,无论浮动元素如何变化,其父级元素也不会随它变化将其包裹,这种现象也叫作“高度塌陷”。
下面的例子中,不管#floatDom高度如何变化,#parent高度始终为0,这将导致父元素边框不能被撑开,背景不能显示等问题

<div id="parent">
 <div id="floatDOM" style="float:left;width:300px;height:300px;">
 <div style="clear:both">
</div>

因为高度塌陷的存在(这往往不是我们所期望的),必须要清除浮动,下面介绍清除浮动的几种方式:
•在浮动元素后添加样式含有“clear:both”的元素

<div id="parent">
 <div id="floatDOM" style="float:left;width:300px;height:300px;">
 <div style="clear:both">
</div>

也可以添加br标签,其自带clear:both属性

<div id="parent">
 <div id="floatDOM" style="float:left;width:300px;height:300px;">
 <br/>
</div>

利用这种方式清除浮动的优点在于通俗易懂,容易掌握,缺点也很明显,增加了很多无意义的标签,这个在后期维护中是很痛苦的。
•为父元素添加样式“overflow:hidden"

<div id="parent" style="overflow:hidden">
 <div id="floatDOM" style="float:left;width:300px;height:300px;">
</div>

利用这种方式不存在结构和语义化问题而且代码量极少,然而在内容增多的时候容易造成不会自动换行导致内容被隐藏掉,无法显示需要溢出的元素。
•利用:after伪元素

<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

3 相对布局(relative)和绝对布局的区别(absolute)

相对布局和绝对布局最本质的区别在于是否脱离文档流。
相对布局未脱离文档流,即设置元素相对布局后,文档流仍然保持其原始的位置,通过设置top、left等属性可设置其相对于原始位置的偏移量。
绝对布局是脱离文档流的,即文档流中的要素并不知道该绝对布局要素的存在,绝对布局的定位是相对于父元素中具有相对布局或绝对布局的要素,若都不存在则相对于body布局。

4 盒模型(Box Model)

盒模型定义了一个元素的显示形式,包括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盒模型。

5 CSS reset(重置)

每个浏览器都有一些自带的样式,而且各个浏览器这些自带的样式往往又存在不同,这给我们布局上带来了一些不便。因此在实践中往往需要对浏览器的css样式进行“清零”,即CSS reset。最简单的一种reset代码如下:

*{
 margin:0;
 padding:0;
}

这种方式虽然简单但太过“暴力”,因为很多要素像div、li等本身默认就没有margin、padding样式,这无异于造成大量冗余,更推荐的方式根据自己需要编写reset代码。

Reference:
www.zhangxinxu.com/wordpress/2010/08/html5-css-reset

6 CSS hack

由于不同的浏览器对CSS的解析和支持是不同的,这会导致相同的CSS代码在不同浏览器中的显示方式并不是完全一致的,这就需要通过CSS Hack来解决不同浏览器的兼容性问题。针对不同浏览器写不同的样式的这个过程就称为CSS hack。

CSS Hack常见的形式有如下几种:
•属性Hack

比如IE6能识别_width以及*width,而在IE7中能识别*width,但是不能识别_width,在FireFox中两个都不识别。
•选择符Hack

比如IE6能识别*html .class{},IE7能识别*+html .class{}或者*:first-child+html .class{}
•条件Hack

IE条件注释是微软从IE5开始就提供的一种非标准逻辑语句。比如针对所有IE:

<!–[if IE]>
 <!–Your Code–>
 <![endif]–>

针对IE6及以下版本:

<!–[if lt IE 7]>
<!–Your Code–>
<![endif]–>

这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。

Reference

http://www.jb51.net/css/226888.html

7 优雅降级(graceful degradation)与渐进增强(progressive enhancement)

渐进增强指针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

优雅降级指一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

两者的区别在于优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。

8 说出遇到的浏览器兼容问题
•不同浏览器中显示的内边距、外边距不同,如ul标签在FireFox中默认是有padding值的,而在IE中只有margin有值

利用CSS Reset(参见第5条)
•IE6的双倍边距BUG,在块级元素浮动后本来外边距10px,但IE解释为20px

将其该块级元素display设置为inline
•IE6中不支持min-height

min-height的作用是作用是当容器的内容较少时,能保持一个最小的高度,以免破坏了布局或UI设计效果。而当容器内的内容增加的时候,容器能够自动的伸展以适应内容的变化。

通过这种下面的方式可以解决:

#targetDom{
  background:#ccc;
  min-height:100px;
  height:auto!important;
  height:100px;
  overflow:visible;
 }

•在标准的事件绑定中绑定事件的方法函数为addEventListener,而IE使用的是attachEvent

通过条件判断分别写两条绑定语句或者使用jquery这类web框架库绑定。
•标准浏览器采用事件捕获的方式,而IE采用的是事件冒泡机制

后来标准认为冒泡更合理,利用设置addEventListener第三个参数兼容两种机制,事件冒泡为默认值。
•事件处理中的event属性IE中获取方式和标准浏览器不同

标准浏览器是作为参数带入,而ie是window.event方式获得,获得目标元素ie为e.srcElement 标准浏览器为e.target

Part2 其它

1 了解常用http状态码

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 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

2 手写ajax请求

//在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 使用指南

3 跨域问题

当我们在页面中通过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中新增的方法,对于IE6、IE7等老版本浏览器无法使用。

4 如何提高网站性能

请参看博主的另外两篇文章:

关于提高网站性能的几点建议

关于提高网站性能的几点建议2

发现新内容会持续更新...

博文作者:vicfeel

(0)

相关推荐

  • 前端JS面试中常见的算法问题总结

    前言 学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂的问题,这些基础知识的积累可以帮助我们更好的优化解决思路.下面罗列在前端面试中经常撞见的几个问题吧. Q1 判断一个单词是否是回文? 回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环.比如 mamam redivider . 很多人拿到这样的题目非常容易想到用for 将字符串颠倒字母顺序然后匹配就行了.其实重要的考察的就是对于reverse的实现.其实我们可以利

  • 一道JS前端闭包面试题解析

    问题 代码A function fun(n,o){ console.log(o); return { fun:function(m){//[2] return fun(m,n);//[1] } } } var a=fun(0); a.fun(1); a.fun(2); a.fun(3); var b=fun(0).fun(1).fun(2).fun(3); var c=fun(0).fun(1); c.fun(2); c.fun(3); 求出程序输出 这是一个闭包测试题 转换为等价代码 retu

  • Javascript前端经典的面试题及答案

    前言 如果面试题按类型来分,主要涉及到"技术"与"非技术"两大类,技术类别下涉及到的子类别有: 移动 & PC端布局类 JavaScript 核心基础类 衍生框架类 项目应用类 这四大类别的面试题若按出现频率来划分,则面试时 100% 会问到的题型有:"移动端&PC端布局类.JavaScript 核心基础类".本次选择这两类中难度更高一些的 "JavaScript 核心基础类" 面试题,进行了分析和解答,供面试

  • 一道常被人轻视的web前端常见面试题(JS)

    面试题是招聘公司和开发者都非常关心的话题,公司希望通过它了解开发者的真实水平和细节处理能力,而开发者希望能够最大程度地展示自己的水平(甚至超常发挥).本文提供了众多前端开发面试题,无论是招聘方还是应聘方都值得一看! 前言 年前刚刚离职了,分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多难只是因为大多面试者过于轻视他. 题目如下: function Foo() { ge

  • js前端面试题及答案整理(一)

    Part1 手写代码 现场手写代码是现在面试中很常见的一类面试题,考察基础的数据结构与算法能力. 1 数组去重的实现 基本数组去重 Array.prototype.unique = function(){ var result = []; this.forEach(function(v){ if(result.indexOf(v) < 0){ result.push(v); } }); return result; } •利用hash表去重,这是一种空间换时间的方法 Array.prototyp

  • 常见前端面试题及答案

    前言 本文是在GitHub上看到一个大牛总结的前端常见面试题,很多问题问的都很好,很经典.很有代表性.上面没有答案,我就整理了一下,从网上找了一些相关问题的答案.里面有一部分问题的答案我也没有进行考证,不少答案都来源于网络,或许会有疏漏之处,仅供大家参考哦!(还有一部分问题答案还未整理,大家也可以自己搜索一下答案) 1.你能描述一下渐进增强和优雅降级之间的不同吗? 优雅降级:Web站点在所有新式浏览器中都能正常工作,如果用户使用的是老式浏览器,则代码会检查以确认它们是否能正常工作.由于IE独特的

  • 整理一些最近经常遇到的前端面试题

    前言 本文主要整理了一些最近遇到的前端面试题,方便大家在面试前有所准备,文中给出了详细的解答,下面话不多说了,来看看详细的介绍吧. 1.标签属性中title和alt的区别 答: title是设置鼠标移动到图片上时显示的内容,而alt是用于当图片没有正常显示时出现的提示文字,另外alt还用于在seo中针对图片的优化说明. 2.隐藏元素的几种方法 答: 1.display:none; 2.visibility:hidden; 3.opacity:0; 4.position:absolute; lef

  • 前端面试知识点锦集(JavaScript篇)

    JavaScript部分 1.谈谈你对Ajax的理解?(概念.特点.作用) AJAX全称为"Asynchronous JavaScript And XML"(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效果. 优点 a.不需要插件支持 b.优秀的用户体验 c.提高Web程序的性能 d.减轻服务器和带宽的负担 缺点 a.浏览器对XMLHttpRequest对象的支持度不足,几乎所有浏览器现在都支持 b.破坏浏览器"前进&qu

  • BAT及各大互联网公司2014前端笔试面试题--JavaScript篇

    而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正确,如有错误或有更好的解法,还请斧正. 附上第二篇:BAT及各大互联网公司2014前端笔试面试题--Html,Css篇 前面几题是会很基础,越下越有深度. 初级Javascript: 1.JavaScript是一门什么样的语言,它有哪些特点? 没有标准答案. 2.JavaScript的数据类型都有什么? 基本数据类型:String,boolean,Number,Undefined, Null 引用数据类型:Object(Array,Da

  • 前端面试题及答案整理(二)

    Part1 CSS相关 1 内联元素(inline-element)和块元素(block element)分别有哪些 常见内联元素(行内元素)有a.b.span.i .em.input.select .img等 常见的块元素有div.ul.li.h1~h6.talbe.ol. ul.td.p等 2 浮动相关 浮动布局指将元素脱离普通流/文档流,使其可以左右移动,直至它的外边缘遇到包含框或者另一个浮动框的边缘.浮动框不属于文档中的普通流,当一个元素浮动之后,不会影响到块级元素的布局而只会影响内联元

  • for循环 + setTimeout 结合一些示例(前端面试题)

    一.背景 最近在翻看以前的老书<node.js开发指南>,恰好碰到 for 循环 + setTimeout 的经典例子,于是重新梳理了思路并记录下. 二.写在前面,setTimeout 和 setInterval 的执行机制 在日常编码中,你会发现,给 setTimeout 和 setInterval 设定延迟时间往往并不准,或者干脆 setTimeout(function(){xxx},0) 也不是立马执行(特别是有耗时代码在前),这是因为 js 是单线程的,有一个事件队列机制,setTim

  • 收集前端面试题之url、href、src

    一.URL的概念 统一资源定位符(或称统一资源定位器/定位地址.URL地址等,英语:Uniform Resource Locator,常缩写为URL),有时也被俗称为网页地址(网址).如同在网络上的门牌,是因特网上标准的资源的地址(Address). 二.URL的格式 2.1 标准格式 协议类型:[//服务器地址[:端口号]][/资源层级UNIX文件路径]文件名?查询 2.2 完整格式 协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级UNIX文件路径]文件名?查询

  • JS前端面试题详解之手写bind

    目录 bind 的用法 this 的指向问题 积累参数 实现一个 bind 结尾 大家好,我是前端西瓜哥,今天我们用 JS 来实现内置的 bind 方法. bind 的用法 在实现之前,我们先学习一下 Function.prototype.bind 的用法. function.bind(thisArg[, arg1[, arg2[, ...]]]) bind 是函数特有的一个方法,可以创建一个绑定了 this 的新函数. 接受的参数为如下. 第 1 个参数 thisArg:用于修改 this 指

  • Swift面试题及答案整理

    前言 Swift语言至今诞生有一年多的时间了,已经成为当前最流行语言之一.虽然它的语法简单好用,但实际上Swift是一门非常复杂的语言.因为它不仅是面向对象的同时又是函数式编程语言.本文主要介绍Swift常见的一些面试问题,你可以用这些问题向面试者提问,也可以用来测试你自己目前所掌握的Swift知识,如果你不清楚问题答案的话也不用太担心,因为每个问题下面都有相应的答案. 一.给一个数组,要求写一个函数,交换数组中的两个元素 二X程序员: 好简单啊,直接写出以下结果 func swap(_ num

  • 2019年度web前端面试题总结(主要为Vue面试题)

    毕业之后就在一直合肥小公司工作,没有老司机.没有技术氛围,在技术的道路上我只能独自摸索.老板也只会画饼充饥,前途一片迷茫看不到任何希望.于是乎,我果断辞职,在新年开工之际来到杭州,这里的互联网公司应该是合肥的几十倍吧.... 刚来3天,面试了几家公司,有些规模比较小,有些是创业公司,也有些已经发展的不错了:今天把最近的面试题目做个汇总,也给自己复个盘,由于我的技术栈主要为Vue,所以大部分题目都是Vue开发相关的. 1. 谈谈你对MVVM开发模式的理解 MVVM分为Model.View.View

随机推荐