第5章 CHAPTER 5 CSS高级应用 5.1CSS布局 5.1.1案例描述 浏览淘宝、京东等购物网站或者新浪、腾讯等新闻网页时,网页中板块分明,内容分割明确,参见图51。本节将利用布局等方式来实现如图51所示的效果。 图51案例描述 5.1.2知识引入 1. CSS盒模型 1) CSS盒模型概述 图52盒模型示意图 盒模型是CSS定位布局的核心内容,它指定元素如何显示以及如何相互交互。页面上的每个元素都被看作为一个矩形框,这个框由元素的内容、内边距、边框和外边距组成。HTML中大部分的元素(特别是块状元素)都可以看作一个盒子,网页元素的定位实际就是这些大大小小的盒子在页面中的定位。这些盒子在页面中是“流动”的,当某个块状元素被CSS设置了浮动属性,那么这个盒子就会“流”到上一行。网页布局即关注这些盒子在页面中如何摆放、如何嵌套的问题。这么多盒子摆在一起,最需要关注的是盒子尺寸计算、是否流动等要素,如图52所示。 2) CSS内边距 内边距(padding)出现在内容区域的周围。如果在元素上添加背景,那么背景应用于元素的内容和内边距组成的区域。因此可以用内边距在内容周围创建一个隔离带,使内容不与背景混合在一起。当元素的内边距被清除时,所“释放”的区域将会被元素背景颜色填充,取值方式如表51所示。 表51内边距属性取值 值说明 length定义一个固定的填充(px、pt、em等) %使用百分比值定义一个填充 在CSS中,它可以指定在不同的侧面不同的填充效果: padding-top:25px; padding-bottom:25px; padding-right:50px; padding-left:50px; 为了缩短代码,可以在一个属性中指定所有的填充属性。 这就是所谓的缩写属性。所有的内边距属性的缩写属性是"padding",可以有1~4个值。 (1) padding: 25px 50px 75px 100px。 上填充为25px。 右填充为50px。 下填充为75px。 左填充为100px。 (2) padding: 25px 50px 75px。 上填充为25px。 左右填充为50px。 下填充为75px。 (3) padding: 25px 50px。 上下填充为25px。 左右填充为50px。 (4) padding: 25px。 所有的填充都是25px。 示例代码如下所示:
这是一个没有指定填充边距的段落。
这是一个指定填充边距的段落。
这是一个指定填充边距的段落。
通过IE查看该HTML,内边距效果如图53所示。 图53内边距效果 3) CSS边框 CSS边框属性允许指定一个元素边框的样式和颜色。 (1) 边框样式(bordestyle)。 边框样式属性指定要显示什么样的边界,边框样式属性用来定义边框的样式。 边框样式属性演示如图54所示。 图54边框样式属性演示 (2) 边框宽度(borderwidth)。 可以通过边框宽度属性为边框指定宽度。 为边框指定宽度有两种方法: 可以指定长度值,比如2px或0.1em(单位为px、pt、cm、em等); 或者使用3个关键字之一,分别是thick、medium(默认值)和thin。 注意: CSS没有定义3个关键字的具体宽度,所以一个用户可能把thick、medium和thin分别设置为等于5px、3px和2px,而另一个用户则分别设置为3px、2px和1px。 (3) 边框颜色(bordercolor)。 边框颜色属性用于设置边框的颜色。设置颜色的方式有以下4种: name——指定颜色的名称,如"red"。 RGB——指定RGB值,如"rgb(255,0,0)"。 Hex——指定十六进制颜色值,如"#ff0000"。 还可以设置边框的颜色为"transparent"。 注意: bordercolor单独使用是不起作用的,必须先使用borderstyle来设置边框样式。 (4) 边框属性。 可以在一个属性中设置边框。 如在"border"属性中设置: borderwidth。 borderstyle(required)。 bordercolor。 示例代码如下所示:边框演示
通过IE查看该HTML,结果如图55所示。 图55边框属性演示 4) CSS外边距 外边距(margin)属性定义元素周围的空间。外边距清除周围的元素外边区域。外边距没有背景颜色,是完全透明的外边距可以单独改变元素的上、下、左、右边距,也可以一次改变所有的属性。外边距属性取值方式如表52所示。 表52margin取值 属性说明 length定义一个固定的margin(使用px、pt、em等) %定义一个使用百分比的边距 auto设置浏览器边距。其结果依赖于浏览器 外边距可以使用负值进行页面内容的重叠,在CSS中,可以指定不同的侧面不同的边距。 margin-top:100px; margin-bottom:100px; margin-right:50px; margin-left:50px; 为了缩短代码,可以使用“margin”表示所有外边距属性。这就是所谓的缩写属性。 所有外边距属性的缩写属性是"margin": margin属性可以有1~4个值。 (1) margin——25px 50px 75px 100px。 上边距为25px。 右边距为50px。 下边距为75px。 左边距为100px。 (2) margin——25px 50px 75px。 上边距为25px。 左、右边距为50px。 下边距为75px。 (3) margin——25px 50px。 上下边距为25px。 左右边距为50px。 (4) margin——25px。 所有的4个边距都是25px。 示例代码如下所示:没有指定边距大小的段落。
指定边距大小的段落。
指定边距大小的段落。
指定边距大小的段落。
通过IE查看该HTML,结果如图56所示。 图56外边距属性示例 5) CSS轮廓 轮廓(outline)是绘制于元素周围的一条线,可指定元素轮廓的样式、颜色和宽度。轮廓是指边框边缘,可起到突出元素的作用。表53定义了所有轮廓属性。 表53轮廓属性 属性说明值 outline在一个声明中设置所有的轮廓属性outlinecolor outlinestyle outlinewidth inherit outlinecolor设置轮廓的颜色colorname hexnumber rgbnumber invert inherit outlinestyle设置轮廓的样式none dotted dashed solid double groove ridge inset outset inherit outlinewidth设置轮廓的宽度thin medium thick length inherit 示例代码如下所示:注意: 如果只有一个 !DOCTYPE 指定 IE 8 支持 outline 属性。
通过IE查看该HTML,CSS轮廓效果如图57所示。 图57CSS轮廓属性示例 2. 盒模型布局 1) 盒模型显示类型 CSS中盒模型(box model)分为两种: 一种是W3C的标准模型,另一种是IE的传统模型,它们的相同之处是都是对元素计算尺寸的模型,具体来说,就是对元素的width、height、padding、border以及元素实际尺寸的计算; 它们的不同之处是两者的计算方法不一致。 (1) W3C的标准盒模型。 /*外盒尺寸计算(元素空间尺寸)*/ Element空间高度 = content height + padding + border + margin Element 空间宽度 = content width + padding + border + margin /*内盒尺寸计算(元素大小)*/ Element Height = content height + padding + border (height为内容高度) Element Width = content width + padding + border (width为内容宽度) (2) IE的传统盒模型。 /*外盒尺寸计算(元素空间尺寸)*/ Element空间高度 = content height + margin (height包含了元素内容宽度、边框宽度、内距宽度) Element空间宽度 = content width + margin (width包含了元素内容宽度、边框宽度、内距宽度) /*内盒尺寸计算(元素大小)*/ Element Height = content height(height包含了元素内容宽度、边框宽度、内距宽度) Element Width = content width(width包含了元素内容宽度、边框宽度、内距宽度) 为了帮助大家理解,下面看一个实际的例子。比如现在有一个叫boxtest的Div,它具有下面的属性: .boxtest { width: 200px; height: 200px; border: 20px solid black; padding: 50px; margin: 50px; } W3C标准下的盒模型,盒子的总宽度/高度=width/height+padding+border+margin。 IE传统模式下的盒模型,盒子的总宽度和高度是包含内边距(padding)和边框(border)宽度在内的,盒子的总宽度/高度=width/height+margin=内容区宽度/高度+padding+border+margin。 也就是说,盒子宽高=内容区域的宽高+padding+border。 可以看出,IE6以下版本浏览器的宽度包含了元素的padding和border值,换句话说,在IE6以下版本中,内容真正的宽度是width-padding-boder)。用内外盒来说,W3C标准浏览器的内盒宽度等于IE6以下版本浏览器的外盒宽度。 2) CSS3伸缩盒布局 CSS3引入的布局模式伸缩盒布局(Flexbox),主要思想是让容器有能力改变其子项目的宽度和高度,以最佳方式填充可用空间。伸缩盒布局使用Flex项目可以自动放大与收缩,用来填补可用的空闲空间。更重要的是,伸缩盒布局方向不可预知,不像常规的布局(块级从上到下、内联从左到右),而那些常规的页面布局,对于大型或者复杂的应用程序就缺乏灵活性。 如果常规布局是基于块和内联文本流方向,那么伸缩盒布局就是基于Flexflow方向。先来了解一下伸缩盒布局的一些专用术语。伸缩盒布局模型如图58所示。 图58伸缩盒布局模型 主轴: flex容器的主轴主要用来配置Flex项目。它不一定是水平的,这主要取决于flexdirection属性。 主轴起点、主轴终点: Flex项目的配置从容器的主轴起点开始,往主轴终点结束。 主轴长度: Flex项目在主轴方向的宽度或高度就是项目的主轴长度,Flex项目的主轴长度属性是width或height属性,具体由对着主轴方向的那一个决定。 侧轴: 与主轴垂直的轴称作侧轴,是侧轴方向的延伸。 侧轴起点、侧轴终点: 伸缩行的配置从容器的侧轴起点开始,往侧轴终点结束。 侧轴长度: Flex项目在侧轴方向的宽度或高度就是项目的侧轴长度,Flex项目的侧轴长度属性是widht或height属性,具体由对着主轴方向的那一个决定。 (1) flex容器属性。 display: flex | inline-flex; 定义一个flex容器、内联或者根据指定的值,来作用于下面的子类容器: box: 将对象作为弹性伸缩盒显示。 inlinebox: 将对象作为内联块级弹性伸缩盒显示。 flexbox: 将对象作为弹性伸缩盒显示。 inlineflexbox: 将对象作为内联块级弹性伸缩盒显示。 flex: 将对象作为弹性伸缩盒显示。 inlineflex: 将对象作为内联块级弹性伸缩盒显示。 请注意: ① CSS列(CSS columns)在弹性盒中不起作用。 ② float、clear和verticalalign在Flex项目中不起作用。 flexdirection(适用于父类容器的元素上)。 定义: 设置或检索伸缩盒对象的子元素在父类容器中的位置。 flex-direction: row | row-reverse | column | column-reverse row: 横向从左到右排列(左对齐),默认的排列方式。 rowreverse: 反转横向排列(右对齐),从后往前排,最后一项排在最前面。 column: 纵向排列。 columnreverse: 反转纵向排列,从后往前排,最后一项排在最上面。 若使flex生效,则需定义其父元素display为flex或inlineflex(box或inlinebox,这是旧的方式)。 示例代码如下所示:clip 属性剪切了一幅图像: