
网页由元素组成,而元素在网页中实际是以一个个矩形盒子来呈现。它包括:外边距(margin)、内边距(padding)、边框(border)和内容(content)。

边框用 border 设置,由三部分组成边框的粗细(border-width)、边框样式(border-style)、边框颜色(border-color)
/* 单独设置 */
border-width: 长度;
border-style: 样式;
border-color: 颜色;
/* 一起设置 */
boder: border-width || border-style || border-color /* 无关顺序 */
border-style 常用样式:solid(实线)、dashed(虚线)、dotted(点线)
html(用 div 设置一个 100*100 的盒子,边框为宽度为 1px 的红色实线)
<body>
<div>div>
body>
css
效果

但我们发现 border 属性在设置边框时,会设置上下左右所有的边框。如果我们要设置某一个边边框与其他边框不同,应该怎么做呢?这里的 border 还额外提供了四个方向的设置。四个方向分别 left、right、top、bottom。我们如果要单独设置,我们直接在 border 后加入方向。比如对左边设置可以直接:border-left、border-left-color、border-left-style。 这点相对比较重要,本文后会再次用到。
html(用 div 设置一个 100*100 的盒子,所有与边框为宽度为 1px 的实线,上边框为红色,其他边框为蓝色)
<body>
<div>div>
body>
css
效果

我仅仅只是单独设置边框我就需要这四条代码,这样太麻烦了。
/* 上边框 */
border-top: 1px solid red;
/* 其他边框 */
border-bottom: 1px solid blue;
border-left: 1px solid blue;
border-right: 1px solid blue;
我们想到 css 的层叠性,相同属性在同一个选择器中后写的会覆盖前写的。我们只要把 border 看成四个方向的边框设置就很简单理解。
例如:
border-top: 1px solid red;
border-bottom: 1px solid red;
border-left: 1px solid red;
border-right: 1px solid red;
等同于:
border: 1px solid red;
据此我们可以把 css 代码简化为:
这也可以得到相同的效果。
之前在这个表格的实验中,我们发现:我们设置的表格边框是 1px,但我们从页面上来看表格里面边框好像不止 1px,这点其实很好理解,因为两个单元格的边框放在一起了。

对于这种情况,如果我们可以使用 border-collapse 让相邻边框合并在一起(两个合为一个,但长度不变)
border-collapse: collapse;
加了上面这个 css 属性后,表格里面的框线就变细了:

我们刚才在边框实验中,设置了一个 100*100 的盒子,然后边框为 1px 的红色实线。
我们发现盒子的大小变了,这是因为 width、height 属性设置的是内容盒的宽高。

解决方法:
用 width、height 属性设置宽高时,不量边框
如果包含边框,就减去 2 * 边框宽度(2是因为左右或者上下有两个边框的宽度)
通过盒子模型,我们看到内边距介于内容和边框之间,所以它可以控制内容到边框的距离。用 padding 表示。

| 值的个数 | 意思 |
|---|---|
| padding: 10px; | 设置一个值,代表四个方向的内边距 |
| padding: 10px 20px; | 设置两个值,分别代表上下、左右的内边距 |
| padding: 10px 20px 30px; | 设置三个值,分别代表上、左右、下的内边距 |
| padding: 10px 20px 30px 40px; | 设置四个值,分别代表上、右、下、左(从上开始顺时针)的内边距 |
padding 同样也可以像 border 那样有四个方向的单独设置,就是在 padding 后加 top、bottom、left、right。
html(盒子宽高为 100*100,背景为红色,并令内容距离边框的左边距为 20px,上边距也为 20px)
<body>
<div>你好!div>
body>
css
效果

通过审查元素 F12 发现:内边距和边框一样,都会影响盒子的实际大小。这里有特例,我们在行盒块盒行块盒的区别细讲,这章我这几天找个时间再写。

解决方法与边框同理:量整个盒子长度后,设置宽高要减去内边距的部分。
我们先看两个导航栏:


我们从视觉上看,会感觉第二个舒服很多,两个都是让文字在自己盒子居中,但不一样的是,第一个的每个盒子是固定宽,造成每个盒子中间间距不一样。而第二个盒子宽度由内容决定,但却用内边距填充,使其每个盒子中间间距一致。
所以我们做这样的一个案例,设置一个这样的导航栏,可以用伪类选择器设置悬浮效果:


html
<body>
<div class="nav">
<a href="#">设为首页a>
<a href="#">手机新浪网a>
<a href="#">移动客户端a>
<a href="#">博客a>
<a href="#">微博a>
<a href="#">关注我a>
div>
body>
css
外边距用来控制盒子和盒子之间的距离,用 margin 表示。
margin 同样也可以像 border、padding 那样有四个方向的单独设置,就是在 margin 后加 top、bottom、left、right。
而且,margin 简写方式和 padding一致
margin 还有一个取值 auto,针对 auto的原理我们也在行盒块盒行块盒的区别细讲,这章我这几天找个时间再写。
html(设置两个兄弟盒子宽高为 100*100,颜色分别为红色和蓝色,并对上面盒子设置底部的外边距为 100px)
<body>
<div class="one">div>
<div class="two">div>
body>
css
效果

大概能看出上下盒子隔了 100px 的高度(因为和盒子高度差不多)
我们在上个实验的基础上,并让下面盒子的顶部的外边距为 50px,效果如下:

我们理想的情况下,应该是间隔 150px 才对,但实际上仍是 100px。因为这里发生了相邻块元素垂直外边距的合并,这种情况就是上面盒子设置底部外边距,下面盒子设置顶部外边距的时候会产生,此时的外边距取两者中的较大值。
尽量只给一个盒子设置 margin 值
html(设置两个嵌套关系的盒子,父盒宽高为 200* 200,子盒宽高为 100*100,颜色分别为红色和蓝色,并设置父盒和子盒顶部的外边距分别为 50px,100px)
<body>
<div class="father">
<div class="son">div>
div>
body>
css
效果


这效果和我们预想的也不一样,我们预想的是父盒到页面顶部有 50px 的间距,而子盒到父盒有 100px 的间距。但这里发生嵌套块元素垂直外边距的塌陷,父元素有上边距同时子元素有上边距,此时他们上边距的最大值只作用于父元素。即使父元素没有设置上边距,子元素设置了,子元素设置的也是作用于父元素。
border: 1px solid white;

padding: 1px 0 0 0;

overflow:hidden;

我们子盒实际上是放在父盒的内容盒中,所以为父元素添加上边框或者上内边距,本质上就是为了隔离子盒和父盒的外边距,使得外边距不会合并。而 overflow:hidden; 的设置使块盒进入了 BFC 模式,规避了外边距的合并。关于 BFC,这里涉及浮动定位的知识,这里作为提前的铺垫即可。

本文主要学习黑马程序员pink老师的视频
如有错误,敬请指正,欢迎交流🤝,谢谢♪(・ω・)ノ