暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

快速了解CSS盒模型

海人为记 2020-09-20
294

概念

当对文档进行布局时,所有元素会根据CSS盒模型进行渲染。CSS决定盒子的大小、位置以及其它属性。

模型

盒模型又称框模型(Box Model),由内容content
、内边距padding
、边框border
和外边距margin
四部分组成。

标准模型元素宽度width=content-width
,高度height=content-height

而IE模型元素宽度width=content-width+padding-left+padding-right+border-left+border-right
,高度height=content-height+padding-top+padding-bottom+border-top+border-bottom

盒模型计算方式

W3C的标准盒子中盒子尺寸的计算:

element
空间宽度width
=content-width
+padding-left
+padding-right
+border-left
+border-right
+margin-left
+margin-right

element
空间高度height
=content-height
+padding-top
+padding-bottom
+border-top
+border-bottom
+margin-top
+margin-bottom

外边距(margin
)为元素之间的距离,盒子的尺寸并没有改变,因此不计算在内,则element
空间的实际尺寸计算:

element
空间宽度width
=content-width
+padding-left
+padding-right
+border-left
+border-right

element
空间高度height
=content-height
+padding-top
+padding-bottom
+border-top
+border-bottom

Content

Cotent
:用于展示盒子的内容,例如文本、图像或视频等。大小为Content
的宽高,含有背景颜色(默认为透明)或背景图像。

在设置区域大小之前,先明确width
min-width
max-width
height
min-height
max-height

width
属性给定元素设置宽度,height
属性给定元素设置高度。

min-width
属性为给定元素设置最小宽度值。width
属性的值不得低于min-width
的值。max-width
属性为给定元素设置最大宽度值,定义了max-width
的元素会在达到max-width
之后避免进一步按照width
属性设置变大。

max-width
属性会覆盖width
的设置,而 min-width
设置的值会同时覆盖max-width
width

min-height
属性为给定元素设置最小高度值。height
属性的值不得低于min-height
的值。max-height
属性为给定元素设置最大高度值。height
属性的值不得高于max-height
的值。

max-height
属性会覆盖height
设置的值,而min-height
会覆盖max-height
的值。

min-width
max-width
min-height
max-height
的语法相同。

/*<length> value*/
min-width: 3.5em;
/*<percentage> value*/
max-width: 75%;
/*keyword values*/
max-widthnone;
min-heightmax-content;
max-widthmin-content;
max-heightfit-content
min-widthfill-available;
/*Global values*/
max-widthinherit;
max-widthinitial;
max-heightunset;

看一下这些属性可以赋予的值:

  • length
    (单位长度),例如1px
    2cm
    3mm
    4Q
    5in
    6pc
    7pt
    8em
    9rem
  • percentage
    (百分比:相对于父元素长度来鵆定),例如:50%
  • auto
    用于弹性元素的默认最小宽度,相比其它布局中以0
    为默认值,auto
    能为弹性布局指明更合理的默认表现;
  • max-content
    固有最大宽度;
  • min-content
    固有最小宽度;
  • fill-content
    包含块的宽度减去水平margin
    border
    padding
  • fit-content
    等同于min(max-content, max(min-content, fill-available))
  • none
    元素未设置最大值,max-width
    可以使用该值。

Padding

Padding
:对内容区域的扩展,背景为Content
的延伸(默认为透明),内边距是不允许有赋值的。

  • padding-top
    :元素内边距区域上方的高度。
  • padding-left
    :元素内边距区域左边的宽度。
  • padding-bottom
    :元素内边距区域下方的高度。
  • padding-right
    :元素内边距区域右边的宽度。

四个方向的内边距可以使用padding
简写控制内边距区域。

/*应用于所有边*/
paddinglem;
/*上边下边 | 左边右边*/
padding: 5% 10%;
/*上边 | 左边右边 | 下边*/
padding: 1em 2em 2em;
/*上边 | 右边 | 下边 | 左边*/
padding: 5px 1em 0 2em;
/*全局值*/
paddinginherit;
paddinginitial;
paddingunset;

