博客列表 >CSS 盒模型、定位和传统布局

CSS 盒模型、定位和传统布局

J
J原创
2020年08月06日 17:04:37729浏览

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

默认盒子大小计算公式: 内容区 + 内边距 + 边框。
盒子模型的排列位置由外边距(margin)决定,不影响盒子的大小。
宽度150px = 100px (width) + 40px(左、右内边距) + 10px(左、右边框)。
高度150px = 100px (height) + 40px(上、下内边距) + 10px(上、下边框)。

  1. <style>
  2. .box {
  3. /* 内容区 */
  4. height: 100px;
  5. width: 100px;
  6. /* 设置背景颜色 */
  7. background-color: lightgreen;
  8. /* 背景颜色只显示内容区 */
  9. background-clip: content-box;
  10. /* 外边距30px */
  11. margin: 30px;
  12. /* 设置内边距20px 内边距是透明的*/
  13. padding: 20px;
  14. /* 设置边框 */
  15. border: 5px solid #000;
  16. /* 自定义盒子计算公式,盒子内容区包括边框和内边距 */
  17. /* box-sizing: border-box; */
  18. }
  19. </style>
  20. <body>
  21. <div class="box">box</div>
  22. </body>

代码运行结果图:

2.box-sizing属性

box-sizing: 用来自定义盒子计算公式,盒子内容区是否计算内边距和边框。box-sizing:content-box(默认):盒子大小只计算内容区,当box_sizing:border-box,此时,盒子的大小包括内边距和边框,但总大小始终等于盒子的大小,此时的内容区大小会被压缩。

真正内容区的宽度: 200px(width) - 40px(左、右内边距) - 10(左、右边框) = 150px

  1. <style>
  2. .box {
  3. /* 内容区 */
  4. height: 200px;
  5. width: 200px;
  6. /* 设置背景颜色 */
  7. background-color: lightgreen;
  8. /* 外边距30px */
  9. margin: 30px;
  10. /* 设置内边距20px */
  11. padding: 20px;
  12. /* 设置边框 */
  13. border: 5px solid #000;
  14. /* 自定义盒子计算公式,此时盒子内容区包括边框和内边距 */
  15. box-sizing: border-box;
  16. }
  17. </style>
  18. <body>
  19. <div class="box">box</div>
  20. </body>

代码运行结果图:

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

3.1绝对定位与相对定位的区别

绝对定位:元素的位置相对于最近的已定位父元素,如果没有就相对于当前窗口进行定位(body/html),参照物是它的父级包含块;
相对定位:定位元素是相对于元素的当前位置进行定位,参照物是它的当前位置。相对定位通常作为绝对定位父级的定位元素。

3.2绝对定位与相对定位的应用

  1. <style>
  2. .box.one {
  3. /* 内容区 */
  4. width: 300px;
  5. height: 300px;
  6. /* 背景颜色 */
  7. background-color: lightblue;
  8. /* 相对定位relative通常作为父级定位属性使用 */
  9. position: relative;
  10. /* 避免子元素margin影响到父级 */
  11. overflow: hidden;
  12. }
  13. .box.two {
  14. /* 内容区 */
  15. width: 100px;
  16. height: 100px;
  17. /* margin-top: 50px; */
  18. /* margin-left: 30px; */
  19. /* 背景颜色 */
  20. background-color: lightcoral;
  21. /* 绝对元素:参考物就是他的父级包含块(就是他的所有上级元素中具有具体定位属性的元素) */
  22. position: absolute;
  23. top: 0;
  24. left: 50px;
  25. }
  26. .box.three {
  27. /* 内容区 */
  28. width: 100px;
  29. height: 100px;
  30. margin-top: 100px;
  31. background-color: lightgreen;
  32. /* box3相对原来的位置,向右移了100px 向下100px,到了如图位置 */
  33. position: relative;
  34. top: 100px;
  35. left: 100px;
  36. }
  37. </style>
  38. <body>
  39. <div class="box one">
  40. <div class="box two">box2-绝对</div>
  41. <div class="box three">box3-相对</div>
  42. </div>
  43. </body>

代码运行结果图:

4. 固定定位与绝对定位的区别

