首页 > 代码库 > 3.5 盒子之间的关系

3.5 盒子之间的关系

读者要理解前几节的内容并不困难,因为都只涉及一个盒子内部的关系。而实际网页往往是很复杂的,一个网页可能存在着大量的盒子,并且它们以各种关系相互影响着。

要把一个盒子与外部的其他盒子之间的关系理解清楚,并不是简单的事情。在很多CSS资料中大都通过简单的分类,就CSS本身的介绍来说明这个问题,往往只是就事论事。如果不能从站得更高的角度来理解这个问题,那么想真正搞懂它是很困难的,因此这里尝试从更深入的角度来介绍CSS与HTML的关系,希望对读者的理解有所帮助。

为了能够方便地组织各种盒子有序的排列和布局,CSS规范的制定者进行了深入细致的考虑,使得这种方式既有足够的灵活性,以适应各种排版要求,又能使规则尽可能简单,让浏览器的开发者和网页设计师都能够相对容易地实现。

CSS规范的思路是,首先确定一种标准的排版模式,这样可以保证设置的简单化,各种网页元素构成的盒子按照这种标准的方式排列布局。这种方式就是接下来要详细介绍的“标准流”方式。

但是仅通过标准流方式,很多版式是无法实现的,限制了布局的灵活性,因此CSS规范中,又给出了另外若干种对盒子进行布局的手段,包括“浮动”属性和“定位”属性等,这些内容将在下一章中详细介绍。

需要特别提醒读者注意的是,CSS的这些不同的布局方式设计得非常精巧,环环相扣,在后面所有章节中,都是以这些基本的方法和原理为基础的,因此即使是对CSS有一些了解的读者,也应该尽可能仔细地阅读第3章和第4章的内容。把里面的所有实验案例都亲自动手调试一下,这对于深刻理解其中的原理,将会大有益处。lodidance.com

一、HTML与DOM

这里首先介绍DOM的概念。DOM是Document Ohject Model的缩写,即“文档对象模型”。一个网页的所有元素组织在一起.戟构成了一棵“DOM树”。

假没有一个HTML文档,其中的CSS样式部分省略了,这里只关心它的HTML结构。这个网页的结构非常简单,代码如下,示例文件位于网页学习网CSS教程资源“第3章\04.htm”。

  1. <!DOCTYPE html PUBliC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  3. <html xmlns="http://www.w3.org/1999/xhtml"> 
  4.  
  5. <head> 
  6. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
  7. <title>网页教学网-盒子模型的演示</title> 
  8.     <style type="text/css"> 
  9.     body{  
  10.     margin:0 0 0 0;  
  11.     font-family:宋体;  
  12.     font-size:12px;  
  13.       
  14.     }  
  15.       ul {   
  16.         background: #ddd;   
  17.         margin: 15px 15px 15px 15px;  
  18.         padding: 5px 5px 5px 5px;  
  19.                                      /* 没有设置边框 */  
  20.       }  
  21.       li {   
  22.         color: black;                /* 黑色文本 */   
  23.         background: #aaa;            /* 浅灰色背景 */  
  24.         margin: 20px 20px 20px 20px; /* 左侧外边距为0,其余为20像素*/  
  25.         padding: 10px 0px 10px 10px; /* 右侧内边距为0,其余10像素 */  
  26.         list-style: none             /* 取消项目符号 */  
  27.                                      /* 未设置边框 */  
  28.       }  
  29.       li.withborder {  
  30.         border-style: dashed;  
  31.         border-width: 5px;          /* 设置边框为2像素 */  
  32.         border-color: black;  
  33.         margin-top:20px;   
  34.       }  
  35.     </style> 
  36.   </head> 
  37.   <body> 
  38.     <ul> 
  39.       <li>第1个列表的第1个项目内容</li>        
  40.       <li class="withborder">第1个列表的第2个项目内容,内容更长一些,
  41. 目的是演示自动折行的效果。</li> 
  42.     </ul> 
  43.     <ul> 
  44.       <li>第2个列表的第1个项目内容</li> 
  45.       <li class="withborder">第2个列表的第2个项目内容,内容更长一些,
  46. 目的是演示自动折行的效果。</li> 
  47.     </ul> 
  48.   </body> 
  49. </html> 

这个HTML在IE和Firefox浏览器中的显示效果是一样的,如图1所示。

图1 在IE与FireFox中的显示效果
图1 在IE与FireFox中的显示效果

为了使读者能够直观地理解什么是“DOM树”,请读者使用Firefox浏览器打开这个网页,然后选择菜单命令“工具—>DOM查看器”(如果没有可自行添加扩展DOM Inspector,或者使用IE 8 的管理工具也可看到类似效果),这时会打开一个新窗口,如图2所示。