padding
属性接受1~4个值。每个值可以是<length>
<percentage>
。取值不能为负。

  • 一个值时,统一应用到四个边的内边距。
  • 两个值时,第一个值应用到上边和下边的内边距,第二只应用到左边和右边的内边距。
  • 三个值时,第一个值应用到上边的内边距,第二个值应用到右边和左边的内边距,第三个值应用到下边的内边距。
  • 四个值时,顺时针方向作为上边、右边、下边和左边的内边距。

Border

Border
:对内边距的扩展,是盒模型的边框区域。如何盒模型设有背景(background-color
background-image
),则会一直延伸至边框的外沿,而边框会盖在背景上。

border-width
:设置盒模型边框的宽度。它是border-top-width
border-right-width
border-bottom-width
border-left-width
的简写。

/*应用于所有边*/
border-width: 5px;
/*左右边 | 上下边*/
border-width: 2px 1.5em;
/*上边 | 左右边 | 下边*/
border-width: 1px 2em 1.5cm
/*上边 | 右边 | 下边 | 左边*/
border-width: 1px 2em 0 4rem;
/*使用全局关键字:inherit(继承),initial(初始值),unset(不设置)*/
border-widthinherit;
/*作用于border-width的关键字:thin(细边线),medium(中等边线),thick(宽边线)*/
border-widththin;

border-width
可以使用简写border

/*width | style | color*/
bordermedium dashed green;

border
的三个取值为border-width
border-style
border-color

Margin

Margin
:使用的空白区域来扩展边框区域,以分开相邻区域。

  • margin-top
    :元素顶部的外边距,可以负值。
  • margin-left
    :元素左边的外边距,可以负值。
  • margin-bottom
    :元素底部的外边距,可以负值。
  • margin-right
    :元素右边的外边距,可以负值。

四个外边距可以使用margin
简写四个方向的外边距属性。

/* 应用于所有边 */
margin-3px;
/* 上边下边 | 左边右边 */
margin: 5% auto;
/* 上边 | 左边右边 | 下边 */
margin: 1em auto 2em
/* 上边 | 右边 | 下边 | 左边 */
margin: 2px 1em 0 auto;
/* 全局值:inherit,initial,unset */
margininherit;

margin
属性接受1~4个值。每个值可以是<length>
<percentage>
auto
(让浏览器选择合适的外边距,特殊情况下,该值使元素居中)。取值为负时元素会比原来更接近临近元素。

  • 一个值时,全部应用到四个边的外边距上。
  • 二个值时,第一个值应用于上边和下边的外边距,第二个值应用于左边和右边的外边距。
  • 三个值时,第一个值应用于上边的外边距,第二个值应用于左边和右边的外边距,第三个值应用于下边的外边距。
  • 四个值时,顺时针应用于上边、右边、下边和左边的外边距。

竖直排列相邻的两个盒子模型的外边距会重叠,称为margin-collapsing

提示:在盒模型中,外边距可以是负值,而且在很多情况下都要使用负值的外边距。

最后,请注意,除可替换元素外,对于行内元素来说,尽管内容周围存在内边距与边框,但其占用空间(每一行文字的高度)则由 line-height 属性决定,即使边框和内边距仍会显示在内容周围。

box-sizing

根据盒模型定义,一个元素的width
height
属性只会应用到内容区,CSS3新增的box-sizing
能够定义盒模型的解析方式。

box-sizing
的属性值主要有以下三个:

  • content-box
    默认值。W3C标准盒模型,设置的width/height
    就是content
    的宽高。
  • border-box
    重新定义盒模型,width/height
    中除了有content
    的宽高还要加上padding
    border
    的宽高。
  • inherit
    值会继承父元素的box-sizing
    属性的值。

box-sizing
content-box
border-box
值进行解析,比较两者的不同。

div img {
    width200px;
    height180px;
    padding20px;
    border8px solid red;
    background: yellow;
}
.content-box img {
    box-sizing: content-box;
}
.border-box img {
    box-sizing: border-box;
}