固定定位: 元素的位置始终将当前的窗口做为定位父级,始终显示在当前页面上
绝对定位:一定要有一个定位父级/包含块,如果没有就相对于当前窗口进行定位(body/html)

  1. <style>
  2. .box.one {
  3. /* 内容区 */
  4. width: 300px;
  5. height: 200px;
  6. /* 背景颜色 */
  7. background-color: lightblue;
  8. /* 相对定位relative通常作为父级定位属性使用 */
  9. position: relative;
  10. /* 加一个margin让页面能够上下滚动 */
  11. margin-bottom: 1000px;
  12. }
  13. .box.two {
  14. /* 内容区 */
  15. width: 100px;
  16. height: 100px;
  17. /* margin-top: 50px; */
  18. /* margin-left: 30px; */
  19. /* 背景颜色 */
  20. background-color: lightcoral;
  21. /* 绝对元素:参考物就是他的父级包含块(就是他的所有上级元素中具有具体定位属性的元素) */
  22. position: absolute;
  23. top: 0;
  24. left: 50px;
  25. }
  26. .fix {
  27. width: 100px;
  28. height: 100px;
  29. background-color: lightgreen;
  30. position: fixed;
  31. top: 0;
  32. left: 350px;
  33. }
  34. </style>
  35. <body>
  36. <div class="box one">
  37. <div class="box two">绝对定位 top:0; left:50px</div>
  38. </div>
  39. <div class="fix three">固定定位 top0; left:350px</div>
  40. </body>

代码运行结果图:

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

为什么垂直居中如此困难?因为页面的宽度有限,而高度是无限的,并且允许用户翻页,所以无法确定页面的高度,可以通过使用绝对定位实现垂直居中。

  1. <style>
  2. .box {
  3. width: 200px;
  4. height: 200px;
  5. background-color: lightgray;
  6. /* 父级定位元素 */
  7. position: relative;
  8. }
  9. .box1 {
  10. width: 100px;
  11. height: 100px;
  12. background-color: lightcoral;
  13. /* 1.水平居中 */
  14. /* 子块的外边距让浏览器根据父级的宽度自动计算 */
  15. /* margin-left: auto; */
  16. /* margin-right: auto; */
  17. /* 2.垂直居中,使用绝对定位 */
  18. position: absolute;
  19. /* 定位起点 */
  20. top: 0;
  21. left: 0;
  22. /* 定位终点 */
  23. right: 0;
  24. bottom: 0;
  25. /* 使当前的元素定位的上下文充满整个父级容器 */
  26. /* 1.水平居中 */
  27. /* margin-left: auto; */
  28. /* margin-right: auto; */
  29. /* 2.垂直居中 */
  30. margin-top: auto;
  31. margin-bottom: auto;
  32. /* 简化 */
  33. margin: auto;
  34. }
  35. </style>
  36. <body>
  37. <div class="box">
  38. <div class="box1">居中</div>
  39. </div>
  40. </body>

代码运行结果图:

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

二列布局:第一列绝对定位的起始点top:0;left:0;,宽度:width:200px;第二列起始点top:0;right:0,宽度:width:800px,再给个内边距padding:10px

注意:使用绝对定位,父级一定要有定位元素position:relative

html布局如下:

  1. <style>
  2. @import url(demo5.css);
  3. </style>
  4. <body>
  5. <!-- 页眉 -->
  6. <div class="header">
  7. <div class="content">
  8. <ul>
  9. <li><a href="">首页</a></li>
  10. <li><a href="">新闻</a></li>
  11. <li><a href="">视频</a></li>
  12. <li><a href="">地图</a></li>
  13. <li><a href="">贴吧</a></li>
  14. <li><a href="">学术</a></li>
  15. <li><a href="">更多</a></li>
  16. </ul>
  17. </div>
  18. </div>
  19. <!-- 主体 -->
  20. <div class="container">
  21. <div class="left">左侧</div>
  22. <div class="main">内容</div>
  23. </div>
  24. <!-- 页脚 -->
  25. <div class="footer">
  26. <div class="content">
  27. <p>Copyright © 2017-2020 *******.com 版权所有</p>
  28. </div>
  29. </div>
  30. </body>

