10-7 CSS3 盒子模型
本节编程练习不计算学习进度,请电脑登录imooc.com操作

CSS3 盒子模型

CSS中有一种基础设计模式叫盒模型,盒模型定义了Web页面中的元素中如何来解析。CSS中每一个元素都是一个盒模型,包括html和body标签元素。在盒模型中主要包括width、height、border、background、padding和margin这些属性,而且他们之间的层次关系可以相互影响,来看一张盒模型的3D展示图:

(单击可放大)

从图中可以看出padding属性和content属性层叠background-image属性,层叠background-color属性,这个是存在的,它们四者之间构成了Z轴(垂直屏幕的坐标)多重层叠关系。但是border属性与margin属性、padding属性三者之间应该是平面上的并级关系,并不能构成Z轴的层叠关系。

box-sizing:

在CSS中盒模型被分为两种,第一种是w3c的标准模型,另一种是IE的传统模型,它们相同之处都是对元素计算尺寸的模型,具体说不是对元素的width、height、padding和border以及元素实际尺寸的计算关系,它们不同之处是两者的计算方法不一致,原则上来说盒模型是分得很细的,这里所看到的主要是外盒模型和内盒模型,如下面计算公式所示:

  1. W3C标准盒模型
外盒尺寸计算(元素空间尺寸)

element空间高度=内容高度+内距+边框+外距

element空间宽度=内容宽度+内距+边框+外距

内盒尺寸计算(元素大小)

element高度=内容高度+内距+边框(height为内容高度)

element宽度=内容宽度+内距+边框(width为内容宽度)

2.IE传统下盒模型(IE6以下,不包含IE6版本或”QuirksMode下IE5.5+”)

外盒尺寸计算(元素空间尺寸)

element空间高度=内容高度+外距(height包含了元素内容宽度、边框、内距)

element宽间宽度=内容宽度+外距(width包含了元素内容宽度、边框、内距)

内盒尺寸计算(元素大小)

element高度=内容高度(height包含了元素内容宽度、边框、内距)

element宽度=内容宽度(width包含了元素内容宽度、边框、内距)

在CSS3中新增加了box-sizing属性,能够事先定义盒模型的尺寸解析方式,其语法规则如下:

box-sizing: content-box | border-box | inherit

取值说明

属性值

属性值说明

content-box

默认值,其让元素维持W3C的标准盒模型,也就是说元素的宽度和高度(width/height)等于元素边框宽度(border)加上元素内距(padding)加上元素内容宽度或高度(content width/ height),也就是element width/height = border + padding + content width / height

border-box

重新定义CSS2.1中盒模型组成的模式,让元素维持IE传统的盒模型(IE6以下版本和IE6-7怪异模式),也就是说元素的宽度或高度等于元素内容的宽度或高度。从上面盒模型介绍可知,这里的内容宽度或高度包含了元素的border、padding、内容的宽度或高度(此处的内容宽度或高度=盒子的宽度或高度—边框—内距)。

inherit

使元素继承父元素的盒模型模式

其中最为关键的是box-sizing中content-box和border-box两者的区别,他们之间的区别可以通过下图来展示,其对盒模型的不同解析:

(单击可放大)

任务

在自适应布局当中,在元素基础上添加内距padding,按照标准盒模型解析,往往会将布局撑破,但使用box-sizing的border-box值,可以让你轻松完成。在CSS编辑器第49-53行输入正确代码,让布局能正常显示。注:考虑浏览器的兼容性。

补全代码后,效果如下图所示:

(单击可放大)

温馨提示:案例的效果如上图所示才算顺利通关,否则请再学习一遍本节的知识点!

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>盒子模型</title>
  6. <link href="style.css" rel="stylesheet" type="text/css">
  7. </head>
  8. <body>
  9. <div id="header"><h1>Header Content</h1></div>
  10. <div id="page">
  11. <div class="main"><h1>Main Content</h1></div>
  12. <div class="sidebar"><h1>Sidebar Content</h1></div>
  13. </div>
  14. <div id="footer"><h1>Footer Content</h1></div>
  15. </body>
  16. </html>
  1. h1 {
  2. font-size: 20px;
  3. margin: 0;
  4. color: #fff;
  5. }
  6. #page:after,
  7. #page:before{
  8. content:"";
  9. display: table;
  10. }
  11. #page:after{
  12. clear:both;
  13. overflow: hidden;
  14. }
  15.  
  16. #page {
  17. margin-bottom: 20px;
  18. }
  19. #header {
  20. width: 100%;
  21. background: green;
  22. margin-bottom: 10px;
  23. padding: 20px;
  24. }
  25. .main {
  26. width: 60%;
  27. padding: 20px;
  28. background: orange;
  29. float: left;
  30. }
  31. .sidebar {
  32. width: 38%;
  33. float: right;
  34. background: #f36;
  35. padding: 20px;
  36. }
  37.  
  38. #footer {
  39. width: 100%;
  40. background: #36f;
  41. padding: 20px;
  42. clear:both;
  43. }
  44.  
  45. #header,
  46. .main,
  47. .sidebar,
  48. #footer {
  49. -webkit-?;
  50. -moz-?;
  51. -o-?;
  52. -ms-?;
  53. ;
  54. }
下一节