一、页面布局
- 题目:假设高度已知,请写出三栏布局,其中左栏、右栏宽度各位
300px
,中间自适应。 - 对于这个页面布局,有五种写法,浮动布局、绝对布局、
flexbox
布局、表格布局和网格布局,如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Layout</title>
<style media="screen">
html *{
padding: 0;
margin: 0;
}
.layout article div{
min-height: 100px;
}
</style>
</head>
<body>
<section class="layout float">
<style media="screen">
.layout.float .left{
float:left;
width:300px;
background: red;
}
.layout.float .center{
background: yellow;
}
.layout.float .right{
float:right;
width:300px;
background: blue;
}
</style>
<h1>三栏布局</h1>
<article class="left-right-center">
<div class="left"></div>
<div class="right"></div>
<div class="center">
<h2>浮动解决方案</h2>
1.这是三栏布局的浮动布局
2.这是三栏布局的浮动布局
3.这是三栏布局的浮动布局
</div>
</article>
</section>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Layout</title>
<style media="screen">
html *{
padding: 0;
margin: 0;
}
.layout article div{
min-height: 100px;
}
</style>
</head>
<body>
<section class="layout absolute">
<style>
.layout.absolute .left-center-right>div{
position: absolute;
}
.layout.absolute .left{
left:0;
width: 300px;
background: red;
}
.layout.absolute .center{
left: 300px;
right: 300px;
background: yellow;
}
.layout.absolute .right{
right:0;
width: 300px;
background: blue;
}
</style>
<h1>三栏布局</h1>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h2>绝对定位解决方案</h2>
1.这是三栏布局的绝对布局
2.这是三栏布局的绝对布局
3.这是三栏布局的绝对布局
</div>
<div class="right"></div>
</article>
</section>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Layout</title>
<style media="screen">
html *{
padding: 0;
margin: 0;
}
.layout article div{
min-height: 100px;
}
</style>
</head>
<body>
<section class="layout flexbox">
<style>
.layout.flexbox{
margin-top: 110px;
}
.layout.flexbox .left-center-right{
display: flex;
}
.layout.flexbox .left{
width: 300px;
background: red;
}
.layout.flexbox .center{
flex:1;
background: yellow;
}
.layout.flexbox .right{
width: 300px;
background: blue;
}
</style>
<h1>三栏布局</h1>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h2>flexbox解决方案</h2>
1.这是三栏布局的 flexbox 布局
2.这是三栏布局的 flexbox 布局
3.这是三栏布局的 flexbox 布局
</div>
<div class="right"></div>
</article>
</section>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Layout</title>
<style media="screen">
html *{
padding: 0;
margin: 0;
}
.layout article div{
min-height: 100px;
}
</style>
</head>
<body>
<section class="layout table">
<style>
.layout.table .left-center-right{
width:100%;
height: 100px;
display: table;
}
.layout.table .left-center-right>div{
display: table-cell;
}
.layout.table .left{
width: 300px;
background: red;
}
.layout.table .center{
background: yellow;
}
.layout.table .right{
width: 300px;
background: blue;
}
</style>
<h1>三栏布局</h1>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h2>表格布局解决方案</h2>
1.这是三栏布局的表格布局
2.这是三栏布局的表格布局
3.这是三栏布局的表格布局
</div>
<div class="right"></div>
</article>
</section>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Layout</title>
<style media="screen">
html *{
padding: 0;
margin: 0;
}
.layout article div{
min-height: 100px;
}
</style>
</head>
<body>
<section class="layout grid">
<style>
.layout.grid .left-center-right{
width:100%;
display: grid;
grid-template-rows: 100px;
grid-template-columns: 300px auto 300px;
}
.layout.grid .left-center-right>div{
}
.layout.grid .left{
width: 300px;
background: red;
}
.layout.grid .center{
background: yellow;
}
.layout.grid .right{
background: blue;
}
</style>
<h1>三栏布局</h1>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h2>网格布局解决方案</h2>
1.这是三栏布局的网格布局
2.这是三栏布局的网格布局
3.这是三栏布局的网格布局
</div>
<div class="right"></div>
</article>
</section>
</body>
</html>
- 对于这五种方案,优缺点的比较,如下所示:
float
,比较好的兼容性需要清除浮动,处理好与周边元素的关系absolute
,方便快捷,布局脱离文档流,导致方案的可使用性较差flex
布局,解决上述两个的缺点,移动端使用 flex
更多,ie8
不支持table-ceil
布局,兼容性好,对 SEO
不够友好,每一个部分可以理解为单元格,当其中的一个表格高度变高,其他的两个表格也会变高grid
布局,代码量简洁,新技术
- 如果中间高度不固定,这五种方案会有什么样的情况,如下所示:
float
不能用,中间的内容被左侧挡住,因为撑开高度以后,左侧没有了遮挡物,就会流向左侧。
解决方案:创建 BFC
absolute
不能用flex
可以使用table-ceil
可以使用grid
不能用
- 对于页面布局的小结,语义化掌握到位,页面布局理解深刻,
CSS
基础知识扎实、思维灵活且积极上进、代码书写规范。 - 对于页面布局的变通,如下所示:
- 三栏布局,左右宽度高度固定及中间自适应、上下宽度固定及中间自适应
- 两栏布局,左宽度固定及右自适应、右宽度固定及左自适应、上高度固定及下自适应、下高度固定及上自适应
二、CSS 盒模型
- 题目: 谈谈你对
CSS
盒模型的认识。 - 对于盒模型的这道题,可以从基本概念:标准模型 +
IE
模型、标准模型和 IE
模型区别、CSS
如何设置者两种模型、JS
如何设置获取盒模型对应的宽和高、根据盒模型接收解释边距重叠、BFC
边距重叠解决方案这几个方面去考虑和回答。 - 对于盒模型的基本概念,文档中每个元素都会被描述为一个矩形盒子,盒子有一个边界,分别为
margin edge,border edge,padding edge,content edge
。盒子模型分为标准盒子模型和 IE
盒子模型。 - 对于标准模型,它的宽度是内容
content
的宽度,不包括 border
和 padding
的宽度,也就是说 width = content
。而对于 IE
模型,它的宽度是内容 content
的宽度、内边距 padding
和 边框 border
的宽度之和,也就是说 width = content + border + padding
。 - 对于
CSS
如何设置者两种模型,有 box-sizing
这个属性。当 box-sizing
属性值为 content-box
的时候,说明就是标准模型。当 box-sizing
属性值为 border-box
的时候,说明就是 IE 模型。浏览器默认是标准模型。 - 对于
JS
如何设置获取盒模型对应的宽和高,有以下四种方式:
dom.style.width/height
dom.currentStyle.width/height //渲染之后的宽高 只IE支持
window.getComputedStyle(dom).width/height //所有浏览器支持 渲染之后的宽高
dom.getBoundingClientRect().width/height //计算元素的绝对位置,根据viewport左上角确定,会得到left top width height
- 根据盒模型接收解释边距重叠,存在几种情况。父子元素边距重叠、兄弟元素边距重叠和空元素边距重叠,代码如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS盒模型</title>
<style media="screen">
html *{
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<section class="box" id="sec">
<style media="screen">
#sec{
background: #f00;
}
.child{
height: 100px;
margin-top: 10px;
background: yellow
}
</style>
<article class="child"></article>
</section>
</body>
</html>
BFC
,边距重叠解决方案,也是块级格式化上下文。对于 BFC
的原理,如下所示:
BFC
元素垂直方向的边距发生重叠BFC
的区域不会与浮动元素的box
重叠BFC
是页面上一个独立的容器,内外的元素不会相互影响- 计算
BFC
的高度时,浮动元素也参与计算
- 创建
BFC
,如下所示:
float
值不为 none
position
为 absolute
或 fixed
display
为 inline-block
,table-cell
,table-caption
,flex;
overflow
不为 visible
- 对应
BFC
解决边距重叠的代码,如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>CSS盒模型</title>
<style media="screen">
html *{
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<section id="margin">
<style>
#margin{
background: pink;
overflow: hidden;
}
#margin>p{
margin: 5px auto 25px;
background: red;
}
</style>
<p>1</p>
<div style="overflow:hidden">
<p>2</p>
</div>
<p>3</p>
</section>
<section id="layout">
<style media="screen">
#layout{
background: red;
}
#layout .left{
float: left;
width: 100px;
height: 100px;
background: pink;
}
#layout .right{
height: 110px;
background: #ccc;
overflow: auto;
}
</style>
<div class="left"></div>
<div class="right"></div>
</section>
<section id="float">
<style media="screen">
#float{
background: red;
overflow: auto;
}
#float .float{
float: left;
font-size: 30px;
}
</style>
<div class="float">我是浮动元素</div>
</section>
</body>
</html>
三、DOM 事件
- 对于
DOM
事件类,分为基本概念:DOM
事件的级别、DOM
事件模型、DOM
事件流、描述 DOM
事件捕获的具体流程、Event
对象的常见应用和自定义事件等等。 - 对于
DOM
事件的级别,如下所示:
DOM0 element.οnclick=function(){}
DOM2 element.addEventListener(‘click’,function(){},fasle);
DOM3 element.addEventListener(‘keyup’,function(){},false)
- 对于
DOM
事件模型,分为捕获和冒泡这两种。捕获是从上到下,冒泡是从下到上。 - 对于
DOM
事件流,分为三个阶段,如下所示:
- 第一阶段:捕获
- 第二阶段:目标阶段
- 第三阶段:冒泡 从目标元素上传到
window
对象
- 对于描述
DOM
事件捕获的具体流程,window–>document–>html(document.documentElement)–> body–>…–>目标元素
。 - 对于
Event
对象的常见应用,如下所示:
e.target //当前被点击的元素
e.preventDefault()
e.currentTarget //代理中的父元素
e.stopPropagation()
e.stopImmediatePropagation() //按钮绑定了两个click事件A、B,希望点击A之后加上这句话,就可以阻止B的执行
。
- 对于自定义事件,也称为模拟事件,如下所示:
var eve=new Event(‘custome’);
ev.addEventListener(‘custome’,function(){console.log(‘custom’); })
ev.dispatchEvent(eve);
- 对于
DOM
事件的代码,如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Event</title>
</head>
<body>
<div id="ev">
<style media="screen">
#ev{
width: 300px;
height: 100px;
background: red;
color: #fff;
text-align: center;
line-height: 100px;
}
</style>
目标元素
</div>
<script type="text/javascript">
var ev = document.getElementById('ev');
ev.addEventListener('click', function (e) {
console.log('ev captrue');
}, true);
window.addEventListener('click', function (e) {
console.log('window captrue');
}, true);
document.addEventListener('click', function (e) {
console.log('document captrue');
}, true);
document.documentElement.addEventListener('click', function (e) {
console.log('html captrue');
}, true);
document.body.addEventListener('click', function (e) {
console.log('body captrue');
}, true);
var eve = new Event('test');
ev.addEventListener('test', function () {
console.log('test dispatch');
});
setTimeout(function () {
ev.dispatchEvent(eve);
}, 1000);
</script>
</body>
</html>
四、HTTP 协议类
- 对于
HTTP
协议类,分为 HTTP
协议的主要特点、HTTP
报文的组成部分、HTTP
方法、POST
和GET
的区别、HTTP
状态码、持久连接和管线化。 - 对于
HTTP
协议的主要特点,如下所示:
- 简单快速
- 灵活
- 无连接,链接一次就会断掉,不会持久链接
- 无状态
- 对于
HTTP
报文的组成部分,分为请求报文和响应报文,如下所示:
- 请求报文,包括请求行
(http方法、页面地址、http协议及版本)
、请求头(告诉服务端我要什么内容)
、空行和请求体 - 响应报文,包括状态行、响应头、空行和响应体
- 对于
HTTP
方法,前五个必须记住,如下所示:
GET
——>获取资源POST
——>传输资源PUT
——>更新资源DELETE
——>删除资源HEAD
——>获得报文首部OPTIONS
——>询问支持的方法TRACE
——>追踪路径CONNECT
——>要求用隧道协议连接代理
- 对于
POST
和 GET
的区别,如下所示:
GET
在浏览器回退是无害的,而 POST
请求会再次提交请求GET
产生的 URL
地址可以被收藏,而 POST
不可以GET
请求会被浏览器主动缓存,而 POST
不会,除非手动设置GET
请求只能进行 URL
编码,而 POST
支持多种编码方式GET
请求参数会被完整保留在浏览器历史记录里,而 POST
中的参数不会被保留GET
请求在 URL
中传送的参数是有长度限制的,而 POST
没有限制- 对参数的数据类型,
GET
只接受 ASCII
字符,而 POST
没有限制 GET
比 POST
更不安全,因为传递的参数直接暴露在 URL
上,所以不能用来传递敏感信息GET
参数通过 URL
传递,POST
放在 Request Body
中
- 对于
HTTP
状态码,如下所示:
1xx
:指示信息——表示请求已接收,继续处理2xx
:成功——表示请求已被成功接收3xx
:重定向——要完成请求必须进行更进一步的操作4xx
:客户端错误——请求有语法错误或请求无法实现5xx
:服务器错误——服务器未能实现合法的请求
- 对于具体的
HTTP
状态码,如下所示:
200 OK
:客户端请求成功206 partial Content
:客户发送了一个带有 Range
头的 GET
请求,服务器完成了它301 Moved Permanently
:所请求的页面已经转移至新的 URL
302 Fonud
:所请求的页面已经临时转移至新的 url
304 Not Modified
:客户端有缓存的文档并发出了一个条件性的请求,服务器告诉客户,原来缓冲的文档还可以继续使用400 Bad Request
:客户端请求有语法错误,不能被服务器所理解401 Unauthoried
:请求未经授权,这个状态码必须和 WWW-Authenticate
报头域一起使用403 Forbidden
:对被请求页面的访问禁止404 Not Found
:请求的资源不存在500 Internal Server Error
:服务器发生不可预期的错误原来缓存的文档还可以继续使用503 Server Unavailable
:请求未完成,服务器临时过载或当机,一段时间后可能恢复正常。
- 对于持久连接,如下所示:
HTTP
协议采用的是“请求-应答模式”,当使用普通模式,即非 Keep-Alive
模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP
协议为无连接的协议)- 当使用
Keep-Alive
模式(又称持久链接、连接重用)时,Keep-Alive
功能使客户端到服务器端的连接有效,当出现对服务器的后继请求时,Keep-Alive
功能避免了建立或者重新建立连接
- 对于管线化,如下所示:
- 在使用持久链接的情况下,某个连接上消息的传递类似于,
请求1->响应1->请求2->响应2->请求3->响应3
,整个连接一直没有断开的 - 某个连接上的消息变成了类似这样,
请求1->请求2->请求3->响应1->响应2->响应3
- 对于管线化的具体理解,如下所示:
- 管线化机制通过持久连接完成,仅
HTTP/1.1
支持此技术 - 只有
GET
和 Head
请求可以管线化,而 POST
则有所限制 - 初次创建连接时不应启动管线机制,因为对方(服务器)不一定支
HTTP/1.1
版本的协议 HTTP/1.1
要求服务器端支持管线化,但并不要求服务器端也对响应进行管线化处理,只是要求对于管线化的请求不失败即可- 由于上面提到的服务器端问题,开启管线化很可能并不会带来大幅度的性能提升,而很多服务器端和代理程序对管线化的支持并不好。因此现代浏览器如
Chrome
和 Firefox
默认并未开启管线化支持 - 管线化不会影响响应到来的顺序,如上面的例子所示,响应返回的顺序并未改变