<div class="content-box">
    <img src="./134.JPG">
</div>
<br>
<div class="border-box">
    <img src="134.JPG">
</div>

上面显示的结果就是不同box-sizing
值改变相同元素的渲染结果。

全局设置border-box
属性,省略每次在元素上添加。

html {
    -webkit-box-sizing:border-box;
    -moz-box-sizing:border-box;
    box-sizing:border-box;
}
*,*::before,*::after {
    /*Safari支持*/
    -webkit-box-sizing:inherit;
    /*Firefox支持*/
    -moz-box-sizing:inherit;
    box-sizing:inherit;
}

选择器 * 无法覆盖到伪元素,所有需要给 :before 和 :after 分别设置。

但是全局的box-sizing:border-box
注意对第三方组件库的侵入,第三方组件库可能基于content-box
布局的, 因此将所有元素的box-sizing
设为inherit

overflow

overflow
属性用于在content
内容超过容纳大小出现溢出问题时使用。overflow
属性是CSS2.1规范中的特性,而在CSS3中增加了overflow-x
overflow-y
属性。

overflow-x
设置水平方向的溢出;overflow-y
设置垂直方向的溢出;overflow
为两者的简写。

关于overflow的属性有以下几种处理值可选:

  • auto
    :自行处理溢出内容。如果有溢出内容,溢出部分隐藏在容器中并显示滚动条。
  • hidden
    :内容溢出时,所有内容都隐藏,并且不显示滚动条。
  • scroll
    :不管是否溢出,上下滚动条都将显示。
  • visible
    :默认值,溢出时会显示在框外。
  • inherit
    :从父元素继承overflow
    属性的值。

我们看一下它的例子:

div {
    width180px;
    height100px;
    background: antiquewhite;
    overflow: visible;
}

<div>
    <b>凉州词二首·其一</b>  <br>
    <small>唐代:王之涣</small>     <br>
    黄河远上白云间, <br>
    一片孤城万仞山。 <br>
    羌笛何须怨杨柳, <br>
    春风不度玉门关。
</div>
<br>
<div>
    解释
</div>

当将 overflow
换成scroll
后的效果如下:

resize

CSS3添加了resize
属性,来改变元素尺寸。

我们将上面的CSS例子中添加resize
可以改变元素大小

div {
    width180px;
    height100px;
    background: antiquewhite;
    overflow: auto;
    resize: both;
}

拖动右下角就可以将元素大小进行改变。

resize
属性的值可以有以下几种:

  • none
    :无法调整元素尺寸。
  • both
    :调整元素宽高。
  • horizontal
    :调整元素宽度。
  • vertical
    :调整元素高度。
  • inherit
    :继承父元素resize
    属性。

overflow
属性设置为visible
时,resize
属性不起作用。

outline

CSS的outline
属性可以设置外轮廓,是多个轮廓属性的简写,例如outline-style
outline-width
outline-color

在上面的例子中添加outline
属性:

div {
    width180px;
    height100px;
    background: antiquewhite;
    outline4px dotted #ee7733;
}

outline
属性语法如下:

/*style*/
outlinesolid;
/*color | style*/
outline#f66 dashed;
/*style | width*/
outlineinset thick;
/*color | style | width*/
outlinegreen | solid 3px;
/*Global value(inherit, initial, unset)*/
outlineinherit;

outline
属性可以使用一至三个值,顺序不重要。

border
outline
类似,但也有区别:

  • border
    几乎可应用在所有有形的html
    元素中,outline
    针对链接、表单控件和ImageMap
    等元素设计。
  • outline
    效果随元素的focus
    自动出现,相应的由blur
    自动消失;是浏览器默认行为,无需JavaScript配合CSS来控制。
  • outline
    不占空间,绘制于元素内容周围,而border
    属于盒模型一部分。

总结

本章简单介绍了下CSS
的盒模型和怪异盒模型的对比,可以影响到盒模型的属性,因此可以利用这些属性来布局想要的UI界面。





文章转载自海人为记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论