910 likes | 1.06k Views
CSS 的盒子模型. CSS 的盒子模型. 盒子模型是 CSS 的基石之一 , 它指定元素如何显示以及 ( 在某种程度上)如何相互交互 页面上的每个元素都被浏览器看成是一个 矩形的盒子 ,这个盒子由元素的 内容 、 填充 、 边框 和 边界 组成。 网页就是由许多个盒子通过不同的排列方式(上下排列,并列排列,嵌套排列)堆积而成。. CSS 的盒子模型. CSS 的盒子模型. 每个 HTML 元素都可以看作是一个装了东西的盒子
E N D
CSS的盒子模型 • 盒子模型是CSS的基石之一,它指定元素如何显示以及(在某种程度上)如何相互交互 • 页面上的每个元素都被浏览器看成是一个矩形的盒子,这个盒子由元素的内容、填充、边框和边界组成。 • 网页就是由许多个盒子通过不同的排列方式(上下排列,并列排列,嵌套排列)堆积而成。
CSS的盒子模型 • 每个HTML元素都可以看作是一个装了东西的盒子 • 盒子里面的内容到盒子的边框之间的距离即填充(padding),盒子本身有边框(border),而盒子边框外和其它盒子之间,还有边界(magin),如图所示 • 默认情况下盒子的边框是无,背景色是透明,所以我们在默认情况下看不到盒子
height margin-top border-top padding-top width padding-right padding-left border-right margin-right border-left content margin-left padding-bottom border-bottom margin-bottom
元素盒子大小的计算 一个元素实际宽度=左边界+左边框+左填充+内容宽度+右填充+右边框+右边界
IE quirk模式下盒子的宽度 • 当将文档声明DOCTYPE删除后,IE 6对网页的解释会进入quirk(怪异)模式,此时盒子的宽度等于左边界+宽度+右边界 • 因此当使用了盒子属性后切忌删除DOCTYPE
CSS盒子模型计算题 • 如果盒子里面嵌套有盒子,且两个盒子都有边框,那么两个盒子边框之间的距离等于外面盒子的填充值+里面盒子的边界值
<style type="text/css"> #box1 { background-color: #ddd; margin:15px; padding:5px; } #box2 { color: black; background-color: #aaa; margin: 20px; padding: 10px 0px 10px 10px; width:100px;} body{border:1px dotted #FF0000} </style> </head> <body> <div id="box1"><div id="box2">这是里面的盒子</div> </body>
边框border属性 • 盒子模型的margin和padding属性比较简单,只能设置宽度值,最多分别对上、右、下、左设置宽度值。而边框border则可以设置宽度、颜色和样式。 • 分别是border-width(宽度)、border-color(颜色)和border-style(样式)其中border-style属性可以将边框设置为实线(solid)、虚线(dashed)、点划线(dotted)、双线(double)等效果
内 容 边框border属性 • 边框border属性有个有趣的特点,即两条交汇的边框之间是一个斜角,我们可以通过为边框设置不同的颜色,再利用这个斜角,制作出像三角形一样的效果
填充padding属性 • 填充padding属性,也称为盒子的内边距。就是盒子边框到内容之间的距离,和表格的填充属性(cellpadding)比较相似。如果填充属性为0,则盒子的边框会紧挨着内容,这样通常不美观。 • 当对盒子设置了背景颜色或背景图像后,那么背景会覆盖padding和内容组成的范围,并且默认情况下背景图像是以padding的左上角为基准点在盒子中平铺的
盒子模型的特性 • 边界值margin可为负,填充padding不可为负 • 边框border默认值为0,即不显示 • 行内元素,如a,定义上下边界不影响行高
对盒子模型的思考 • 边框是实的,我们可以看到实实在在的边框,而填充和边界都是虚的,我们只能看到他们对元素的影响 • 盒子模型中只能设置两类颜色,即边框颜色和背景颜色 • 盒子模型可设置三类距离,即边界距离margin,填充距离padding和边框值border
属性值的简写形式 • 方法是按照规定的顺序,给出2个、3个或者4个属性值,它们的含义将有所区别,具体含义如下: • 如果给出2个属性值,前者表示上下边框的属性,后者表示左右边框的属性; • 如果给出3个属性值,前者表示上边框的属性,中间的数值表示左右边框的属性,后者表示下边框的属性; • 如果给出4个属性值,依次表示上、右、下、左边框的属性,即顺时针排序。
各种元素盒子属性的默认值 • 大部分html元素的盒子属性(margin, padding)默认值都为0; • 有少数html元素的(margin, padding)浏览器默认值不为0,例如:body,p,ul,li,form标记等,因此我们有时有必要先设置它们的这些属性为0。 • Input元素的边框属性默认不为0,我们可以设置为0达到美化表单中输入框和按钮的目的。
4.5.2 盒子模型的应用 • 1. 美化表单 • 网页中的表单控件在默认情况下背景都是灰色的,文本框边框是粗线条带立体感的,不够美观。下列代码通过CSS改变表单的边框样式、颜色和背景颜色让文本框,按钮等变得漂亮些。
用盒子美化表格 • 让表格的外边框为2象素 • 首先用间距制作1像素边框的表格,然后用css为table元素加一个1象素宽的border • 制作1象素虚线边框 • 首先将表格的边框和间距设为0,然后设置table的CSS上边框和左边框为1象素虚线,再设置td的css下边框和右边框为1象素虚线
盒子的三种定位形式 • 在标准流下的定位 • 在浮动属性下的定位 • 在定位属性下的定位 • 除非设置浮动属性或定位属性,否则所有盒子都是在标准流中定位。顾名思义,标准流中元素盒子的位置由元素在HTML中的位置决定。
标准流 • HTML元素在标准状况下的定位方式 • 行内元素在同一行内横向排列 • 块级元素占满整个一行,在页面中竖向排列 • 元素不会移动到其它地方去,对于嵌套的元素盒子也是嵌套的关系
标准流下的盒子排列分析 <style type="text/css"> * { border: 2px dashed #FF0066; padding: 10px; margin: 2px; } body {border:2px solid blue;} a {border:2px dotted blue;} </style> <html><body> <div>网页的banner(块级元素)</div> <a href="#">行内元素1</a><a href="#">行内2</a> <a href="#">行内3</a> <div>这是无名块<p>这是盒子中的盒子</p></div> </body></html>
行内元素的盒子 • 行内元素的盒子永远只能在浏览器中得到一行高度的空间(行高由line-height属性决定,如果没设置该属性,则是内容的默认高度),如果给它设置上下border,margin,padding等值,导致其盒子的高度超过行高,那么它的盒子上下部分将和其他元素的盒子重叠。 • 因此,不推荐对行内元素直接设置盒子属性,一般先设置行内元素以块级元素显示,再设置它的盒子属性。
改变行内元素的高度 • 如图所示,当增加行内元素的边界和填充时,行内元素a占据浏览器的高度并没有增加,下面这个div块仍然在原来的位置,导致行内元素盒子的上下部分重叠,而左右部分不会受影响
display属性 • 通过display属性可控制元素是以行内元素显示还是以块级元素显示,或不显示 • display:block | inline | none | list-item
block元素 • block元素的特点是:总是在新行上开始;高度,行高以及顶和底边距都可控制;宽度缺省是它的容器的100%,除非用width设定一个宽度<div>, <p>, <h1>, <form>, <ul> 和 <li>是块元素的例子。
inline元素 inline元素的特点是: • 和其他元素都在一行上 • 高,行高及顶和底边距不可改变; • 宽度就是它的文字或图片的宽度,不可改变。<span>, <a>, <label>, <input>, <img>, <strong> 和<em>是inline元素的例子
列表项元素display: list-item • 在html中只有li元素默认是此类型,将元素设置为列表项元素后将按列表元素显示,再通过设置列表选项可使元素的左边出现小黑点。
隐藏元素display: none; • 当某个元素被设置成了隐藏元素之后,浏览器会完全忽略掉这个元素,该元素将不会被显示,也不会占据文档中的位置。像title元素默认就是此类型。 • 比较visibility: hidden; • 制作下拉菜单、tab面板等有时就需要用display: none把菜单或面板隐藏起来
需要使用display属性切换的情况 • 让一个inline元素从新行开始; • 让块元素和其他元素保持在一行上; • 控制inline元素的宽度; • 控制inline元素的高度(对导航条特别有用); • 无须设定宽度即可为一个块元素设定与文字同宽的背景色
标准流下定位的应用-制作竖直导航菜单 #nav a { font-size: 14px; color: #333333; text-decoration: none; background-color: #CCCCCC; display: block; width:140px; padding: 6px 10px 4px; border: 1px solid #000000; margin: 2px; } #nav a:hover { color: #FFFFFF; background-color: #666666; }
盒子的margin在标准流中的计算 • 实验1——行内元素之间的水平margin span.left{ margin-right:30px; background-color:#a9d6ff; } span.right{ margin-left:40px; background-color:#eeb0b0; }
行内元素之间的水平margin • 行内元素之间的水平margin不会叠加 margin-right margin-left span 1 span 2
块级元素之间的上下margin • 实验2——块级元素之间的竖直margin <body> <div style="margin-bottom:50px;">块元素1</div> <div style="margin-top:30px;">块元素2</div> </body> 块元素1 块元素1 margin-bottom:50px margin-bottom:50px margin-top:30px 块元素2 块元素2
空白边叠加 • 当一个元素包含在另一个元素中时,若父元素的边框和填充为0,此时父元素和子元素的margin挨在一起,那么父元素的上下margin也会和子元素的上下margin发生叠加。若父元素的边框或填充不为0,那么父元素和子元素的margin会被分隔开,因此不存在叠加的问题。 • 经验:如果有盒子嵌套,要调整外面盒子和里面盒子之间的距离,一般用外面盒子的padding来调整,不要用里面盒子的margin,这样可以避免空白边叠加的现象出现
嵌套盒子之间的margin • 盒子在标准流中的定位原则 • 实验3——嵌套盒子之间的margin
嵌套盒子在IE和Firefox中的不同显示 • 当一个块元素包含在另一个块元素中时,若对父块设置高度,但父块的高度不足以容纳子块时,IE将使父块的高度自动伸展,达到能容纳子块的最小高度为止;若同时设置了子块高度,IE有时使子块高度自动压缩,直到能容纳内容的最小高度为止。而Firefox对父块和子块均以定义的高度为准,父块高度不会伸展,任其子块露在外面,子块高度也不会压缩。 • 从这里可以看出,Firefox对元素的高度解释严格按照我们设定的高度执行,而IE对元素高度的设定有点自作主张的味道,它总是使标准流中子元素的盒子包含在父元素盒子当中。
CSS的背景属性 • 背景(background)是网页中常用的一种表现方法,无论是单纯的背景颜色还是背景图片,都能为网页带来丰富的视觉效果,HTML的很多元素都具有bgcolor和backgroud属性,可以设置背景颜色和背景图片,如(table、td等),但形式比较单一,对背景图片的设定,只支持在X轴和Y轴都平铺的方式,因此,如果同时设置了背景颜色和背景图片,那么背景颜色将被背景图片挡住,以背景图片来显示。 • 而CSS对元素的背景设置,则提供了更多的途径,如背景图片既可以平铺也可以不平铺,还可以在X轴平铺或在Y轴平铺,当背景图片不平铺时,并不会完全挡住背景颜色,因此可以综合设置背景颜色和背景图片达到希望的效果。 • CSS的背景属性是backgroud或以backgroud开头
各个背景属性的默认值 • background-color: transparent 透明模式 • background-image: none • background-repeat: repeat 平铺 • background-attachment: scroll • background-position: 0% 0%
background属性的缩写 • background属性是所有背景属性的缩写形式,就像font属性一样,其缩写顺序为: • background: background-color || background-image || background-repeat || background-attachment || background-position • 如body {background:#EFF4FF url(images/body_bg.jpg) repeat-x fixed;}
DW中的背景设置面板 background-color:#0099cc background-image: url(img/bottom.gif) background-repeat: no-repeat background-attachment: no-repeat background-position: right bottom
背景的运用技巧 • 同时运用背景颜色和背景图片 • 控制背景在盒子中的位置及是否平铺 • 多个元素背景的叠加 • 滑动门技术 • 背景位置的控制-实现图片的翻转 • 圆角的设计方法总结
同时运用背景颜色和背景图片 • 目前网页中流行采用一种渐变背景,即网页的背景从上至下由一种深颜色过渡到一种浅颜色,由于网页的长度通常是不好估计的,所以无法用一幅背景图片来做这种渐变背景,只能在网页的上部用渐变的图片做背景,下部使用用一种和图片下部颜色相同的颜色做背景色 • 通过在CSS中设置body标记的背景颜色和背景图片,并把背景图片设置为横向平铺就可以实现渐变背景了。 • body{background:#666666 url(xxwlzx/body_bg.gif) repeat-x;}
控制背景在盒子中的位置及是否平铺 • 在html中,背景图像只能平铺,而在CSS中,背景图像能做到精确定位,允许不平铺,效果就像普通的图像元素一样。因此有人建议所有的网页图像都作为元素的CSS背景引入。例如下面的网页的背景就是用让背景图片不平铺并且定位于右下角实现的。 body { background: #F7F2DF url(cha.jpg) no-repeat right bottom ; }
li元素的背景应用 • 通过背景图片不平铺的技术还可以用来改变列表的项目符号,虽然使用列表元素ul的CSS属性list-style-image:url(arrow.gif)可以将列表项前面的小黑点改变成自定义的小图片,但无法调整小图片和列表文字之间的距离。 • 要解决这个问题,可以将小图片设置成li元素的背景,不平铺,且居左,为防止文字遮住图片,将li元素的左padding设置成20px,这样还可通过调整左padding的值实现任意调整列表小图片和文字之间的距离。