131
深入剖析浏览器 北京研发中心 2012-04 浏览器/盒模型/调试工具/开发工具 函谷/拔赤 – F2E@Taobao

深入剖析浏览器

  • Upload
    jay-li

  • View
    80.699

  • Download
    3

Embed Size (px)

DESCRIPTION

淘宝UED前端培训课程

Citation preview

Page 1: 深入剖析浏览器

深入剖析浏览器

淘宝北京研发中心 2012-04

浏览器/盒模型/调试工具/开发工具

函谷/拔赤 – F2E@Taobao

Page 2: 深入剖析浏览器

• Who Are We?淘宝前端开发工程师

http://ued.taobao.com

Page 3: 深入剖析浏览器

• 浏览器合模型和兼容性

• 网页布局

• 页面的渲染原理

• 调试工具

Topic

Page 4: 深入剖析浏览器

盒模型:Box Model

Page 5: 深入剖析浏览器

#box {color:black; /*firefox*/color:red\9; /*所有ie*/*color:blue; /*ie7*/_color:green; /*ie6*/

}

Hack(样式补丁)

Page 6: 深入剖析浏览器

CSS Basic Box Model

Page 7: 深入剖析浏览器
Page 8: 深入剖析浏览器

#box {border:20px solid red;padding:20px;width:100px;height:100px;

}#box p {width:100%;height:100%;

}

<div id=“box”><p>#box</p>

</div>

Page 9: 深入剖析浏览器

Firefox with W3C box layout

Page 10: 深入剖析浏览器

IE with W3C box layout

Page 11: 深入剖析浏览器

IE with W3C box layout

Page 12: 深入剖析浏览器

在IE的Quirks(怪异)模式下如何表现?

Page 13: 深入剖析浏览器

IE with Quirks box layout

Page 14: 深入剖析浏览器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" " http://www.w3.org/TR/html4/strict.dtd">

<!DOCTYPE HTML>

指定Doctype!

Page 15: 深入剖析浏览器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" " http://www.w3.org/TR/html4/strict.dtd">

<!DOCTYPE HTML>

指定Doctype!

Page 16: 深入剖析浏览器

注意:

IE6 下的双边距Bug!

Page 17: 深入剖析浏览器

float:leftmargin-left:100px

IE6

!IE6

float:leftmargin-left:100px

Page 18: 深入剖析浏览器

This is a bug!

Page 19: 深入剖析浏览器

float:leftmargin-left:100pxdisplay:inline

Fix this bug

Page 20: 深入剖析浏览器

注意:

IE 中的HasLayout!

Page 21: 深入剖析浏览器

div#box {background:red;filter:alpha(opacity=50);

}

<!DOCTYPE html>…<div id=“box”>text

</div>

Page 22: 深入剖析浏览器

IE6/7中滤镜不起作用

IE8中滤镜正常工作

Page 23: 深入剖析浏览器

div#box {background:red;filter:alpha(opacity=50);

}

<!DOCTYPE html>…<div id=“box”>text

</div>

Div在IE6/7下默认没有hasLayout

Page 24: 深入剖析浏览器

记住:没有 hasLayout 的元素上

滤镜不起作用

Page 25: 深入剖析浏览器

为什么需要haslayout?

Page 26: 深入剖析浏览器

降低浏览器渲染压力

Page 27: 深入剖析浏览器

• div• span

默认不具有 hasLayout

Page 28: 深入剖析浏览器

用css激活元素的 hasLayout

• position• float• width(!auto)• height(!auto)• zoom• overflow

Page 29: 深入剖析浏览器

div#box {background:red;filter:alpha(opacity=50);height:19px;

}

<!DOCTYPE html>…<div id=“box”>text

</div>

让div具有hasLayout

Page 30: 深入剖析浏览器

IE6/7中滤镜正常工作

IE8中滤镜正常工作

Page 31: 深入剖析浏览器

Warning !!!

Page 32: 深入剖析浏览器

hasLayout 元素呈现为”矩形”

Page 33: 深入剖析浏览器

我想实现的效果!

Page 34: 深入剖析浏览器

#pic {float:left;width:50px;height:50px;

}#content {border:1px solid blue;background:yellow;height:100%;

}

<div><div id=“pic”></div><div id=“content”>long text…</span>

</div>

Page 35: 深入剖析浏览器

Firefox 中表现正确

IE8 中表现正确

Page 36: 深入剖析浏览器

IE7 中展现错误

IE6 中展现错误

Page 37: 深入剖析浏览器

#pic {float:left;width:50px;height:50px;

}#content {border:1px solid blue;background:yellow;height:100%;

}

<div><div id=“pic”></div><div id=“content”>long text…</span>

</div>

height触发了#content的hasLayout

Page 38: 深入剖析浏览器

#pic {float:left;width:50px;height:50px;

}#content {border:1px solid blue;background:yellow;height:100%;

}

<div><div id=“pic”></div><div id=“content”>long text…</span>

</div>

height触发了#content的hasLayout

IE6/7�下 #content�显示为矩形

