4.0 CSS基础之盒子模型

1,433 阅读9分钟

盒子模型概念

  • 用来存放网页中的各种元素
  • 网页设计中内容,如文字、图片等元素,都可以视为盒子(DIV嵌套)

盒子模型属性

width属性

宽度: width: 长度值 | 百分比 | auto

最大宽度: max-width:长度值 | 百分比 | auto

最小宽度: min-width:长度值 | 百分比 | auto

设置块级元素和替换元素的内容宽度

百分比是相对父元素的宽度进行操作

举个栗子1:

由于max-width限制了第二段的最大宽度,只能接受比他小的值,所以对整个<p>标签400px的宽度设置,对他不起作用。

由于min-width限制第三段的最小宽度,只能接受比他大的值,所以对整个<p>标签400px的宽度设置,对他产生效果。


举个栗子2:

由于min-width限制第三段的最小宽度,只能接受比他大的值,所以对整个<p>标签400px的宽度设置,对他不起作用。


举个栗子3:

最后一个标签的最小宽度(300px)小于/

标签宽度,所以最后一个标签最小宽度为400px


当 max-width 小于 min-width 时 最小宽度仍为300px

height属性

高度: height: 长度值 | 百分比 | auto

最大高度: max-height:长度值 | 百分比 | auto

最小高度: min-height:长度值 | 百分比 | auto

百分比是相对父元素的高度进行操作

最大值,最小值关系与宽度同理

width和height的使用范围

如果设置一个高度/宽度另一个默认为auto

如果设置宽度不设置高度,高度随内容而定

如果设置高度不设置宽度,<P>宽度宽度为一整行

max和min属性有兼容性问题,IE不支持

可设置高和宽属性的标签:

  • 块级元素 <p><div><h1~6><ul><li><ol><dl><dt><dd>

  • 替换元素 浏览器根据其标签的元素与属性来判断显示的具体内容<img><input><texterea>等

border边框属性

  • border-width: thin | medium | thick |长度值

  • border-color:颜色值 | transparent

  • border-style

  • 边框不同方向设置:

border-[left|right|top|bottom]-width

border-[left|right|top|bottom]-color

border-[left|right|top|bottom]-style

举个栗子

效果如下

不同边框同样有缩写方式:

边框缩写:border:[宽度]|[样式]|[颜色]

不同方向: border-top:[宽度]|[样式]|[颜色]

border-left:[宽度]|[样式]|[颜色]

border-right:[宽度]|[样式]|[颜色]

border-bottom:[宽度]|[样式]|[颜色]

举个栗子

效果如下:

  • border-radius

border-radius可以使元素的边角变圆。

border-radius接受多种长度单位,如百分比,像素,确定元素边角变圆的半径。单个值表示四个角的弧度一致,两个值按分别表示top-left/bottom-righttop-right/bottom-left,输入四个值按顺序分别表示:top-left,top-right,bottom-rightbottom-left

思考border-radius多个值的顺序时(包括margin和padding),记住它们是从左上角开始(margin和padding从上侧开始)按顺时针方向排序的。

div {
  border-radius: 5px;
}

border-radius属性也允许我们使用普通方法书写单个属性值。这些普通的属性以border单词开始,跟着是边角的垂直位置(top 或 bottom),再是边角的横向位置(left 或 right)

最后是半径radius。

举个栗子,要设置<div>右上角的边角半径

div {
  border-top-right-radius: 5px;
}

内边距属性

设置元素的内容与边框之间的距离(内边距或填充),分4个方向(上右下左)

  • padding-top:长度值 |百分比
  • padding-bottom:长度值 |百分比
  • padding-right:长度值 |百分比
  • padding-left:长度值 |百分比

加入填充距离后,容器大小会变化,比如padding-top:30px,整个块的高度会增加30px

举个栗子: 效果如下 当然,内边距也有简写:

外边距属性

设置元素与元素之间的距离(外边距),4个方向(上右下左)

  • margin-top:长度值 |百分比|auto
  • margin-bottom:长度值 |百分比|auto
  • margin-right:长度值 |百分比|auto
  • margin-left:长度值 |百分比|auto

缩写方式:

  • margin值为auto,实现水平方向居中显示
  • 由浏览器计算外边距

如果上下外边距的值一致,左右外边距的值一致,我们可以输入两个值。 设置上下外边距的值在前面。以下例子将上下外边距设置为10像素,将左右外边距设置为20像素:

div {
  margin: 10px 20px;
}

外边距属性

  • 垂直方向,两个相邻元素都设置外边框,外边框会发生合并
  • 合并后外边框高度=两个发生合并外边框的高度总中最大值

position属性

规定元素的定位类型,任何元素都可以定位,绝对或固定元素会生成一个块级框。

