博客列表 >【前端开发-HTML】之盒模型,模型计算方式与布局技术

【前端开发-HTML】之盒模型,模型计算方式与布局技术

林辉
林辉原创
2020年08月13日 08:08:011281浏览

1. 盒模型的大小与位置的设置与计算

1.1 盒模型的基础知识

下图是我所做的一个基本的盒模型;

下图是该盒模型的构造;

以上可以知道,外边距margin-top为80px,margin-left为30px,内边框padding为10px。
盒子大小为200px*200px。

下列为该盒模型的代码;

  1. <!-- @format -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>Document</title>
  8. <style>
  9. .box {
  10. width: 200px;
  11. height: 200px;
  12. background-color: lightcoral;
  13. /* 边框 */
  14. border: 1px solid #000;
  15. /* 内边框 */
  16. padding: 10px;
  17. background-clip: content-box;
  18. /* 外边距 */
  19. margin-top: 30px;
  20. margin-left: 30px;
  21. }
  22. .box:first-of-type {
  23. margin-top: 80px;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <div class="box">盒子</div>
  29. <div class="box">盒子</div>
  30. </body>
  31. </html>

1.2 盒子大小计算方式


上图的代码如示;

  1. <!-- @format -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>用户自定义盒子大小计算方式</title>
  8. <style>
  9. /* 推荐在html,body加入box-sizing: border-box; */
  10. * {
  11. margin: 0;
  12. padding: 0;
  13. box-sizing: border-box;
  14. }
  15. .box {
  16. width: 200px;
  17. height: 200px;
  18. background-color: lightgreen;
  19. border: 5px solid #000;
  20. /* 210px = 200(width)+ 5(border-right) + 5(border-right) */
  21. padding: 10px;
  22. /* 230 = 200(width)+ 5(border-right) + 5(border-right) + 10(padding-right) + 10(padding-left) */
  23. /* margin只影响到盒子的排列位置,不影响大小 */
  24. /* margin: 10px; */
  25. /* 默认盒子计算公式:内容区 + 内边距 + 边框 */
  26. box-sizing: border-box;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div class="box"></div>
  32. </body>
  33. </html>

可以通过margin元素来设置盒子的位置。
默认盒子计算公式为内容区 + 内边距 + 边框。

1.3 盒子的位置设置


如上图所示,将一个“点我就有好心情”的盒子的位置固定在窗口的右下方。
实现该功能,需要用到 position定位元素以及right和bottom元素。
利用这3个元素,可将盒子随意固定在自己想要的位置上。
下面为该代码。

  1. <!-- @format -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>盒子的位置设置-固定定位</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. }
  13. .good {
  14. background-color: coral;
  15. color: white;
  16. border-radius: 10px;
  17. font-weight: 500;
  18. padding: 5px;
  19. width: 300px;
  20. text-align: center;
  21. /* 固定定位 */
  22. position: fixed;
  23. right: 10px;
  24. bottom: 10px;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <h2 class="good">
  30. 点我就有好心情
  31. <button type="button" onclick="this.parentNode.style.display='none'">
  32. 关闭
  33. </button>
  34. </h2>
  35. </body>
  36. </html>

2. box-sizing属性的实际作用

简单一句话来说,使用box-sizing属性可以解决盒子(div等)宽高被内边距撑开的问题。
有时我们会给页面的元素(比如div)设置个固定的高度或宽度。但如果给这个div又设置了内边距或者边框的话,那么这个div就会被撑大。也就是其实际的尺寸变成了:设置的宽高尺寸+内边距+边框。
这样就有可能对我们的布局造成影响,如果不想让内边距和边框影响到我们设置的固定尺寸,可以借助 box-sizing 这个css属性来实现。

描述
content-box 宽度和高度分别应用到元素的内容框。在宽度和高度之外绘制元素的内边距和边框。
border-box 为元素设定的宽度和高度决定了元素的边框盒。就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度。
inherit 规定应从父元素继承 box-sizing 属性的值。


上图的代码如示;

  1. <!-- @format -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>用户自定义盒子大小计算方式</title>
  8. <style>
  9. /* 推荐在html,body加入box-sizing: border-box; */
  10. * {
  11. margin: 0;
  12. padding: 0;
  13. box-sizing: border-box;
  14. }
  15. .box {
  16. width: 200px;
  17. height: 200px;
  18. background-color: lightgreen;
  19. border: 5px solid #000;
  20. padding: 10px;
  21. /* 默认值 */
  22. box-sizing: content-box;
  23. /* 此时,盒子的大小是包括了外边距与边框,但是总大小始终等于盒子大小,此时内容区大小会被压缩 */
  24. box-sizing: border-box;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <div class="box"></div>
  30. </body>
  31. </html>

可通过运用box-sizing元素来定义盒子内容区是否包括内边距或边框 。
box-sizing: content-box;为默认值,
当box-sizing的值为border-box时,盒子的大小是包括了外边距与边框,但是总大小始终等于盒子大小,当设置外边距与边框时候,内容区大小会被压缩。

3. 绝对定位、相对定位的区别与应用

3.1 绝对定位

绝对定位即脱离文档流的定位,相对于祖元素 偏移。定位参照物为自己的父级,但是自己的父级必须拥有position属性,且父级position属性必须为absolute,relative,fixed中的一个,static不行。假若自己的父级没有设置position属性,会一直向上寻找有position属性且不为static的的祖先元素,直到body元素。

从下个图中可以看出,它的父级祖元素为body,相对于祖元素进行了偏移。

部分代码如下:

  1. .box2{
  2. position:absolute;
  3. left: 30px;
  4. top: 20px;
  5. }

3.2 相对定位

元素框会相对于原本位置偏移,从下个图中可以看出,元素仍保留其未定位前的形状,但是它原本所占有的空间仍然保留。


部分代码如下:

  1. .box2{
  2. position: relative;
  3. left: 30px;
  4. top: 20px;
  5. }

3.3 绝对定位、相对定位的区别

总结来说, 绝对定位是相对于祖元素进行了偏移,不占有空间。而相对定位是相对于原本位置进行偏移,且保留原本所占有的空间。

4. 绝对定位、固定定位的区别与应用

4.1 固定定位

固定定位是相对于浏览器窗口进行定位的,无论怎样移动你的滑动条,它都会固定在相对于浏览器窗口的固定位置,另外要注意,它的兄弟元素将会在位置排布上忽视它的存在。这个时候用的top,bottom,left,right也是相对于浏览器窗口而言的。

说明:固定定位也是绝对定位的一种,拥有绝对定位的大部分特点;但是他是相对于浏览器窗口的位置进行定位.比如漂浮的客服,回到顶部.这类的按钮都是使用的固定定位.

下图为一个固定定位的应用,是相对于浏览器窗口。

下面为该代码。

  1. <!-- @format -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>固定定位</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. }
  13. .good {
  14. background-color: coral;
  15. color: white;
  16. border-radius: 10px;
  17. font-weight: 500;
  18. padding: 5px;
  19. width: 300px;
  20. text-align: center;
  21. /* 固定定位 */
  22. position: fixed;
  23. right: 10px;
  24. bottom: 10px;
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <h2 class="good">
  30. 点我就有好心情
  31. <button type="button" onclick="this.parentNode.style.display='none'">
  32. 关闭
  33. </button>
  34. </h2>
  35. </body>
  36. </html>

4.2 固定定位和绝对定位的区别

偏移基准的不同,固定定位是相对于浏览器窗口,而绝对定位是相对于父级元素。

5. 使用绝对定位实现垂直居中

使用绝对定位来实现块的垂直居中,如下图所示:

图中的紫色块在绿色块中水平垂直居中。
代码如下:

  1. <!-- @format -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>margin:auto</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. box-sizing: border-box;
  13. }
  14. .container {
  15. width: 300px;
  16. height: 300px;
  17. background-color: lightgreen;
  18. /* 转为定位元素,定位父级 */
  19. position: relative;
  20. }
  21. .container > .item {
  22. width: 100px;
  23. height: 100px;
  24. background-color: violet;
  25. /* 水平局中 */
  26. text-align: center;
  27. /* 垂直居中(使用position) */
  28. position: absolute;
  29. /* 定位起点 */
  30. top: 0;
  31. left: 0;
  32. /* 定位终点 */
  33. right: 0;
  34. bottom: 0;
  35. margin: auto;
  36. }
  37. </style>
  38. </head>
  39. <body>
  40. <div class="container">
  41. <div class="item">Rinki.me</div>
  42. </div>
  43. </body>
  44. </html>

6. 使用绝对定位实现二列布局

使用绝对定位实现一个PC端的带有导航和页脚的左右分布的二列布局。
如下图所示:

代码如下:

  1. <!-- @format -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>绝对定位写一个两列布局</title>
  8. <link rel="stylesheet" href="demo7.css">
  9. </head>
  10. <body>
  11. <!-- 页眉 -->
  12. <div class="header">
  13. <div class="content">
  14. <ui>
  15. <li><a href="">导航栏</a></li>
  16. </ui>
  17. </div>
  18. </div>
  19. <!-- 主体 -->
  20. <div class="container">
  21. <div class="left">左侧内容区</div>
  22. <!-- <div class="main">内容区</div> -->
  23. <div class="right">右侧内容区</div>
  24. </div>
  25. <!-- 页脚 -->
  26. <div class="footer">
  27. <div class="content">
  28. <p>Rinki.me 版权所有|&copy;</p>
  29. </div>
  30. </div>
  31. </body>
  32. </html>

下面为css代码:

  1. /** @format */
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. box-sizing: border-box;
  6. }
  7. a {
  8. text-decoration: none;
  9. color: #666;
  10. }
  11. li {
  12. list-style: none;
  13. }
  14. /* 页脚页眉 */
  15. .header,
  16. .footer {
  17. height: 40px;
  18. line-height: 40px;
  19. background-color: lightblue;
  20. text-align: center;
  21. }
  22. .content {
  23. width: 1000px;
  24. margin: auto;
  25. }
  26. /* 主体定位布局 */
  27. .container {
  28. width: 300px;
  29. background-color: lightgrey;
  30. margin: 10px auto;
  31. /* 转为定位元素,作为子元素left定位的父级 */
  32. position: relative;
  33. min-height: 300px;
  34. }
  35. /* 左侧内容区布局 */
  36. .container .left {
  37. width: 150px;
  38. background-color: lightsteelblue;
  39. min-height: 300px;
  40. position: absolute;
  41. /* 默认值 */
  42. /* top: 0; */
  43. left: 0;
  44. }
  45. /* 右侧内容区布局 */
  46. .container .right {
  47. width: 150px;
  48. background-color: lightskyblue;
  49. min-height: 300px;
  50. position: absolute;
  51. /* 默认值 */
  52. /* top: 0; */
  53. right: 0;
  54. }

7. 使用浮动实现三列布局

效果图如下:

下面为代码:

  1. <!-- @format -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>使用浮动实现三列布局</title>
  8. <link rel="stylesheet" href="demo8.css">
  9. </head>
  10. <body>
  11. <!-- 页眉 -->
  12. <div class="header">
  13. <div class="content">
  14. <ui>
  15. <li><a href="">首页</a></li>
  16. <li><a href="">秒杀</a</li>
  17. <li><a href="">客服</a</li>
  18. </ui>
  19. </div>
  20. </div>
  21. <!-- 主体 -->
  22. <div class="container">
  23. <div class="left">左侧</div>
  24. <div class="main">内容区</div>
  25. <div class="right">右侧</div>
  26. </div>
  27. <!-- 页脚 -->
  28. <div class="footer">
  29. <div class="content">
  30. <p>Rinki.me 版权所有|&copy;</p>
  31. </div>
  32. </div>
  33. </body>
  34. </html>

下面为css代码:

  1. /** @format */
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. /* box-sizing: border-box; */
  6. }
  7. a {
  8. text-decoration: none;
  9. color: #666;
  10. }
  11. li {
  12. list-style: none;
  13. }
  14. /* 页脚页眉 */
  15. .header,
  16. .footer {
  17. height: 40px;
  18. background-color: lightblue;
  19. }
  20. .content {
  21. width: 1000px;
  22. margin: auto;
  23. }
  24. .content:first-of-type li {
  25. float: left;
  26. padding: 0 15px;
  27. /* 行内文本的垂直居中,只需要设置它的行高等于父级高度即可 */
  28. line-height: 40px;
  29. }
  30. .footer {
  31. text-align: center;
  32. line-height: 40px;
  33. }
  34. /* 主体使用浮动定位 */
  35. .container {
  36. width: 1000px;
  37. /* min-height: 600px; */
  38. background-color: tomato;
  39. margin: 10px auto;
  40. border: 5px solid #f00;
  41. overflow: hidden;
  42. }
  43. .container > .left,
  44. .container > .right {
  45. width: 200px;
  46. min-height: 600px;
  47. background-color: violet;
  48. }
  49. .container > .left {
  50. float: left;
  51. }
  52. .container > .right {
  53. float: right;
  54. }
  55. .container > .main {
  56. width: 600px;
  57. min-height: 600px;
  58. background-color: lightsalmon;
  59. float: left;
  60. }

