关于CSS你应该知道的基础知识 - 盒模型篇
浏览器渲染引擎通过盒模型的方式来布局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被应用后的样式如下:
- margin 应用后元素与元素之间产生了相应的空间。
- border 应用后元素的外边框增加了宽度。
- padding 应用后元素内的内容和边框之间产生了相应的空间。
我们同样可以通过Chrome的Developer Tools来验证相应的属性。上面的代码在Developer Tools中的计算结果如下:
上栗中,我们将盒子四个方向的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-left
和margin-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的工具,我们可以验证,如下图:
橘黄色部分为两个盒元素的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>
我们可以通过display
属性还改变元素的默认显示属性。例如想将一个span
以block形式展现,只需将其设置成display: block;
还有一点需要注意的是,以inline形式展现的元素,是不受上下margin属性控制的,如果想给一个inline元素设置margin-top
和margin-bottom
则需要将display
设置成inline-block
.
<span class="inline">
我是inline
</span>
<span class="inline">
我是inline
</span>
上下margin不起作用
.inline {
margin: 20px;
border: red 1px solid;
}
上下margin起作用
.inline {
margin: 20px;
border: red 1px solid;
display: inline-block;
}
盒模型长度和宽度的计算
盒模型的长度可以通过width属性还设置,例如width: 200px
。我们来看一个例子:
.box {
margin: 10px auto;
padding: 10px;
border: red 1px solid;
text-align: center;
width: 200px;
}
<div class="box">
box
</div>
我们设置了元素宽度是200px
,但通过Developer Tools查看到最后的结果是222px
。原因是浏览器渲染引擎默认理解width
属性是内容加上padding的宽度,整个元素宽度还要加上border和margin,即200px + 2 * 10px (margin) + 2 * 1px (border) = 222px
。
这种对width
属性的处理很多时候会带来一些不便,因为我们无法准确的知道最后的元素到底有多宽。要解决这个问题,可以通过设置box-sizing: border-box;
,这样元素最后整体宽度就是我们设置的宽度了。如下图:
我们在引用一些CSS框架时,大多数框架都会将所有元素的box-sizing
设置成border-box
。有兴趣的同学可以看看Bootstrap等框架的源码。
* {
box-sizing: border-box;
}
关于盒模型的高度,可以通过height
属性来设置。而如何将设置垂直居中,还是建议使用flex-box
来实现,网上关于flex-box
的资料很多,有兴趣的话可以去看看。
原文地址:https://www.cnblogs.com/jlfw/p/11940359.html
- HTML 教程
- HTML 简介
- html div 标签介绍
- html span 标签介绍
- html a 超链接标签
- HTML Br换行标签介绍
- HTML P段落标签介绍
- HTML br与p标签区别
- Html H 标题标签
- html px em pt长度单位
- HTML form 标签
- HTML radio 单选框
- HTML B 加粗标签
- HTML strong加粗粗体标签
- HTML em 强调标签
- HTML i 斜体标签
- HTML u下划线标签
- HTML s 删除线标签
- Html img 图片标签
- Html上标注sup与下标注sub标签
- HTML nobr 禁止换行标签
- HTML hr 水平线标签
- HTML label 标签
- HTML input 标签
- HTML textarea 标签
- HTML select下拉列表标签
- HTML checkbox 多选框
- HTML font color 标签
- HTML iframe 框架标签
- HTML Table 表格
- HTML dl dt dd 标签
- HTML ol li有序列表标签
- HTML ul li 无序列表标签
- HTML 注释
- CSS 教程
- CSS 简介
- CSS 语法
- CSS Id 和 Class选择器
- CSS 样式的创建
- CSS background 背景介绍
- CSS 文本样式
- CSS font 字体
- CSS A 链接
- CSS ul ol列表样式
- CSS TABLE 样式
- CSS 框模型
- CSS border 边框
- CSS Outlines 轮廓
- CSS 外边距 Margin
- CSS Padding 内边距
- CSS 分组和嵌套选择器
- CSS 尺寸 (Dimension)
- CSS Display 属性
- CSS Position 定位
- CSS Float 浮动
- CSS 水平对齐(Horizontal Align)
- CSS 组合选择符
- CSS 伪类
- CSS 伪元素
- CSS 导航栏
- CSS 下拉菜单
- CSS 图片廊
- CSS 图像透明/不透明
- CSS sprite 图像拼合技术
- CSS 媒体类型
- CSS 属性选择器
- CSS 实例
- 最新Spring整合MyBatis详解教程
- 数据结构算法操作试题(C++/Python)——搜索插入位置
- 数据结构算法操作试题(C++/Python)——报数
- Java List.add()方法:向集合列表中添加对象
- Linux下查看NVIDIA的GPU使用情况
- 数据结构算法操作试题(C++/Python)——有效的数独
- Java List.addAll()方法:添加所有元素到列表中
- HDFS的Shell操作(开发重点)
- 数据结构算法操作试题(C++/Python)——字符串相乘
- Java基础知识笔记四(详细)
- [推荐]Linux入门系列(三)Vim编辑器(Vim工作模式+代码演示)
- 机器学习性能评价指标汇总
- [推荐]Linux入门系列(四)系统用户账号管理(代码图文示例)
- 逆波兰表达式
- 字符串:替换空格