关于CSS你应该知道的基础知识 - 盒模型篇

零信任架构
• 阅读 1690

浏览器渲染引擎通过盒模型的方式来布局html元素。我们可以将每一个html元素都看做是一个盒子,每一个盒子都有长和款,多个这样的盒子组成了我们的网页。

Margin,Border,Padding

每一个盒子都会有margin,border和padding属性。我们可以通过CSS来指定这三个属性的大小。例如:

.box {
  margin: 40px;
  padding: 20px;
  border: black 2px solid;
  text-align: center
}
<body>
  <div class="box">
    box
  </div>
  <div class="box">
    box
  </div>
  <div class="box">
    box
  </div>
</body>

box class被应用后的样式如下:

关于CSS你应该知道的基础知识 - 盒模型篇

  • margin 应用后元素与元素之间产生了相应的空间。
  • border 应用后元素的外边框增加了宽度。
  • padding 应用后元素内的内容和边框之间产生了相应的空间。

我们同样可以通过Chrome的Developer Tools来验证相应的属性。上面的代码在Developer Tools中的计算结果如下:

关于CSS你应该知道的基础知识 - 盒模型篇

上栗中,我们将盒子四个方向的margin都设置成了40px。我们还可以只修改上下左右中的其中一个或几个。

/* 具体指定上右下左的margin */
.box {
  margin-top: 10px;
  margin-right: 20px;
  margin-bottom: 30px;
  margin-left: 40px;
}

/* 以简写的方式指定margin,依次为上,右,下,左 */
.box {
  margin: 10px 20px 30px 40px;
}

/* 以简写的方式指定margin,依次为上下,左右 */
.box {
  margin: 10px 20px;
}

padding设置的语法与margin相同,这里就不列出了。border的设置比较特殊,有机会会找专门一个章节来介绍。

这里还有一个小技巧,就是如果想将一个元素水平居中,可以将它的margin-leftmargin-right属性设置成auto。即左右两边的margin根据当前窗口宽度自动调节到合适大小。

Margin 塌陷

下面这块代码中,盒模型的计算结果和我们预期的不太一样:

.box1 {
  margin-bottom: 30px;
  border: black 2px solid;
  text-align: center
}

.box2 {
  margin-top: 60px;
  border: black 2px solid;
  text-align: center
}
<body>
  <div class="box1">
    box 1
  </div>
  <div class="box2">
    box 2
  </div>
</body>

如果按照前面的解释,box1和box2这间的空间应该是30px + 60px = 90px,但实际上只有60px。原因是浏览器渲染元素时,垂直方向相邻的元素margin值只会取设置的较大的那个值。这就是Margin Collapsing。在上栗中,最后计算结果是60px。通过Chrome的工具,我们可以验证,如下图:

关于CSS你应该知道的基础知识 - 盒模型篇

关于CSS你应该知道的基础知识 - 盒模型篇

橘黄色部分为两个盒元素的margin区域。图例中可以看出margin的高度不是两个元素marign相加,而是取较大的那个。

block元素和inline元素

html元素中,有一些元素是block元素,即元素的宽度会占满整个窗口的宽度,例如div。还有一些是inline元素,即元素的宽度是根据自己内容需要计算出来的宽度,且会紧贴在前一个inline元素的后面,例如span

<body>
  <div>
    我是block
  </div>
  <span>
    我是inline
  </span>
  <span>
    我是inline
  </span>
  <div>
    我是block
  </div>
</body>

关于CSS你应该知道的基础知识 - 盒模型篇

我们可以通过display属性还改变元素的默认显示属性。例如想将一个span以block形式展现,只需将其设置成display: block;

还有一点需要注意的是,以inline形式展现的元素,是不受上下margin属性控制的,如果想给一个inline元素设置margin-topmargin-bottom则需要将display设置成inline-block.

<span class="inline">
  我是inline
</span>
<span class="inline">
  我是inline
</span>
上下margin不起作用
.inline {
  margin: 20px;
  border: red 1px solid;
}

关于CSS你应该知道的基础知识 - 盒模型篇

上下margin起作用
.inline {
  margin: 20px;
  border: red 1px solid;
  display: inline-block;
}

关于CSS你应该知道的基础知识 - 盒模型篇

盒模型长度和宽度的计算

盒模型的长度可以通过width属性还设置,例如width: 200px。我们来看一个例子:

.box {
  margin: 10px auto;
  padding: 10px;
  border: red 1px solid;
  text-align: center;
  width: 200px;
}
<div class="box">
  box
</div>

关于CSS你应该知道的基础知识 - 盒模型篇

我们设置了元素宽度是200px,但通过Developer Tools查看到最后的结果是222px。原因是浏览器渲染引擎默认理解width属性是内容加上padding的宽度,整个元素宽度还要加上border和margin,即200px + 2 * 10px (margin) + 2 * 1px (border) = 222px

