依照我个人答案与网上相关答案进行编写
作者:刘建
毕业院校:家里蹲大学低能班
联系邮箱:243376129@qq.com
如果有错误,欢迎发邮件,本人尽量修正。
一个前端技术工程师必须掌握的知识,写得很详细了,相信看完会对大家有所帮助。
——————————————————————————————————————————————————————————————————————
当然,高手就不用看这些面试题了。
见过某个高手,有自己的个人网站,然后把工作经历(他的工作单位基本都是著名网站,比如网易)、网站作品、掌握知识的熟练程度和掌握时间做成了一个页面。
人家网上应聘直接发个网页地址就够了。
当然这样的高手很少,这些题是为了大部分人出的,检测知识面。
开始进入正题:
——————————————————————————————————————————————————————————————————————
HTML与XHTML有什么区别?
①XHTML 元素必须被正确地嵌套。
错误:<p><span>this is example.</p></span>
正确:<p><span>this is example.</span></p>
HTML下<table width=100>,可以不写引号"",
而XHTML必须正确的写成:<table width="100">
②XHTML元素必须被关闭。
错误:<p>this is example.
正确:<p>this is example.</p>
HTML下可以写:<br>,而XHTML有严格限制,每个标签都得关闭,要写成:<br />
③标签名必须用小写字母。
错误:<P>this is example.<P>
正确:<p>this is example.</p>
④XHTML 文档必须拥有根元素。所有的 XHTML 元素必须被嵌套于 <html> 根元素中。
HTML根元素:在HTML文档中,元素<html>代表了文档的根,其他所有的元素都是在该元素的基础上进行延伸或拓展的。
该元素也是HTML文档的最外层元素,因此也称为根元素。
⑤XHTML废除了一些html里面的标签,原因是制定这个规范的w3c的人觉得有些旧东西该淘汰或不科学。
在XHTML和HTML下,同样的CSS样式表解析出来会有很多细节上的小差异。
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
网站重构的测试(来自腾讯的前端工程师面试题)
HTML文档流必须从Main开始然后才是两侧
原题解答看着让人有些没说到关键点,我进行下补充。
布局基本框架
上面只是一个简化图,实际比这个复杂不少:Left与Right是固定宽度,中间Main要求自适应。
——————
文档流:文档流是文档中可显示对象在排列时所占用的位置。将窗体自上而下分成一行行,并在每行中按从左至右的挨次排放元素。
网页中大部分对象默认是占用文档流,也有一些对象是不占文档流的,比如表单中隐藏域。
当然我们也可以让占用文档流的元素转换成不占文档流,这就要用到CSS中属性position来控制。
有三种状况将使得元素离开文档流而存在,分别是浮动、绝对定位、固定定位。然则在IE中浮动元素也存在于文档流中。
浮动元素不占任何正常文档流空间,而浮动元素的定位照样基于正常的文档流,然后从文档流中抽出并且能够尽量远的挪动至左侧或者右侧。
文字内容会环绕在浮动元素四周。当一个元素从正常文档流中抽出后,依然在文档流中的其他元素将疏忽该元素并填补他原先的空间。
——————
核心问题是Html文档流必须从Main开始然后才是两侧,下面就是这个要求的Html结构
1 <div id=”main”> 2 </div> 3 <div id=”left”> 4 </div> 5 <div id=”right”> 6 </div>
常规做法把两侧放在主要内容的前面进行左右浮动,然后中间使用边距,这样有个缺点就是网速慢的时候主要内容却在最后显示。
按照上面的Html布局,如果按常规把left和right各自左右浮动,中间main使用边距的话就会出现下面这种情况:
一、使用绝对定位。
不占用文档流的先读
绝对定位需要设置左右边距(实际应用中往往需要在外面套一个相对定位的盒子)。整个Demo如下(通过Firefox与IE5.5——8测试):
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 5 <title>三栏布局</title> 6 <style type="text/css"> 7 * { margin:0; padding:0; } 8 #main { position:absolute; left:200px; right:200px }/*绝对定位,使content不占据html文档流空间,让后面的left,right浮上去*/ 9 #left, #right { 200px; } 10 #left { float:left; } 11 #right { float:right; } 12 </style> 13 </head> 14 <body> 15 <div id="main"> 16 <p style="height:999px; background:#fffaba; ">content</p> 17 </div> 18 <div id="left"> 19 <p style="height:999px; background:#8fc41f;">left</p> 20 </div><div id="right"> 21 <p style="height:999px; background:#00b7ef;">right</p> 22 </div> 23 </body> 24 </html>
CSS2引入了一种新的简单选择器:通配选择器(universal selector),显示为一个星号(*)。该选择器可以与任何元素匹配,就像是一个通配符。
例如,下面的规则可以使文档中的每个元素都为红色:
* {color:red;}
二、Main左浮动。
如果Main浮动的话首先要解决宽度自适应的问题,设置宽度100%显示,然后就得把Left拉到Main左侧,这里巧妙使用两种偏移方法。
先定义为浮动的先读。
IE6会有兼容问题,需要Hack一下。
Hack解释:一般基于开源的程序的基础,对其代码进行增加、删除或者修改、优化,使之在功能上符合新的需求。
这里的Hack就是修改的意思。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>三栏布局-浮动方法</title> <style type="text/css"> * { margin:0; padding:0; } #wrap { padding:0 300px 0 200px; *overflow:hidden; } #main { float:left; 100%; } #left, #right { position:relative; _display:inline; } #left { 200px; float:left; margin-left:-100%; right:200px; _right:-300px; } #right { 300px; float:right; margin-right:-300px; } </style> </head> <body> <div id="wrap"> <div id="main"> <p style="height:999px; background:#fffaba; ">content</p> </div> <div id="left"> <p style="height:999px; background:#8fc41f;">left</p> </div> <div id="right"> <p style="height:999px; background:#00b7ef;">right2</p> </div> </div> </body> </html>
后记:关于侧栏宽度固定,主要部分宽度自适应的布局是再普通不过了,而大部分人的做法就是把侧栏放在自适应盒子前面,
然后进行浮动解决,从来没有想过使用最优化的html文档流完成这个布局。第一种方法由于用了绝对定位,适合在特殊应用中使用,
常规布局推荐使用第二种解决。
此题原文转自:http://www.planeart.cn/?p=446
在原文基础上进行修改。
——————————————————————————————————————————————————————————————————————
Doctype?严格模式与混杂模式,如何触发这两种模式,区分它们有何意义?
Doctype(document type 文档类型)
可声明三种DTD(document type definition 文档类型固定)类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。
HTML
HTML 4.01 规定了三种文档类型:Strict、Transitional 以及 Frameset。
HTML Strict DTD(HTML严格模式)
如果您需要干净的标记,免于表现层的混乱,请使用此类型。请与层叠样式表(CSS)配合使用:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" " http://www.w3.org/TR/html4/strict.dtd">
HTML Transitional DTD(过度版本)
Transitional DTD 可包含 W3C 所期望移入样式表的呈现属性和元素。如果您的读者使用了不支持层叠样式表(CSS)的浏览器以至于您不得不使用 HTML 的呈现特性时,请使用此类型:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www.w3.org/TR/html4/loose.dtd">
Frameset DTD
Frameset DTD 应当被用于带有框架的文档。除 frameset 元素取代了 body 元素之外,Frameset DTD 等同于 Transitional DTD:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" " http://www.w3.org/TR/html4/frameset.dtd">
进一步讲解
严格模式:必须按照声明的标准执行,规定元素的位置后,这个元素就必须在这个位置不能乱动。
好处:层次分明,便于阅读。
混杂模式:标准比较宽松,主要为了兼容,模拟老式浏览器去看老网站。了解一下就行。
关于触发
严格模式:都会有一个DTD,比如上面的DTD HTML 4.01
混杂模式:①声明一个混杂模式的DTD
②如果严格模式找不到他要执行的标准,就会变成混杂模式
区分它们的意义:
严格模式:有些老的浏览器不支持新技术设计网页的标准,所以用新技术设计的网页无法显示
混杂模式:为了让使用老浏览器的用户看到你网页的内容。
举个例子
标准模式:就如一个标准美女,样子好看,不过做饭,干家务等基本不会。
混杂模式:不是美女,有可能很普通、有可能很难看,不过能干家务。
你娶媳妇的时候觉得这两个有区别没?
——————————————————————————————————————————————————————————————————————
行内元素有哪些?块级元素有哪些?CSS的盒模型?
行内元素:
就是内联元素(inline element)一般都是基于语义级(semantic)的基本元素。内联元素只能容纳文本或者其他内联元素。
其实就是元素与元素之间不换行
a:锚点
img:图片
abbr:缩写
acronym:首字
input:输入框
span:常用内联容器,定义文本内区块
select:项目选择
var:定义变量
label:表格标签
code:计算机代码(在引用源码的时候需要)
big:大字体
b:粗体(不推荐
br:换行
cite:引用
dfn:定义字段
em:强调
i:斜体
kbd:定义键盘文本
q:短引用
s:中划线(不推荐)
samp:定义范例计算机代码
small:小字体文本
strike:中划线
strong:粗体强调
sub:下标
sup:上标
textarea:多行文本输入框
u:下划线
块级元素:
块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签P。form这个块元素比较特殊,它只能用来容纳其他块元素。
块元素(block element)和内联元素(inline element)都是html规范中的概念。块元素和内联元素的基本差异是块元素一般都从新行开始。
而当加入了css控制以后,块元素和内联元素的这种属性差异就不成为差异了。
比如,我们完全可以把内联元素cite加上display:block这样的属性,让他也有每次都从新行开始的属性。
块元素(block element)
address:地址
blockquote:块引用
center:举中对齐块
dir:目录列表
div:常用块级容易,也是css layout的主要标签
dl:定义列表
fieldset-form:控制组
form:交互表单
h1:大标题
h2:副标题
h3:3级标题
h4:4级标题
h5:5级标题
h6:6级标题
hr:水平分隔线
menu:菜单列表
noframes:frames可选内容(对于不支持frame的浏览器显示此区块内容)
noscript:可选脚本内容(对于不支持script的浏览器显示此内容)
ol:排序表单
p:段落
pre:格式化文本
table:表格
ul:非排序列表
CSS的盒子模型
顾名思义,就是用把某些内容用一个盒子包装起来,需要给这个盒子设定一些属性,才能让这个盒子看起来是个盒子
属性名:
内容:content 要放一只大闸蟹
填充:padding 需要冷藏,就用冰块,这个属性就是冰块填了多厚
边框:border 盒子纸质的厚度,用什么颜色的纸
边界:margin 别的盒子离这个盒子的距离
把上面这几个属性属性说明一下,那主考官就知道了,除非他不了解CSS
——————————————————————————————————————————————————————————————————————
如果让你来制作一个访问量很高的大型网站,你会如何来管理所有CSS文件、JS与图片
在原答案基础上,加上我个人建站的心得。
回答:涉及到人手、分工、同步;
前期团队必须确定好网站全局样式(globe.css),编码模式(utf-8)等;
编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
继承式写法举例
function test(a,b)
{}
var date1 =new date;
date1.test(a,b);
var date1 =new date;
date1.test(a,b);
标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
易于纠正错误,查清责任。
页面进行标注(例如 页面 模块 开始和结束);
CSS跟HTML分文件夹并行存放,命名都得统一(例如style.css)
JS 分文件夹存放 命名以该JS功能为准英文翻译;
图片采用png8(256色PNG类型图片格式的别名)其他别的图片文件格式也行,保证格式基本一致,不要这几张用JPG,那几张用GIF
格式相同的整合在一起,使用方便,便于将来的管理
——————————————————————————————————————————————————————————————————————
用JS实现随机选取10到100之间的10个数字,存入到数组,并排序。
在网上看到一道题,算是有一定难度,然后那题给出的答案无论是语法还是算法,错得一塌糊涂。
以下给我自己写的答案
<script> var array=[]; function getRandom(start,end) { var choice=end-start; var a1=[]; for(var i=0;i<91;i++) { a1[i]=i+10 } var a2=[]; for(var i=0;i<10;i++) { a2.push(a1.splice(Math.floor(Math.random()*a1.length) , 1)); a2.sort(); } return a2; } array.push(getRandom(10,100)); alert(array); </script>
测试通过,有更好答案的朋友麻烦告诉我这低能儿一声,感激不尽。
——————————————————————————————————————————————————————————————————————
双击表格每一列头进行该列整行排序,再双击倒序。(腾讯2012前端开发笔试题)
涉及到很多知识点,建议认真看看。不愧为腾讯,这题实在不容易。
1 以下的代码直接存为sortTable.js,在页面中包含: 2 <script type="text/javascript" src="sortTable.js"></script> 3 4 function ieOrFireFox(ob) 5 { 6 if (ob.textContent != null) 7 return ob.textContent; 8 var s = ob.innerText; 9 return s.substring(0, s.length); 10 } 11 12 //排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数据的数据类型 13 function sortAble(tableId, iCol, dataType) 14 { 15 var table = document.getElementById(tableId); 16 var tbody = table.tBodies[0]; 17 var colRows = tbody.rows; 18 var aTrs = new Array; 19 //将将得到的列放入数组,备用 20 for (var i=0; i < colRows.length-1; i++) 21 { 22 aTrs[i] = colRows[i+1]; 23 } 24 25 //判断上一次排列的列和现在需要排列的是否同一个。 26 if (table.sortCol == iCol) 27 { 28 aTrs.reverse(); 29 } 30 else 31 { 32 //如果不是同一列,使用数组的sort方法,传进排序函数 33 aTrs.sort(compareEle(iCol, dataType)); 34 } 35 oFragment = document.createDocumentFragment(); 36 37 for (var i=0; i < aTrs.length; i++) 38 { 39 oFragment.appendChild(aTrs[i]); 40 } 41 tbody.appendChild(oFragment); 42 //记录最后一次排序的列索引 43 table.sortCol = iCol; 44 } 45 //将列的类型转化成相应的可以排列的数据类型 46 function convert(sValue, dataType) 47 { 48 switch(dataType) 49 { 50 case "int": 51 return parseInt(sValue); 52 case "float": 53 return parseFloat(sValue); 54 case "date": 55 return new Date(Date.parse(sValue)); 56 default: 57 return sValue.toString(); 58 } 59 } 60 61 //排序函数,iCol表示列索引,dataType表示该列的数据类型 62 function compareEle(iCol, dataType) 63 { 64 return function (oTR1, oTR2) 65 { 66 var vValue1 = convert(ieOrFireFox(oTR1.cells[iCol]), dataType); 67 var vValue2 = convert(ieOrFireFox(oTR2.cells[iCol]), dataType); 68 if (vValue1 < vValue2) 69 { 70 return -1; 71 } 72 else if (vValue1 > vValue2) 73 { 74 return 1; 75 } 76 else 77 { 78 return 0; 79 } 80 }; 81 } 82 83 84 85 86 然后直接在页面中就可以使用排序方法了: 87 88 表格写法: 89 <table width="96%" height="" border="0" id="tableId"> 90 <tr> 91 <th >日期</th> 92 <th onclick="sortAble('tableId', 1)" style="cursor:pointer">某列</th> 93 <th onclick="sortAble('tableId', 2)" style="cursor:pointer">某列</th> 94 <th onclick="sortAble('tableId', 3)" style="cursor:pointer">某列</th> 95 <th >某列</th> 96 <th >某列</th> 97 <th onclick="sortAble('tableId', 6, 'int')" style="cursor:pointer">某整数列</th> 98 </tr> 99 <tr> 100 jsp循环生成列表数据 101 </tr> 102 </table>
XML DOM textContent 属性
定义和用法
textContent 属性返回或设置选定元素的文本。
如果返回文本,则该属性返回元素节点内所有文本节点的值。
如果设置文本,则该属性删除所有子节点,并用单个文本节点来替换它们。
语法:
返回文本:
elementNode.textContent
设置文本:
elementNode.textContent=string
JavaScript sort() 方法
定义和用法
sort() 方法用于对数组的元素进行排序。
语法
arrayObject.sort(sortby)
参数 | 描述 |
sortby | 可选。规定排序顺序。必须是函数。 |
返回值
对数组的引用。请注意,数组在原数组上进行排序,不生成副本。
说明
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
在本例中,我们将创建一个数组,并按字母顺序进行排序:
<script type="text/javascript"> var arr = new Array(6) arr[0] = "10" arr[1] = "5" arr[2] = "40" arr[3] = "25" arr[4] = "1000" arr[5] = "1" document.write(arr + "<br />") document.write(arr.sort()) </script>
输出:
10,5,40,25,1000,1 1,10,1000,25,40,5
请注意,上面的代码没有按照数值的大小对数字进行排序,要实现这一点,就必须使用一个排序函数:
<script type="text/javascript"> function sortNumber(a,b) { return a - b } var arr = new Array(6) arr[0] = "10" arr[1] = "5" arr[2] = "40" arr[3] = "25" arr[4] = "1000" arr[5] = "1" document.write(arr + "<br />") document.write(arr.sort(sortNumber)) </script>
输出:
10,5,40,25,1000,1 1,5,10,25,40,1000
实例
1 <html> 2 <body> 3 4 <script type="text/javascript"> 5 6 function sortNumber(a, b) 7 { 8 return a - b 9 } 10 11 var arr = new Array(6) 12 arr[0] = "10" 13 arr[1] = "5" 14 arr[2] = "40" 15 arr[3] = "25" 16 arr[4] = "1000" 17 arr[5] = "1" 18 19 document.write(arr + "<br />") 20 document.write(arr.sort(sortNumber)) 21 22 </script> 23 24 </body> 25 </html>
输出:
10,5,40,25,1000,1 1,5,10,25,40,1000
HTML <th> 标签
定义表格内的表头单元格。
HTML 表单中有两种类型的单元格:
- 表头单元格 - 包含表头信息(由 th 元素创建)
- 标准单元格 - 包含数据(由 td 元素创建)
th 元素内部的文本通常会呈现为居中的粗体文本,而 td 元素内的文本通常是左对齐的普通文本。
实例
普通的 HTML 表格,包含两行两列:
<table border="1"> <tr> <th>Company</th> <th>Address</th> </tr> <tr> <td>Apple, Inc.</td> <td>1 Infinite Loop Cupertino, CA 95014</td> </tr> </table>
HTML <col> 标签
<col> 标签为表格中一个或多个列定义属性值。
如需对全部列应用样式,<col> 标签很有用,这样就不需要对各个单元和各行重复应用样式了。
您只能在 table 或 colgroup 元素中使用 <col> 标签。
实例
col 元素为表格中的三个列规定了不同的对齐方式:
<table width="100%" border="1"> <col align="left" /> <col align="left" /> <col align="right" /> <tr> <th>ISBN</th> <th>Title</th> <th>Price</th> </tr> <tr> <td>3476896</td> <td>My first HTML</td> <td>$53</td> </tr> </table>
HTML DOM rows 集合
定义和用法
rows 集合返回表格中所有行(TableRow 对象)的一个数组,即一个 HTMLCollection。
该集合包括 <thead>、<tfoot> 和 <tbody> 中定义的所有行。
语法
tableObject.rows[]
实例
下面的例子使用了 rows 集合来显示第一行中的内容:
1 <html> 2 <head> 3 <script type="text/javascript"> 4 function showRow() 5 { 6 alert(document.getElementById('myTable').rows[0].innerHTML) 7 } 8 </script> 9 </head> 10 <body> 11 12 <table id="myTable" border="1"> 13 <tr> 14 <td>Row1 cell1</td> 15 <td>Row1 cell2</td> 16 </tr> 17 <tr> 18 <td>Row2 cell1</td> 19 <td>Row2 cell2</td> 20 </tr> 21 </table> 22 <br /> 23 <input type="button" onclick="showRow()" value="Show innerHTML"> 24 25 </body> 26 </html>
CSS cursor 属性
定义和用法
cursor 属性规定要显示的光标的类型(形状)。
该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状(不过 CSS2.1 没有定义由哪个边界确定这个范围)。
值 | 描述 |
---|---|
url |
需使用的自定义光标的 URL。 注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标。 |
default | 默认光标(通常是一个箭头) |
auto | 默认。浏览器设置的光标。 |
crosshair | 光标呈现为十字线。 |
pointer | 光标呈现为指示链接的指针(一只手) |
move | 此光标指示某对象可被移动。 |
e-resize | 此光标指示矩形框的边缘可被向右(东)移动。 |
ne-resize | 此光标指示矩形框的边缘可被向上及向右移动(北/东)。 |
nw-resize | 此光标指示矩形框的边缘可被向上及向左移动(北/西)。 |
n-resize | 此光标指示矩形框的边缘可被向上(北)移动。 |
se-resize | 此光标指示矩形框的边缘可被向下及向右移动(南/东)。 |
sw-resize | 此光标指示矩形框的边缘可被向下及向左移动(南/西)。 |
s-resize | 此光标指示矩形框的边缘可被向下移动(北/西)。 |
w-resize | 此光标指示矩形框的边缘可被向左移动(西)。 |
text | 此光标指示文本。 |
wait | 此光标指示程序正忙(通常是一只表或沙漏)。 |
help | 此光标指示可用的帮助(通常是一个问号或一个气球)。 |
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
HTML DOM 对象
HTML DOM hash 属性
1 <html> 2 <head> 3 <script type="text/javascript"> 4 function changeLink() 5 { 6 document.getElementById('venus').hash="bottom" 7 } 8 </script> 9 </head> 10 <body> 11 12 <img src="/i/eg_planets.jpg" 13 usemap="#planetmap" /> 14 15 <map name="planetmap"> 16 <area 17 id="venus" 18 shape="circle" 19 coords="180,139,14" 20 href ="/example/hdom/venus2.html#top" 21 alt="Venus" /> 22 </map> 23 24 <input type="button" onclick="changeLink()" value="改变链接" /> 25 26 </body> 27 </html>