Page 39: 深入剖析浏览器

#pic {float:left;width:50px;height:50px;

}#content {border:1px solid blue;background:yellow;height:100%;

}

<div style=“background:yellow”><div id=“pic”></div><div id=“content”>long text…</span>

</div>

样式定义在wrapper上

Page 40: 深入剖析浏览器

IE7 中展现正确

IE6 中展现正确

Page 41: 深入剖析浏览器

IE6/7不支持display:inline-block?

Page 42: 深入剖析浏览器

display:block

display:inline

display:inline-block;

Page 43: 深入剖析浏览器

display:block

display:inline

display:inline-block;

*display:inline;*zoom:1;

Hack�for�ie7/6

Page 44: 深入剖析浏览器

元素的 Margin 重叠

Page 45: 深入剖析浏览器

边界重叠规则

• 水平margin不重叠

• 浮动元素上下margin不重叠(float)• 飘动元素上下margin不重叠(position)• 常规折行上下margin重叠

Page 46: 深入剖析浏览器

<div id=“wrapper”><p></p><p></p>…

</div>

#wrapper {width:500px;

}#wrapper p{width:100px;margin:50px;float:left;

}

Page 47: 深入剖析浏览器

margin:50px

margin:50px100px

浮动元素上下margin不重叠

Page 48: 深入剖析浏览器

<div id=“wrapper”><p></p><p></p>…

</div>

#wrapper {width:500px;

}#wrapper p{width:100px;margin:50px;float:left;

}

如果去掉浮动?

Page 49: 深入剖析浏览器

margin:50px

无浮动/飘动元素上下margin重叠

Page 51: 深入剖析浏览器

网页布局

Page 52: 深入剖析浏览器

CSS reset.css

清除浏览器默认样式

Page 53: 深入剖析浏览器

早期Web页面没有栅格概念

Page 54: 深入剖析浏览器

随着内容增多,信息展现需要“规划”

Page 55: 深入剖析浏览器

Yahoo经典的950栅格系统

Page 56: 深入剖析浏览器

熟悉的960宽度

http://960.gs/demo.html

Page 57: 深入剖析浏览器

淘宝950栅格原型

Page 58: 深入剖析浏览器

淘宝栅格系统对照表

Page 59: 深入剖析浏览器

渐进增强

一套html,多套css

布局灵活

2栏、3栏、4栏…

主容器宽度自适应

布局的实现

Page 60: 深入剖析浏览器

圣杯 vs 双飞翼

Page 61: 深入剖析浏览器

http://www.alistapart.com/articles/holygrail圣杯布局

Page 62: 深入剖析浏览器
Page 63: 深入剖析浏览器
Page 64: 深入剖析浏览器
Page 65: 深入剖析浏览器
Page 66: 深入剖析浏览器
Page 67: 深入剖析浏览器

http://blog.html.it/layoutgala/双飞翼布局

Page 68: 深入剖析浏览器
Page 69: 深入剖析浏览器
Page 70: 深入剖析浏览器
Page 71: 深入剖析浏览器

淘宝主站常用布局

Page 72: 深入剖析浏览器

栅格在宽屏/响应式设计中的束缚

Page 73: 深入剖析浏览器

990 栅格

30(列宽) x 25(列) + 10(槽宽) x 24(槽数)

290

Page 74: 深入剖析浏览器

300

1000px “栅格”?

C(列宽) x n(列) + 10(槽宽) x (n-1)(槽数)n∈[15,40],C∈Z 无解

Page 75: 深入剖析浏览器

在布局变化不多的页面(淘宝首页),没有使用栅格

绝对定位,简单高效

Page 76: 深入剖析浏览器

在布局动态变化的页面中,也不适用静态栅格

Page 77: 深入剖析浏览器

响应式栅格的一种尝试LessFramework.csshttp://lessframework.com/

Page 78: 深入剖析浏览器

Less:让CSS可被编程http://www.lesscss.net

Page 79: 深入剖析浏览器

页面的渲染过程

Page 80: 深入剖析浏览器

Javascript

ECMAScript DOM BOM

JavaScript的外在表现

Page 81: 深入剖析浏览器

• DOMW3C标准提供的文档模型,浏览器均实现了这个标准

• BOM浏览器对象模型,浏览器各自的实现

DOM和BOM

Page 82: 深入剖析浏览器

浏览器渲染过程

Page 83: 深入剖析浏览器

执行脚本过程中的渲染

Page 84: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><script>//erroralert(document.getElementById('a'));

</script><span id="a“>error</span></body></html>

error

Page 85: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><span id="a">ok</span><script>//okalert(document.getElementById('a'));

</script></body></html>

ok

Page 86: 深入剖析浏览器

三个重要的事件

Page 87: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><div id=“J”>

<span id="a">ok</span><span id=“b">ok</span>

</div></body></html>

Page 88: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><div id=“J”>

<span id="a">ok</span><span id="a">ok</span>

</div></body></html>

document

head

Page 89: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><div id=“J”>

<span id="a">ok</span><span id=“b">ok</span>