css样式如下:

  1. * {
  2. /* 初始化 */
  3. padding: 0;
  4. margin: 0;
  5. box-sizing: border-box;
  6. }
  7. /* a标签 */
  8. a {
  9. color: black;
  10. /* 开启浮动 */
  11. float: left;
  12. /* 去掉a标签的下划线 */
  13. text-decoration: none;
  14. padding: 0 20px;
  15. /* 设置行高与父级高度一样,达到居中效果 */
  16. line-height: 40px;
  17. }
  18. /* 鼠标覆盖a标签 */
  19. a:hover {
  20. background-color: lightcoral;
  21. /* color: white; */
  22. }
  23. li {
  24. /* 去掉li标签前面的样式 */
  25. list-style: none;
  26. }
  27. /* 页眉页脚 */
  28. .header,
  29. .footer {
  30. height: 40px;
  31. background-color: lightblue;
  32. }
  33. .content {
  34. width: 1000px;
  35. height: 40px;
  36. /* background-color: lightgreen; */
  37. /* 居中显示 */
  38. margin: auto;
  39. line-height: 40px;
  40. }
  41. /* 第一个content元素 */
  42. .content:last-of-type {
  43. /* 文本居中显示 */
  44. text-align: center;
  45. }
  46. /* 主体 */
  47. .container {
  48. width: 1000px;
  49. /* 最小宽度600 */
  50. min-height: 600px;
  51. background-color: lightgray;
  52. /* 上下边距10 左右边距自动 */
  53. margin: 10px auto;
  54. /* 设置父级定位,作为子元素的定位元素 */
  55. position: relative;
  56. }
  57. /* 左侧 */
  58. .container .left {
  59. width: 200px;
  60. height: 600px;
  61. background-color: yellow;
  62. /* 绝对定位 */
  63. position: absolute;
  64. /* 起始点 默认值*/
  65. /* top: 0; */
  66. /* left: 0; */
  67. }
  68. /* 内容区 */
  69. .container .main {
  70. width: 800px;
  71. height: 600px;
  72. background-color: lightgreen;
  73. /* 加个边距 */
  74. padding: 10px;
  75. /* 背景裁切 */
  76. /* background-clip: content-box; */
  77. /* 绝对定位 */
  78. position: absolute;
  79. /* 起始点 */
  80. /* top: 0; */
  81. right: 0;
  82. }

代码运行结果图:

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

三列布局: 使用float这个属性实现三列布局
注意: 浮动布局,父级高度塌陷,需要使用overflow:hidden隐藏溢出,转成BFC块。
html代码如下:

  1. <style>
  2. @import url(demo6.css);
  3. </style>
  4. <body>
  5. <!-- 页眉 -->
  6. <div class="header">
  7. <div class="content">
  8. <ul>
  9. <li><a href="">首页</a></li>
  10. <li><a href="">新闻</a></li>
  11. <li><a href="">视频</a></li>
  12. <li><a href="">地图</a></li>
  13. <li><a href="">贴吧</a></li>
  14. <li><a href="">学术</a></li>
  15. <li><a href="">更多</a></li>
  16. </ul>
  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>Copyright © 2017-2020 *******.com 版权所有</p>
  29. </div>
  30. </div>
  31. </body>

CSS样式表如下:

  1. * {
  2. /* 初始化 */
  3. padding: 0;
  4. margin: 0;
  5. /* 自定义盒子计算公式 */
  6. box-sizing: border-box;
  7. }
  8. /* a标签 */
  9. a {
  10. color: black;
  11. /* 开启浮动 */
  12. float: left;
  13. /* 去掉a标签的下划线 */
  14. text-decoration: none;
  15. padding: 0 20px;
  16. /* 设置行高与父级高度一样,达到居中效果 */
  17. line-height: 40px;
  18. }
  19. /* 鼠标覆盖a标签 */
  20. a:hover {
  21. background-color: lightcoral;
  22. /* color: white; */
  23. }
  24. li {
  25. /* 去掉li标签前面的样式 */
  26. list-style: none;
  27. }
  28. /* 页眉页脚 */
  29. .header,
  30. .footer {
  31. height: 40px;
  32. background-color: lightblue;
  33. }
  34. .content {
  35. width: 1000px;
  36. height: 40px;
  37. /* background-color: lightgreen; */
  38. /* 居中显示 */
  39. margin: auto;
  40. line-height: 40px;
  41. }
  42. /* 第一个content元素 */
  43. .content:last-of-type {
  44. /* 文本居中显示 */
  45. text-align: center;
  46. }
  47. /* 主体 */
  48. .container {
  49. width: 1000px;
  50. /* 最小宽度600 */
  51. /* min-height: 600px; 浮动布局父元素高度失效 */
  52. background-color: lightgray;
  53. /* 上下边距10 左右边距自动 */
  54. margin: 10px auto;
  55. /* border: 5px solid #000; */
  56. /* 隐藏溢出内容 转成BFC块*/
  57. overflow: hidden;
  58. }
  59. /* 左右侧公共属性 */
  60. .container .left,
  61. .container .right {
  62. width: 200px;
  63. min-height: 600px;
  64. background-color: yellow;
  65. }
  66. /* 左侧 */
  67. .container .left {
  68. float: left;
  69. }
  70. /* 右侧 */
  71. .container .right {
  72. float: right;
  73. }
  74. /* 内容区 */
  75. .container .main {
  76. float: left;
  77. width: 600px;
  78. min-height: 600px;
  79. background-color: lightpink;
  80. }

代码运行结果图:

8. 圣杯布局的思想,用圣杯布局实现三列布局