类似坐标轴z轴,给一个元素设置position之后,就可以设置z-index值,这个值越大,重叠的时候就越在上面。

描述
absolute生成绝对定位的元素,将对象从文档流中拖出,使用left,right,top,bottom等属性进行绝对定位。
fixed生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。
relative对象不可层叠,但将依据left,right,top,bottom等属性在正常文档流中偏移位置
static默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。
inherit规定应该从父元素继承 position 属性的值。

区别和联系

  • position: relative:相对定位
  1. 不影响元素本身特性(保留元素原本特性)
  2. 不会使元素脱离文档流(即改变位置也不会占用新位置)
  3. 没有定位偏移量时对元素无影响(相对于自身原本位置进行偏移)
  4. 提升层级

相对默认位置产生变化(原来蓝色夹在红色和黄色中间)

图片.png

  • position: absolute:绝对定位
  1. 使元素完全脱离文档流(在文档流中不再占位)
  2. 使内联元素在设置宽高的时候支持宽高
  3. 使区块元素在未设置宽度时由内容撑开宽度
  4. 相对于最近一个有定位的父元素偏移,如果没有找到,那就是以浏览器框为父元素
  5. 相对定位一般配合绝对定位使用(将父元素设置相对定位,使其相对于父元素偏移)
  6. 提升层级

蓝色absolute定位以div框为父元素,脱离文档流不占位子,黄色上去 图片.png


  • position: fixed:固定定位

fixed生成固定定位的元素,上下滚动位置还是固定,相对于浏览器窗口进行定位。

  • position:sticky:就是常见的导航栏,最开始在header下面,向下滚动后,会固定在浏览器最上面。

当容器完整展示的时候,是相对定位,当容器展示不完全时,是固定在顶部的定位。

举个栗子:

h2
  {
  position:absolute;
  left:100px;
  top:150px;
  }
  
<h2>456</h2>

效果如下:

这是绝对距离,跳脱出来以浏览器为边沿,转化为块状元素,距离左边框100px,距离上边框150px

盒子模型计算

设置width和height是设置的内容大小,而不是整个盒子尺寸

标准盒子模型:

盒子在页面中宽度=左边距+左边框+左填充+内容宽度+右填充+右边框+右边距

盒子在页面中高度=上边距+上边框+上填充+内容宽度+下填充+下边框+下边距

IE盒子模型:

盒子在页面中宽度=左边框+左填充(内边距)+内容宽度+右填充(内边距)+右边框

盒子在页面中高度=上边框+上填充(内边距)+内容宽度+下填充(内边距)+下边框

如果没有Doctype文档类型声明,各浏览器按照自己的方式解析 如果有Doctype文档类型声明,按照标准盒子模型来解析


box-sizing

在CSS3中,盒子模型新的计算方法:

这个属性的三个值:

content-box,padding-boxborder-box

(但是box-sizing是CSS3的属性,并不是所有浏览器都是支持,部分老版本浏览器仍然不支持,所以我们使用时需要注意那些浏览器会出现兼容问题)

content-box

默认属性,没什么特别的,计算盒子宽度仍然是需要加上外边距边框和内边距。

padding-box

将padding属性计算入width和height属性,例如width设置为200px,padding设置为20px,那这个元素盒子的实际宽度还是200px。

换言之,内部不管再拥挤也要,一致对外(国共合作抗日),随着内边距增加,给内容的区域会变小,但是整个盒子大小不变。

div{
    box-sizing:padding-box;
}

border-box

将padding属性和border属性计算入width和height属性,例如width设置为200px,padding设置为20px,border设置为10px,那这个元素盒子的实际宽度还是200px。

但是如果增加了margin属性,盒子总大小需要计算他,因为box-sizing并不包含margin属性。

这是最佳选择,只需要管理外边距即可。

举个栗子:

设置了内边距,但是盒子实际大小还是200px

盒子模型的应用

HTML元素分类:

  • 块级元素,占一整行 <p><div><h1~6><ul><li><ol><dl><dt><dd>

  • 行内元素(内联元素),尽量会一行显示 <span><a><em>

display属性

  • block 元素将显示为块级元素,元素前后有换行符

  • inline 元素将显示为行内元素,元素前后没有换行符

  • inline-block 是行内块元素,元素呈现为inline,具有block相应属性

  • none 此元素不会被显示

行内元素粘连效果:

将<span>标签之间的空格去掉就可以粘连在一起

而<div>块级元素标签自动粘连在一起

总结

  1. 相应内联元素(行内元素inline)以及使用display:inline设置成内联元素的元素,width和height属性无效,水平padding和margin有效,垂直padding和margin无效。
  2. 块级元素(div)以及使用display:block设置成块级元素的元素width/height/margin/padding都生效。