</div></body></html>

document

head

body

Page 90: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><div id=“J”>

<span id="a">ok</span><span id=“b">ok</span>

</div></body></html>

document

head

body

div#J

div#J available

Page 91: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><div id=“J”>

<span id="a">ok</span><span id=“b">ok</span>

</div></body></html>

document

head

body

div#J

span#a

span#a available

Page 92: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><div id=“J”>

<span id="a">ok</span><span id=“b">ok</span>

</div></body></html>

document

head

body

div#J

span#a

span#b

span#b available

div#J contentready

Page 93: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><div id=“J”>

<span id="a">ok</span><span id=“b">ok</span>

</div></body></html>

document

head

body

div#J

span#a

span#b

domready

Page 94: 深入剖析浏览器

<!DOCTYPE HTML><html lang="zh"><head>head</head>

<body><script>Y.on(‘available’,function(){

alert(Y.one(‘#a’));},’#a’);

</script><span id="a">ok</span></body></html>

ok

Page 95: 深入剖析浏览器

延时渲染:

载入内容而不立即渲染

减少浏览器渲染压力

提高渲染速度

http://www.taobao.com

Page 96: 深入剖析浏览器

开发/调试工具

Page 97: 深入剖析浏览器

Douglas Crockford:“前端工程师面需要面对的软件开发环

境实在是糟糕透顶,让人难以置信!”

Page 98: 深入剖析浏览器

• 工程师又套乱页面了,又要检查标签配对

• 每次修改脚本,传到测试环境才看到效果

• 调试压缩后的脚本

• 根据IE丑陋的报错定位到错误位置

• 缓存总是在捣乱

• 有没有工具来批量压缩脚本

• …

苦逼的前端工程师

Page 99: 深入剖析浏览器

前端工程师看起来像这样…

Page 100: 深入剖析浏览器

前端工程师的内心世界:看到bug,两眼放光

Page 101: 深入剖析浏览器
Page 102: 深入剖析浏览器

• firefox 插件

• 调试样式、布局

• debug JavaScript

• 查看网络情况

• 一批基于firebug的插件扩展

Page 103: 深入剖析浏览器
Page 104: 深入剖析浏览器
Page 105: 深入剖析浏览器
Page 106: 深入剖析浏览器
Page 107: 深入剖析浏览器

Fiddler

• 监控http请求

• 劫持http包,修改http头等信息

• 做本地文件映射

Page 108: 深入剖析浏览器

截获到的HTTP请求

HTTP请求详情

Page 109: 深入剖析浏览器

本地文件映射

Page 110: 深入剖析浏览器

YSlow

• 监控页面性能

• 查找页面瓶颈

• 辅助调试页面

Page 111: 深入剖析浏览器

页面重量

页面缓存后重量

Page 112: 深入剖析浏览器

检查JS语法

语法检查报告

Page 113: 深入剖析浏览器

展开js脚本

Page 114: 深入剖析浏览器

图片优化

Page 115: 深入剖析浏览器

下载优化后的图片成

每张图片的压缩比例

Page 116: 深入剖析浏览器

IE Developer ToolBar

• 调试IE下的布局、样式

• 模拟ie7、8的渲染效果

Page 117: 深入剖析浏览器

查看容器的class和id

页面中会高亮显示每个class和id

Page 118: 深入剖析浏览器

查看页面中的div轮廓

窗口中显示div的边界

Page 119: 深入剖析浏览器

测试不同的分辨率

Page 120: 深入剖析浏览器

设置断点,刷新页面

继续执行的控制

输入执行语句并回车

查看执行结果

脚本控制台面板

Page 121: 深入剖析浏览器

探测器面板,查看特定时间段函数执行情况

Page 122: 深入剖析浏览器

HTTP Watch

• 查看页面渲染关键时间点

• 兼容firefox和ie

• 查看 http 瀑布

Page 123: 深入剖析浏览器

页面加载的关键时间点和http请求状态详情

http请求队列

绿线:首次渲染时间

红线:DomReady时间

Page 124: 深入剖析浏览器

Chrome Developer

Tools

• 调试更多高级特性(html5/本地存储)

• 调试CPU和内存的使用率

• 查看页面的reflow

Page 125: 深入剖析浏览器

查看页面的reflow

Page 126: 深入剖析浏览器

特定时间内 内存消耗情况

Page 127: 深入剖析浏览器

特定时间内CPU消耗情况

Page 128: 深入剖析浏览器

• IE对乱码极其敏感

• 浏览器缓存是否清除

• JS代码是否通过了语法检查(JSLint)

• …

保持对IE的警觉

Page 129: 深入剖析浏览器

前端工程师,人人都是Ninja!

Page 130: 深入剖析浏览器

ref

• http://www.stevesouders.com/• http://getfirebug.com • http://developer.yahoo.com/yslow/• http://www.fiddler2.com/fiddler2/• http://www.httpwatch.com/

Page 131: 深入剖析浏览器

@jayliF2E & Translator

htt[p://[email protected]