图2 DOM查看器
图2 DOM查看器

窗口左侧列表中的“#document”是整个文档的根节点,双击这个项目,就会打开或关闭它的下级节点,每一个节点都可以打开它的下级节点,直到该节点本身没有下级节点为止。

 图2中显示的是所有节点都打开的效果。这里使用了一棵“树“的形式把一个HTML文档的内容组织起来,形成了严格的层次结构。例如在本例中,body是浏览器窗口中显示的所有对象的根节点,即ul、Ii等对象都是body的下级节点:同理,li又是ul的下级节点。在这棵“DOM树”上的各个节点,都对应于网页上的一个区域,例如用鼠标在“DOM查看器”上单击-li节点.立即可以在浏览器窗口中看到一个红色的矩形框,闪烁若干次,如图2所示,表示该节点在浏览器窗口中所占的区域,这正是前面所说的CSS“盒子”。

到这里,我们已经和CSS“盒子”联系起来了。读者务必要理解,一个HTML文档并不是一个简单的文本文件,而是一个具有层次结构的逻辑文档,每一个HTML元素(例如p、ul、Ii等)都作为这个层次结构中的一个节点存在。每个节点反映在浏览器上会具有不同的表现形式,具体的表现形式正是CSS来决定的。

到这里又印证了一个几乎所有CSS资料中都会提及的一句话:“CSS的目的是使网页的表现形式与内容结构分离,CSS控制网页的表现形式,HTML控制网页的内容结构”,现在读者应该可以更深刻地理解这个原则了。

接下来,就需要理解CSS如何为各种处于层次结构中的元素设置表现形式。

二、标准文档流

这里又出现了一个新的概念——“标准文档流”,或简称“标准流”。所谓标准流,就是指在不使用其他的与排列和定位相关的特殊CSS规则时,各种元素的排列规则。

仍然以上面的网页为例,只观察从body开始的这一部分,其内容是body中有两个列表( ul).每个列表中各有两个列表项目(li)。一共有4层结构,顶层为body.第2层为ul,第3层为li,第4层为li中的文本。这4种元素又可以分为以下两类。

1.块级元素(block level)

li占据着一个矩形的区域,并且和相邻的li依次竖直排列,不会排在同一行中。ul也具有同样的性质,占据着一个矩形的区域,并且和相邻的ul依次竖直排列.不会排在同一行中。因此,这类元素称为“块级元素”( block level),即它们总是以一个块的形式表现出来,并且跟同级的兄弟块依次竖直排列,左右撑满。

2.行内元素(inline)

对于文字这类元素,各个字母之间横向排列,到最右端自动折行,这就是另一种元素,称为“行内元素”(inline)。

比如<strong></strong>标记,就是一个典型的行内元素,这个标记本身不占有独立的区域,仅仅是在其他元素的基础上指出了一定的范围。再比如,最常用的<a>标记.也是一个行内元素。

注意:行内元素在DOM树中同样是一个节点。从DOM的角度来看,块级元素和行内元素是没有区别的,都是树上的一个节点;而从CSS角度来看,二者有很大的区别,块级元素拥有自己的区域,行内元素则没有。

标准流就是CSS规定的默认的块级元素和行内元素的排列方式。那么具体是如何排列的呢?这里读者不妨把自己想象成一名浏览器的开发者,来考虑一下对一段HTML,应该如何放置这些内容。

  1. <body> 
  2.   <ul> 
  3.     <li>第1个列表的第1个项目内容</li>        
  4.     <li class="withborder">第1个列表的第2个项目内容,内容更长一些,
  5. 目的是演示自动折行的效果。</li> 
  6.   </ul> 
  7.   <ul> 
  8.     <li>第2个列表的第1个项目内容</li> 
  9.     <li class="withborder">第2个列表的第2个项目内容,内容更长一些,
  10. 目的是演示自动折行的效果。</li> 
  11.   </ul> 
  12. </body> 

(1) 第一步

从body标记开始,body元素就是一个最大的块级元素,应该包含所有的子元素。依次把其中的子元素放到适当的位置。例如上面这段代码中,body包含了两个ul.就把这两个块级元素竖直排列。至此第一步完成。

(2) 第二步

分别进入每一个ul中,查看它的下级元素,这里是两个li.因此又为它们分别分配了一定的矩形区域。至此第二步完成。

(3) 第三步

再进入li内部,这里面是一行文本,因此按照行内元素的方式,排列这些文字。

如果一个HTML更为复杂,层次更多,那么依然是不断地重复这个过程,直至所有的元素都被检查一遍。该分配区域的分配区域,该设置颜色的设置颜色,等等。伴随着扫描的过
程,样式也就被赋予到每个元素上了。