圣杯布局的步骤:

  • 内容区必须优先渲染,DOM结构中将主体写到前面
  • 中间主体内容区必须自适应,占据整个容器的全部空间
  • 内容区左右全部浮动(左浮动float:left)
  • 通过给左右两侧设置margin的负值,使它们回到容器的正确位置上
  • 给容器设置左右的padding,宽度与左右两侧宽度相等,将左右区域挤出来
  • 再给左右两侧通过相对定位,将它们最终放到正确的位置上

html 代码如下:

  1. <link rel="stylesheet" href="demo7.css" />
  2. <body>
  3. <!-- 页眉 -->
  4. <div class="header">
  5. <div class="content">
  6. <ul>
  7. <li><a href="">首页</a></li>
  8. <li><a href="">新闻</a></li>
  9. <li><a href="">视频</a></li>
  10. <li><a href="">地图</a></li>
  11. <li><a href="">贴吧</a></li>
  12. <li><a href="">学术</a></li>
  13. <li><a href="">更多</a></li>
  14. </ul>
  15. </div>
  16. </div>
  17. <!-- 主体 -->
  18. <div class="container">
  19. <div class="main">
  20. 央视网消息(焦点访谈):2020年过了一大半,我们经受的考验一个接一个。突如其来的新冠肺炎疫情,给中国出了一道“加试题”,我们一边抓全面抗疫,一边抓经济社会发展的运行和恢复。经过艰苦卓绝的努力,二季度中国经济增速已经由负转正。但是,新冠肺炎疫情仍然在全球肆虐,错综复杂的内外环境仍然存在不确定性。中国经济面临的形势到底是怎样的?下一步我们如何应对?7月30日,习近平总书记主持召开中共中央政治局会议,分析研究当前经济形势,部署下一段的经济工作。
  21. </div>
  22. <div class="left">左侧</div>
  23. <div class="right">右侧</div>
  24. </div>
  25. <!-- 页脚 -->
  26. <div class="footer">
  27. <div class="content">
  28. <p>Copyright © 2017-2020 *******.com 版权所有</p>
  29. </div>
  30. </div>
  31. </body>

CSS代码如下:

  1. * {
  2. /* 初始化 */
  3. padding: 0;
  4. margin: 0;
  5. /* 自定义盒子计算公式 */
  6. box-sizing: border-box;
  7. }
  8. /* a标签 */
  9. a {
  10. color: black;
  11. /* 开启浮动 */
  12. float: left;
  13. /* 去掉a标签的下划线 */
  14. text-decoration: none;
  15. padding: 0 20px;
  16. /* 设置行高与父级高度一样,达到居中效果 */
  17. line-height: 40px;
  18. }
  19. /* 鼠标覆盖a标签 */
  20. a:hover {
  21. background-color: lightcoral;
  22. /* color: white; */
  23. }
  24. li {
  25. /* 去掉li标签前面的样式 */
  26. list-style: none;
  27. }
  28. /* 页眉页脚 */
  29. .header,
  30. .footer {
  31. height: 40px;
  32. background-color: lightblue;
  33. }
  34. .content {
  35. width: 1000px;
  36. height: 40px;
  37. /* background-color: lightgreen; */
  38. /* 居中显示 */
  39. margin: auto;
  40. line-height: 40px;
  41. }
  42. /* 第一个content元素 */
  43. .content:last-of-type {
  44. /* 文本居中显示 */
  45. text-align: center;
  46. }
  47. /* 主体 */
  48. .container {
  49. /* 加一个虚线 */
  50. /* border: 5px dotted #000; */
  51. /* 用overflow:hidden转成BFC块,使父级元素包住浮动的子元素 */
  52. overflow: hidden;
  53. /* 左右挤出200内边距给左右两侧 */
  54. padding: 10px 200px;
  55. }
  56. /* 主体下所有元素 */
  57. .container > * {
  58. /* 最小高度 */
  59. min-height: 600px;
  60. /* 所有元素浮动 */
  61. float: left;
  62. }
  63. /* 左右侧加一个200px的宽度,背景色 */
  64. .container .left,
  65. .container .right {
  66. width: 200px;
  67. background-color: yellow;
  68. }
  69. /* 主体内容区宽度必须自适应100% */
  70. .container .main {
  71. width: 100%;
  72. background-color: lightpink;
  73. }
  74. /* 将左侧元素放在内容区左侧 */
  75. .container .left {
  76. margin-left: -100%;
  77. /* 相对定位,往左200px */
  78. position: relative;
  79. right: 200px;
  80. }
  81. /* 将右侧元素放在内容区右侧 */
  82. .container .right {
  83. margin-left: -200px;
  84. /* 相对定位,往右200px */
  85. position: relative;
  86. left: 200px;
  87. }

代码运行结果图:

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