@gpzjyw
2016-11-16T11:47:27.000000Z
字数 13587
阅读 683
Interview Front-End
IE: trident内核;
Firefox:gecko内核;
Safari:webkit内核;
Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核;
Chrome:Blink(基于webkit,Google与Opera Software共同开发)。
浏览器内核作用
主要分成两部分:渲染引擎(Layout Engine 或 Rendering Engine)和JavaScript引擎。
渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。
JavaScript引擎:解析并执行JavaScript代码。
DOCTYPE
告知浏览器文档使用哪种 HTML 或 XHTML 规范。(告诉浏览器按照何种规范解析页面)
<!DOCTYPE html>
charset
声明文档使用的字符编码
<meta charset="utf-8">
lang属性
性规定元素内容的语言
<html lang="en">
meta
提供有关页面的元信息(meta-information)
必需属性:content
可选属性:http-equiv,name,acheme
viewport
让布局在移动浏览器上显示的更好
<meta name="viewport" content="width=device-width, initial-scale=1.0">
favicon icon
<link rel="shortcut icon" type="image/ico" href="/favicon.ico" />
移动端的meta
参见此文
XML:Extensible Markup Language,可扩展标记语言
XSLT:XSL(Extensible Stylesheet Language,扩展样式表语言)转换
XHTML:EXtensible HyperText Markup Language,可扩展超文本标签语言
HTML:Hyper Text Markup Language,超文本标记语言
渐进增强 progressive enhancement
针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
优雅降级 graceful degradation
一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
区别:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。
网页标准是标准制定机构是为了能让web发展的更“健康”,降低开成难度和开发成本,开发者不必花许多精力在解决浏览器兼容性问题方面。
Web Storage是HTML5提供的本地存储技术,sessionStorage和localStorage是其的两个实例:
sessionStorage:
用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问,并且当会话结束后数据也随之销毁(浏览器关闭)。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。
sessionStorage中的数据可以跨越页面刷新而存在。
localStorage:
用于持久化的本地存储,除非主动删除数据(JavaScript删除或清除浏览器缓存),否则数据是永远不会过期的。
要访问同一个localStorage对象,页面必须来自同一个域名(子域名无效),使用同一个协议,同一个端口。
本地存储技术对比:
| 本地存储 | 区别与对比 |
|---|---|
| cookie | 大小受限;每次请求新页面时都会发送cookie(带宽);需要指定作用域,不可跨域调用 |
| Web Storage | 更大的本地存储技术;以键值对的形式存储数据;不会自动在请求页面时发送 |
| indexedDB | 在本地存储结构化的数据,并在此基础上提供高性能的索引API |
| Flash | Adobe Flash Player |
session:会话控制
session实现:通过客户端的本地存储 session id,访问页面时发送 session id 实现
使用非主要域名来请求css,js,图片等静态文件,只有在访问主要域名的时候才会带上cookie
域名收敛与域名发散
src用于替换当前元素,href用于在当前文档和引用资源之间确立联系。
src是source的缩写,指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。
<script src ="js.js"></script>
当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部。
href是Hypertext Reference的缩写,指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,如果我们在文档中添加
<link href ="common.css" rel ="stylesheet"/>
那么浏览器会识别该文档为css文件,就会并行下载资源并且不会停止对当前文档的处理。这也是为什么建议使用link方式来加载css,而不是使用@import方式。
常规格式:png-8, png-24, jpeg, gif, svg。
WebP:谷歌(google)开发的一种旨在加快图片加载速度的图片格式。图片压缩体积只有jpeg的2/3,能节省大量服务器带宽资源和数据空间。
dns缓存,cdn缓存,浏览器缓存,服务器缓存。
图片懒加载,在页面上的未可视区域可以添加一个滚动条事件,判断图片位置与浏览器顶端的距离与页面的距离,如果前者小于后者,优先加载;
如果为幻灯片、相册等,可以使用图片预加载技术,将当前展示图片的前一张和后一张优先下载;
如果图片为css图片,可以使用CSSsprite,SVGsprite,Iconfont、Base64等技术;
如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提高用户体验;
如果图片展示区域小于图片的真实大小,则因在服务器端根据业务需要先行进行图片压缩,图片压缩后大小与展示一致。
用正确的标签做正确的事情;
去掉或样式丢失的时候能让页面呈现清晰的结构;
屏幕阅读器会完全根据你的标记来“读”你的网页;
PDA、手机等设备可能无法像普通电脑的浏览器一样来渲染网页;
搜索引擎的爬虫也依赖于标记来确定上下文和各个关键字的权重(即SEO);
你的页面是否对爬虫容易理解非常重要,因为爬虫很大程度上会忽略用于表现的标记,而只注重语义标记;
便于团队开发和维护。
script标签中设置async和defer的作用常规script标签:立即加载脚本并执行。同步进行,阻塞文档解析。
async:HTML5中属性,该属性规定一旦脚本可用,则异步执行。内联脚本无效。
异步加载脚本,加载完成后异步执行。完全不考虑脚本之间的依赖,多个脚本可能会乱序执行
defer:该属性规定是否对脚本执行进行延迟,
先异步加载,在文档元素解析完成之后执行。
String-based:静态,修改数据model不会更新view;
DOM-based:本质即修改DOM节点的属性;动态更新;数据model和view绑定,修改model则view更新;语言能力受限;
Living-template:动态更新;综合String-based的优点(解析成AST)和DOM-based的优点(数据绑定);
HTML Tidy。
canvas:
svg:
区别:
使用canvas绘制图形是通过调用其API,而svg则是通过构建一棵XML元素树来实现的
| canvas | svg |
|---|---|
| 依赖分辨率 | 不依赖分辨率 |
| 不支持事件处理器 | 支持事件处理器 |
| 弱的文本渲染能力 | 最适合带有大型渲染区域的应用程序(谷歌地图) |
| 能够以.png或.jpg格式保存结果图像 | 复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快) |
| 最适合图像密集型的游戏,其中的许多对象会被频繁重绘 | 不适合游戏应用 |
在用户没有与因特网连接时,可以正常访问站点或应用,在用户与因特网连接时,更新用户机器上的缓存文件。
工作原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示。
如果需要使用iframe,最好是通过javascript动态给iframe添加src属性值,这样可以绕开以上问题。
调用localstorge、cookies等本地存储方式。
DOM树:表示页面结构;
渲染树:表示DOM节点如何显示;
重排:重新构造渲染树;
重绘:完成重排后,浏览器重新绘制受影响的部分到屏幕。
重排何时发生
后端模块引擎,文件名一般为 XXXX.ftl。
后端负责解析 freemarker 文件,完成数据填充,渲染出html,发送至浏览器端。
语法为在html的基础上增加了可编程的部分。
document对象:document
head标签:document.head
body标签:document.body
表单集合:document.forms
表单字段集合:document.forms[0].elements
iframe标签:document.iframe
W3C盒模型(标准):width = 内容宽度,高度同理。
IE盒模型:width = 内容宽度 + border宽度 + padding宽度,高度同理。
CSS3属性
box-sizing允许选择何种盒模型:content-box(W3C)和border-box(IE)
通过设置DOCTYPE,使IE以遵循标准兼容模式运行。
font : font-style font-variant font-weight font-size/line-height font-family
background : background-color background-position background-size background-repeat background-origin background-clip background-attachment background-image
同一stacking context内的定位元素通过比较z-index大小确定层叠关系;
z-index不为0或auto的时候,会创建一个新的stacking context;
只适用于定位元素(设置
position属性为非static值)。
将一些小型图片结合一张图片,以设置元素background属性将图片插入到元素中。
动画使元素从一种样式逐渐变化为另一种样式的效果。
相关的CSS3属性:
动画(animation、@keyframes):
animation:设置动画名称、时长、速度曲线等属性;
@keyframes:创建具体动画,0%~100%;
过渡(transition):设置需要过渡的CSS属性、过渡时间等属性,多项效果之间用逗号隔开;
2D变换、3D变换(transform):静态变换。
这是浏览器解析CSS的两种模式。
标准模式:浏览器按W3C标准解析执行代码
怪异模式:是使用浏览器自己的方式解析执行代码,因为不同浏览器解析执行的方式不一样,所以称为怪异模式。
通过设定DTD(文档类型定义,Document Type Definition)来规定以何种模式解析执行代码。即HTML中的DOCTYPE
CSS中属性值100%为相对单位。以width:100%为例:
一般层级元素:
直接基于父级元素的宽度(宽度需要指定);
存在浮动元素的层级关系(float):
直接基于父级元素的宽度(宽度需要指定);
存在定位元素的层级关系(position):
position:relative:基于父级元素;
position:absolute:基于其依赖定位的元素;
position:fixed:基于body;
display:none:
元素在页面上彻底消失,元素本来占有的空间会被其他元素占用,将导致浏览器的重排和重绘。
visibility:hidden:
元素在页面消失后,其占据的空间依旧会保留着,所以它只会导致浏览器重绘而不会重排。
opacity:0:
透明度设置为0。
设置height,width等盒模型属性为0:
{
margin:0;
border:0;
padding:0;
height:0;
width:0;
overflow:hidden;
}
opacity作用于元素,以及元素内的所有内容的透明度。
rgba()只作用于元素的颜色或其背景色,设置rgba透明的元素的子元素不会继承透明效果。
可继承样式:font-size font-family color, UL LI DL DD DT;
不可继承样式:border padding margin width height;
基本选择器:
扩展选择器:
针对不同的浏览器写不同的CSS code的过程,就是CSS hack。
IE6的Hack方式:_property: value;
IE6、7的Hack方式:*property: value;
浮动元素脱离普通流(normal flow),不占据空间。浮动元素碰到包含框或者其它浮动元素的边框停留。
浮动会产生什么影响?要怎么处理?
浮动元素脱离正常文档流。会造成包含框高度塌陷问题。
如何防止高度塌陷
清除浮动(闭合浮动):
.clear:after {
content:"·";
height:0;
visibility:hidden;
display:block;
clear:both;
}
使父容器形成BFC/hasLayout:
BFC(Block formatting contexts),块级格式化上下文。IE6/7不支持。以下情况创建新的BFC:
hasLayout,hasLayout=true效果和BFC效果类似,以下情况会令hasLayout=true:
display: inline-blockfloat: left|rightposition: absoluteheight: any valuewidth: any valuezoom: any valuewriting-mode: tb-rl<input>、<img> 、<button> 、<texterea> 、<label>。
他们是CSS预处理器,是CSS上的一种抽象层。
例如Less是一种动态样式语言. 将CSS赋予了动态语言的特性,如变量,继承,运算,函数。LESS既可以在客户端上运行 (支持IE 6+, Webkit, Firefox),也可一在服务端运行 (借助 Node.js)。
什么是CSS预处理器?
CSS预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了。预处理器通常可以实现浏览器兼容,变量,结构体等功能,代码更加简洁易于维护。
为什么要使用它们?
栅格系统(grid systems),以规则的网格阵列来指导和规范网页中的版面布局以及信息分布。维基百科。
CSS框架是一系列CSS文件的集合体,包含了基本的元素重置,页面排版、网格布局、表单样式、通用规则等代码块,用于简化web前端开发的工作,提高工作效率。维基百科
常用CSS框架:Bootstrap,YUI Grids CSS,NEC。
CSS框架开发顺序:
transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜把上、左、右三条边隐藏掉(颜色设为transparent)
#demo {
width: 0;
height: 0;
border-width: 20px;
border-style: solid;
border-color: transparent transparent red transparent;
}
每个元素的定位都受到包含块的影响。
在布局中,以下三种技术被经常使用:
这是实现布局的三个最基本的原子技术,只要巧妙组合,并加以灵活运用,就能“拼”出各种布局的实现方案。
静态布局(Static Layout)
传统布局方式,针对PC设计一个Layout,内容超过浏览器窗口的宽高时,使用横向和竖向滚动条。
自适应布局(Adaptive Layout)
针对不同分辨率实现宽度自适应。
流式布局(Liquid Layout)
页面元素的宽度按照屏幕进行适配调整。
响应式布局(Responsive Layout)
为不同的屏幕分辨率定义布局,引入了流式布局的理念,页面元素宽度随着窗口调整而自动适配。
适用于不同分辨率设备的浏览。
又叫作圣杯布局(Holy Grail of Layouts),是Kevin Cornell 在2006年提出的一个布局模型概念,它的布局要求有以下几点:
圣杯布局主要依靠浮动元素实现,通过设置左右边栏的外边距为负数,实现了定位。HTML和CSS代码如下:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>圣杯布局</title><style type="text/css">body {min-width: 550px; /* 2x left width + right width */}/*** 中间三列的CSS属性 ***/#container {padding-left: 200px; /* left width */padding-right: 150px; /* right width */}#container .column {position: relative;float: left;}#center {width: 100%;}#left {width: 200px; /* left width */right: 200px; /* left width */margin-left: -100%;}#right {width: 150px; /* right width */margin-right: -150px; /* right width */}/*** 清除浮动 ***/#footer {clear: both;}/*** IE6 Fix ***/* html #left {left: 150px; /* right width */}</style></head><body><div id="header">This is header! </div><!-- container内,center在前,left、right在后,保证中间栏优先渲染 --><div id="container"><div id="center" class="column">This is center! </div><div id="left" class="column">This is left! </div><div id="right" class="column">This is right! </div></div><div id="footer">This is footer! </div></body></html>
改进版本:
设置padding属性
在左中右三栏的CSS属性中引入padding属性,令这三栏中的文字排列不那么靠近边框以至于显得过于紧促,同时需要修改margin、width、right等属性。
让所有列等高
设置三列的padding-bottom很大(9999),margin-bottom负很大(-9999),容器的overflow属性为hidden。
在圣杯布局的基础上,改良的布局方式。如果把三栏布局比作一只大鸟,可以把center看成是鸟的身体,left和right则是鸟的翅膀。这个布局的实现思路是,先把最重要的身体部分放好,然后再将翅膀移动到适当的地方。
center中内容部分嵌套了单独的div元素,html结构如下所示:
<div id="container"><div id="center" class="column"><div id="center-content">This is center! </div></div><div id="left" class="column">This is left! </div><div id="right" class="column">This is right! </div></div>
通过修改CSS代码,可以灵活实现各种布局方式,一程度上实现了HTML结构和CSS布局的解耦。如这套栅格化布局系统。
直接加载2倍大小的图片
这种方法就解决了Retina显示不清楚的问题,但是在普通屏幕下,这种图片要经过浏览器的压缩,在IE6和IE7上有十分差得显示效果,同时,两倍大小的图片势必会导致页面加载时间加长,用户体验下降,此时,我们可以通过Retina.js文件解决:
Image-set控制
如要显示的图片大小为200px*300px,你准备的图片应有两张:一张大小为200px*300px,命名为pic.png;另一张大小为400px*600px,命名为pic@2x.png(@2x是Retina图标的标准命名方式),然后使用以下css代码控制:
#logo {background: url(pic.png) 0 0 no-repeat;background-image: -webkit-image-set(url(pic.png) 1x, url(pic@2x.png) 2x);background-image: -moz-image-set(url(pic.png) 1x,url(images/pic@2x.png) 2x);background-image: -ms-image-set(url(pic.png) 1x,url(images/pic@2x.png) 2x);background-image: -o-image-set(url(url(pic.png) 1x,url(images/pic@2x.png) 2x);}
@media only screen and (-webkit-min-device-pixel-ratio: 1.5),only screen and(min--moz-device-pixel-ratio: 1.5), /* 注意这里的写法比较特殊 */only screen and (-o-min-device-pixel-ratio: 3/2),only screen and (min-device-pixel-ratio: 1.5) {#logo {background-image: url(pic@2x.png);background-size: 100px auto;}}
参考自NEC。
IE6绝对定位位置错误
在IE6中,绝对定位元素的参照物没有触发haslayout,则绝对定位元素的left和bottom就会有问题;
解决方案:在参照物中设置zoom:1来触发IE的haslayout;
IE6/7定位元素溢出不动
普通容器中的相对定位元素溢出,拖动容器的垂直和水平滚动条时,该相对定位元素不会移动;
解决方案:设置容器的CSS属性为positon:relative
IE6绝对定位1像素偏差
参照物的宽高为奇数时,绝对定位元素设置了位置为0或100%时,仍会有1px空隙;
解决方案:设为偶数;
IE6定位元素消失
绝对定位元素在浮动元素标签的前后消失。
解决方案:
IE6浮动双边距
元素设置了float属性,同时又设置了margin-left或margin-right,margin值会加倍;
解决方案:在float的元素中加入_display:inline;
IE6浮动3像素空隙
浮动元素与其他元素之间存在3px的空隙;
解决方案:设置浮动元素_margin-right:-3px或_margin-left:-3px;
IE6/7表单元素偏离
某些表单元素在父元素上触发haslayout之后,表单元素会以祖先元素上的margin-left值偏离;
解决方案:在父元素内外在嵌套一个触发haslayout的元素;
IE6/7图片链接无效