这种对width属性的处理很多时候会带来一些不便,因为我们无法准确的知道最后的元素到底有多宽。要解决这个问题,可以通过设置box-sizing: border-box;,这样元素最后整体宽度就是我们设置的宽度了。如下图:

关于CSS你应该知道的基础知识 - 盒模型篇

我们在引用一些CSS框架时,大多数框架都会将所有元素的box-sizing设置成border-box。有兴趣的同学可以看看Bootstrap等框架的源码。

* {
  box-sizing: border-box;
}

关于盒模型的高度,可以通过height属性来设置。而如何将设置垂直居中,还是建议使用flex-box来实现,网上关于flex-box的资料很多,有兴趣的话可以去看看。

点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
4年前
几个有点意思的 CSS 技巧
如果你是一名前端开发人员或者想成为一名开发人员,那么,我今天与你分享的9个CSS技巧,你需要知道一下。现在,我们开始吧。1、学习盒子模型你在学习CSS时,应该避免使用Bootstrap或TailwindCSS等框架,这些工具非常适合构建漂亮的网站,但如果你还不能正确的了解CSS,则建议不要使用这些框架中的任何一个。因为如果你使用了这些工具,你将无法学习
晴空闲云 晴空闲云
3年前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
秃头王路飞 秃头王路飞
3年前
总结前端元素的各种高度(上)
HTMLElement.clientHeight只读属性Element.clientHeight对于没有定义CSS或者内联布局盒子的元素为0;否则,它是元素内部的高度(以像素为单位),包含内边距,但不包括边框、外边距和水平
菜园前端 菜园前端
2年前
你真的了解的CSS3盒模型和CSS3特性知识吗
原文链接:什么是CSS3?CSS3是CSS一个新的标准,直接理解为是CSS的升级版,里面新增了很多样式(特性)。CSS3盒子模型:::warningCSS3盒子模型必须要掌握,否则你在实际开发中遇到样式错乱很难排查问题。:::旧版的IE浏览器与其它浏览器解
Stella981 Stella981
4年前
Boost(1.69.0) windows入门(译)
<head<title缩进2字符</title<styletype"text/css".yindent,.yblock{padding:1em1em01em;marginright:0;}.yindent{margin:0.7em2em;border:mediumoutset;}.yblock{margin
Wesley13 Wesley13
4年前
HTML5中新增的布局标签
1.1.1  盒子模型层次盒子模型的层次遵循以下顺序:内容paddingà边框àbackgroundimageàbackgroundcoloràmargin!(https://oscimg.oschina.net/oscnet/722909c8dcfd273c73b0c6534e20f8d9bd4.gif)!(ht
Stella981 Stella981
4年前
CSS之border绘制三角形
用CSS的border可以画出高质量的三角形。我们一般会这么使用border:testborder{width:100px;height:100px;margin:100pxauto;background:fff;border:2px
Wesley13 Wesley13
4年前
CSS3的基础知识学习(二)
前言:CSS主要是用来修饰标签的样式、使得网页更加美观,其实css的引用有三种方式,但主要是使用链接引用,意思就是我们写一个.css的文件,将样式修饰的控制代码写在这里面,这样控制起来方便快捷。对于CSS的学习,知识点中最重要的部分就是属性和选择器,其次还有页面布局和盒子模型,下面进行学习以及代码效果演示。一、CSS的三种引入
Wesley13 Wesley13
4年前
HTML中经常用到的对齐,居中方式
在编写一片网页时,我们经常需要使一些文本或者图片,盒子居中!但是在众多的写法里,那些才能使我们的目的最快,最有效的达到呢!居中也是有轴线之分的,水平轴,垂直于水平轴的轴,交叉轴。1盒子居中margin:auto;通常在这此行只有一个盒子的情况下使用\需要定宽\常规流和浮动不用\2文本居中   定义水平轴线对齐方式flexst
Stella981 Stella981
4年前
HTML前端开发之路——弹性盒模型
弹性盒模型(FlexibleBox)是一个CSS3新增布局模块,用于实现容器里项目的对齐、方向、排序;弹性盒模型最大的特效在于,能够动态的修改子元素的宽度和高度,以满足在不同尺寸屏幕下的恰当布局;下面是弹性盒模型的元素基本概念:!(http://static.oschina.net/uploads/space/2016/0212/210
linbojue linbojue
1个月前
box-sizing: border-box 详解
🎯核心作用boxsizing:borderbox改变了CSS盒模型的计算方式,让元素的宽度和高度包含内边距(padding)和边框(border),而不是仅仅内容区域。📊盒模型对比默认盒模型(contentbox)css体验AI代码助手代码解读复制代码