8. 圣杯布局的思想以及实现(三列布局)

首先来说说实现圣杯布局的步骤。

1.内容区必须全部渲染,DOM结构中将主体内容写到前面去。
2.中间主体内容必须要自适应,占据整个容器的全部空间。
3.主体内容区,左侧,右侧,全部浮动。
4.通过给左右两侧添加margin负值,让他们回到正确的位置上
5.通过给主体内容区添加padding属性,将左右区块挤出来
6.再给左右两侧通过相对定位,将他们放在正确的位置上

下图是通过以上步骤实现的三列的圣杯布局:

代码为:

  1. <!-- @format -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>圣杯布局:经典的三列PC端布局方式</title>
  8. <link rel="stylesheet" href="demo9.css" />
  9. </head>
  10. <body>
  11. <!-- 页眉与页脚省略 -->
  12. <!-- 主体区优先显示,并且自适应,所以默认100% -->
  13. <div class="container">
  14. <!-- 圣杯要求内容区优先显示 -->
  15. <div class="main">内容区</div>
  16. <div class="left">左侧</div>
  17. <div class="right">右侧</div>
  18. </div>
  19. </body>
  20. </html>

CSS代码为:

  1. /** @format */
  2. .container {
  3. border: 5px dashed;
  4. }
  5. .container > * {
  6. min-height: 400px;
  7. }
  8. .container > .left,
  9. .container > .right {
  10. width: 200px;
  11. background-color: cyan;
  12. }
  13. /* 内容区:默认宽度100%,自适应 */
  14. .container > .main {
  15. width: 100%;
  16. background-color: yellow;
  17. }
  18. .container > * {
  19. /* 为什么左侧右侧,没有贴到上面的内容区,因为内容区的宽度是100% */
  20. float: left;
  21. }
  22. .container {
  23. /* 使父级容器包括浮动的子元素 */
  24. overflow: hidden;
  25. }
  26. /* 将左侧放在内容区的左侧 */
  27. .container > .left {
  28. margin-left: -100%;
  29. }
  30. /* 将右侧放在内容区的右侧 */
  31. .container > .right {
  32. margin-left: -200px;
  33. }
  34. .container {
  35. /* 使用padding将左右两侧的空间挤出来 */
  36. padding: 0 200px;
  37. }
  38. .container > .left {
  39. position: relative;
  40. right: 200px;
  41. }
  42. .container > .right {
  43. position: relative;
  44. left: 200px;
  45. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议