博客列表 >盒模型及其大小计算方式和对齐方式

盒模型及其大小计算方式和对齐方式

longlong
longlong原创
2020年06月18日 12:12:532348浏览

1. 什么是盒模型

html中的每个元素,我们都可以看做是一个盒子,在开发工具中可以很直接的看出来,比如我先写一段代码,来看看在开发工具中怎样显示的盒模型:

  1. <style>
  2. /* 给div加上宽度,高度和背景色,页面就能显示 */
  3. div {
  4. width: 300px;
  5. height: 300px;
  6. background-color: red;
  7. margin: 10px;
  8. border: 3px solid black;
  9. }
  10. </style>
  11. <body>
  12. <!-- div中我先不写任何东西,没加样式前,在页面中什么都看不到 -->
  13. <div></div>
  14. <div></div>
  15. </body>

在开发工具中可以看到右边一个这样的盒子 :

这样就比较好理解了,这个div在开发工具中显示出来的样子就像是一个盒子,而这个盒子呢,有以下几个非常重要的属性:

  • padding:内边距,即内容到边框的间距

  • border:边框,可以设置边框线的粗细,样式和颜色

  • margin:外边距,即边框与其他盒子之间的间距

每个属性还可以细分为上右下左,比如:

  • margin-top:上外边距

  • margin-right:右外边距

  • margin-bottom:下外边距

  • margin-left:左外边距

paddingborder的用法与margin是一样的,就不做举例了。在属性margin中,有一点必须要了解的是外边距折叠这种情况,举例如下:

  1. <style>
  2. /* 给div加上宽度,高度和背景色,页面就能显示 */
  3. div:first-of-type {
  4. width: 300px;
  5. height: 300px;
  6. background-color: red;
  7. /* 把第一个盒子的下边距设置为30px */
  8. margin-bottom: 30px;
  9. border: 3px solid black;
  10. }
  11. div:last-of-type {
  12. width: 300px;
  13. height: 300px;
  14. background-color: red;
  15. /* 把第二个盒子的上边距设置为50px */
  16. margin-top: 50px;
  17. border: 3px solid black;
  18. }
  19. </style>
  20. <body>
  21. <div></div>
  22. <div></div>
  23. </body>

通过上面图例,发现两个盒子间的距离并不是50px+30px=80px,而且50px,这就是外边距合并,当遇到这种情况时,外边距会取值为较大者

接着看看padding是一个什么样的效果,举例如下:

通过上面案例,可以知道padding内边距属性是一个什么效果了。

2. 盒模型大小计算方式

在上面的案例中,我们已经知道盒模型是一个什么样子了,是一个矩形的形状。那么它的大小如下:

  • 盒子的可视宽度=内容区宽度(width)+左右边框(border-left + border-right)+左右内边距(padding-left + padding-right)

  • 盒子的可视高度=内容区高度(height)+上下边框(border-top + border-bottom)+上下内边距(padding-top + padding-bottom)

但是,刚才知道一个问题,就是当我们修改padding的时候,盒子被撑开,盒子的宽度和高度会发生自动变化,在实际开发中布局会受到影响,所以常常会用到一个属性box-sizing,来解决这个问题,重新计算大小,先看看此属性的两个常用取值:

  • content-box:默认取值,盒子大小只覆盖到内容区,内容区的高宽始终不变,那么设置padding肯定会影响其大小,影响布局

  • border-box:盒子大小覆盖到边框线,这样就把padding包裹在里面了,无论你怎么变,盒子大小都不受其影响

我们着重的看下boder-box这个属性值,举例如下:

  1. <style>
  2. div {
  3. margin: 20px;
  4. width: 250px;
  5. height: 250px;
  6. border: 2px solid black;
  7. }
  8. div:first-of-type {
  9. background-color: red;
  10. background-clip: content-box;
  11. box-sizing: border-box;
  12. padding: 0;
  13. }
  14. div:last-of-type {
  15. background-color: green;
  16. background-clip: content-box;
  17. box-sizing: content-box;
  18. padding: 0;
  19. }
  20. </style>
  21. <body>
  22. <div></div>
  23. <div></div>
  24. </body>

上面案例中,我把第一个盒子大小设为border-box,第二个设为content-box,然后我们在开发工具中修改padding的值,看看有什么变化:

通过上面,可以看出,当box-sizing:border-box;时,修改padding对它的大小是不受影响的,盒子会自动修改内容区的值,你想让盒子多大,它就多大,这对布局是非常重要的!这个属性会经常用到初始化代码块中,以保证实际开发中盒子的固定大小值。

3. 定位元素的对齐方式

对于块级元素,肯定不能用text-align,vertical-align这样的方式来水平垂直居中,要掌握好margin:auto的用法。

  • 水平居中:

水平居中就是让元素的左外边距为auto,右外边距也为auto,以这样的方式把元素硬挤到中间去,举例如下:

  1. <style>
  2. .container {
  3. width: 400px;
  4. height: 400px;
  5. border: 1px solid black;
  6. background-color: red;
  7. }
  8. .container div {
  9. width: 100px;
  10. height: 100px;
  11. background-color: blue;
  12. /* 设置左右外边距为auto */
  13. /*
  14. margin-left: auto;
  15. margin-right: auto;
  16. */
  17. /* 简写方式(上下外边距默认为0) */
  18. margin: auto;
  19. }
  20. </style>
  21. <body>
  22. <div class="container">
  23. <div></div>
  24. </div>
  25. </body>

  • 水平垂直居中:

通过绝对定位来实现,让当前元素绝对定位的上下文充满整个容器,从左上角开始,右下角结束,然后使用margin:auto,举例如下:

  1. <style>
  2. .container {
  3. width: 400px;
  4. height: 400px;
  5. border: 1px solid black;
  6. background-color: red;
  7. /* 父容器变为定位元素 */
  8. position: relative;
  9. }
  10. .container div {
  11. width: 100px;
  12. height: 100px;
  13. background-color: blue;
  14. /* 设置绝对定位 */
  15. position: absolute;
  16. /* 左上角 */
  17. left: 0;
  18. top: 0;
  19. /* 右下角 */
  20. right: 0;
  21. bottom: 0;
  22. margin: auto;
  23. }
  24. </style>
  25. <body>
  26. <div class="container">
  27. <div></div>
  28. </div>
  29. </body>

如果页面中只有一个盒子需要垂直水平居中,就不需要找父容器,会默认以body定位,比如会经常应用到一个简单的登陆页面,举例如下:

  1. <style>
  2. div{
  3. width: 300px;
  4. height: 300px;
  5. background-color: cadetblue;
  6. position: absolute;
  7. left: 0;
  8. top: 0;
  9. right: 0;
  10. bottom: 0;
  11. margin: auto;
  12. }
  13. /* 知道是这么个用法就行,表单里面的细节就不再写了 */
  14. </style>
  15. <body>
  16. <div>
  17. <form action="">
  18. <button>登陆</button>
  19. </form>
  20. </div>
  21. </div>
  22. </body>

4. 总结:

掌握了盒模型的属性,大小计算方式以及box-sizing的用法,还有块级元素的对齐方式技术,特别是垂直对齐,以现有的知识,需要用绝对定位来实现,当然后面学了弹性布局和网格布局,就会更简单了!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议