在这个过程,一个一个盒子自然地形成一个序列,同级别的兄弟盒子依次排列在父级盒子中,同级父级盒子又依次排列在它们的父级盒子中,就像一条河流有干流和支流一样,这就是被称为“流”的原因。

当然实际的浏览器程序的计算过程要复杂得多,但是大致的过程是这样的,因为我们并不打算自己开发一个浏览器,所以不必掌握所有的细节,但是一定要深入理解这些概念。

三、<div>标记与<span>标记

为了能够更好地理解“块级元素”和“行内元素”,这里重点介绍在CSS排版的页面中经常使用的<div>和<span>标记。利用这两个标记,加上CSS对其样式的控制,可以很方便地实现各种效果。本节从二者的基本概念出发,介绍两个标记,并且深人探讨两种元索的区别。

<div>标记早在HTML 3.0时代就已经出现,但那时并不常用,直到CSS的普及,才逐渐发挥出它的优势。<span>标记在HTML 4.0时才被引入,它是专门针对样式表而设计的标记。

<div>( division)简单而言是一个区块容器标记,即<div>与</div>之间相当于一个容器,可以容纳段落、标题、表格、图片,乃至章节、摘要和备注等各种HTML元素。可以把<div>与</div>中的内容视为一个独立的对象,用于CSS的控制。声明时只需要对<div>进行相应的控制,其中的各标记元素都会随之改变。

一个ul是一个块级元素,同样div也是一个块级元素,二者的不同在于ul是一个具有特殊含义的块级元素,具有一定的逻辑语义,而div是一个通用的块级元素,用它可以容纳各种元素,从而方便排版。

下面举一个简单的例子,示例文件位于网页学习网CSS教程资源“第3章\05.htm”。

  1. <html> 
  2. <head> 
  3. <title>网页教学网-div 标记范例</title> 
  4. <style type="text/css"> 
  5. div{  
  6.     font-size:18px;                     /* 字号大小 */  
  7.     font-weight:bold;                   /* 字体粗细 */  
  8.     font-family:Arial;                  /* 字体 */  
  9.     color:#FFFF00;                      /* 颜色 */  
  10.     background-color:#0000FF;           /* 背景颜色 */  
  11.     text-align:center;                  /* 对齐方式 */  
  12.     width:300px;                        /* 块宽度 */  
  13.     height:100px;                       /* 块高度 */  
  14. }  
  15. </style> 
  16. </head> 
  17. <body> 
  18.     <div> 
  19.     这是一个div标记  
  20.     </div> 
  21. </body> 
  22. </html> 

通过CSS对<div>块的控制,制作了一个宽300像素、高100像素的黄色区块,井进行了文字效果的相应设置,在IE中的执行结果如图3所示。

图3 div块示例
图3 div块示例

<span>标记与<div>标记一样,作为容器标记而被广泛应用在HTML语言中。在<span>与</span>中间同样可以容纳各种HTML元素,从而形成独立的对象。如果把“<div>”替换成“<span>”,样式表中把“div”替换成“span”,执行后就会发现效果完全一样;可以说<div>与<span>这两个标记起到的作用都是独立出各个区块,在这个意义上说二者没有不同。

<div>与<span>的区别在于,<div>是一个块级元素,它包围的元素会自动换行。而<span>仅仅是一个行内元素(inline elements),在它的前后不会换行。<span>没有结构上的意义.纯粹是应用样式,当其他行内元素都不合适时,就可以使用<span>元素。

例如有如下代码。lodidance.com

  1. <html> 
  2. <head> 
  3. <title>网页教学网-div与span的区别</title> 
  4. </head> 
  5. <body> 
  6. <p>div标记不同行:</p> 
  7. <div>网页学习网lodidance.com</div> 
  8. <div>网页学习网lodidance.com</div> 
  9. <div>网页学习网lodidance.com</div> 
  10. <p>span标记同一行:</p> 
  11. <span>网页学习网lodidance.com</span> 
  12. <span>网页学习网lodidance.com</span> 
  13. <span>网页学习网lodidance.com</span> 
  14. </body> 
  15. </html> 

其执行的结果如图4所示。<div>标记的3条语句被分在了3行中,而<span>标记的语句没有换行。

图4 <div>与<span>标记的区别
图4 <div>与<span>标记的区别

此外,<span>标记可以包含于<div>标记中,成为它的子元素,而反过来则不成立,即<span>标记不能包含<div>标记。从div和span之间的区别和联系,就可以更深刻地理解块级元素和行内元素的区别了。

点击下载第1~7章CSS教程资源 返回《CSS教程布局之道》教程列表

编辑:网页学习网
本文地址:http://www.lodidance.com/css/jc/670.html