Blogger Information
Blog 14
fans 0
comment 2
visits 12656
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
使用 overflow 给元素定位与浮动完成三列经典布局学习总结
JKY辉哥
Original
906 people have browsed it
  • 1. 浮动元素高度塌陷产生的原因与解决方案

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>浮动元素的高度塌陷与解决方案</title>
  7. <style>
  8. .container {
  9. border: 3px dashed red;
  10. }
  11. .item {
  12. width: 150px;
  13. height: 150px;
  14. }
  15. .item:first-of-type {
  16. background-color: lightgreen;
  17. }
  18. .item:nth-last-of-type(2) {
  19. background-color: lightpink;
  20. }
  21. .item:last-of-type {
  22. background-color: lightsalmon;
  23. }
  24. /* 将三个子元素全部浮动 */
  25. .item {
  26. float: left;
  27. }
  28. /* 出现一个问题,父元素包不住子元素了? 如何解决呢? */
  29. /* 解决方案1: 给父元素也添加一个高度,缺点子元素高度变化,父元素也要跟着调整 */
  30. .container {
  31. /* height: 150px; */
  32. }
  33. /* 解决方案2: 把父元素也浮动起来 ,缺点会产生传导效应*/
  34. /* .container {
  35. float: left;
  36. }
  37. .box {
  38. float: left;
  39. } */
  40. /* 解决方案3: 添加一个专用元素用于清浮动 */
  41. /* .clear {
  42. clear: both;
  43. } */
  44. /* 解决方案4: 通过添加一个伪元素来解决 */
  45. /* .container::after {
  46. content: "";
  47. display: block;
  48. clear: both;
  49. } */
  50. /* 解决方案5: 最简单的解决方案,用到BFC(块级格式化上下文) */
  51. .container {
  52. /* overflow: hidden; */
  53. overflow: auto;
  54. }
  55. </style>
  56. </head>
  57. <body>
  58. <!-- .container>.item1+.item2+.item3 快速生成语法1-->
  59. <!-- .container>.item{$}*3 快速生成语法2-->
  60. <!-- <div class="box"> -->
  61. <div class="container">
  62. <div class="item">1</div>
  63. <div class="item">2</div>
  64. <div class="item">3</div>
  65. <!-- <div class="clear"></div> -->
  66. </div>
  67. <!-- </div> -->
  68. </body>
  69. </html>

元素高度塌陷 5 种解决方案:解决方案

  • 2. 使用定位与浮动完成一个三列经典布局

    • 2.1 使用绝对定位来完成一个通用三列布局

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    6. <title>布局实例: 使用绝对定位来完成一个通用三列布局</title>
    7. <style>
    8. /* 初始化 */
    9. * {
    10. padding: 0;
    11. margin: 0;
    12. box-sizing: border-box;
    13. }
    14. li {
    15. list-style: none;
    16. }
    17. a {
    18. text-decoration: none;
    19. color: #ccc;
    20. }
    21. /* 页眉页脚 */
    22. .header,
    23. .footer {
    24. height: 40px;
    25. background-color: teal;
    26. }
    27. /* 页眉与页脚的内容区 */
    28. .content {
    29. width: 960px;
    30. margin: auto;
    31. }
    32. .content ul li {
    33. float: left;
    34. line-height: 40px;
    35. padding: 0 15px;
    36. }
    37. .content ul li:hover {
    38. background-color: lightyellow;
    39. }
    40. /* 页脚样式 */
    41. .content p {
    42. text-align: center;
    43. line-height: 40px;
    44. }
    45. .container {
    46. width: 960px;
    47. margin: 10px auto;
    48. min-height: 600px;
    49. /* 转为定位元素,做为定位父级 */
    50. position: relative;
    51. }
    52. /* 主体用定位 */
    53. .container > .left {
    54. width: 200px;
    55. background-color: wheat;
    56. min-height: 600px;
    57. position: absolute;
    58. top: 0;
    59. left: 0;
    60. }
    61. .container > .right {
    62. width: 200px;
    63. background-color: turquoise;
    64. min-height: 600px;
    65. position: absolute;
    66. top: 0;
    67. right: 0;
    68. }
    69. .container > .main {
    70. background-color: violet;
    71. min-height: 600px;
    72. width: 540px;
    73. position: absolute;
    74. top: 0;
    75. left: 210px;
    76. }
    77. </style>
    78. </head>
    79. <body>
    80. <!-- 页眉 -->
    81. <div class="header">
    82. <!-- 内容区: 水平居中 -->
    83. <div class="content">
    84. <ul>
    85. <li><a href="">首页</a></li>
    86. <li><a href="">618专场</a></li>
    87. <li><a href="">在线客服</a></li>
    88. </ul>
    89. </div>
    90. </div>
    91. <!-- 主体 -->
    92. <div class="container">
    93. <div class="left">左侧</div>
    94. <div class="main">内容区</div>
    95. <div class="right">右侧</div>
    96. </div>
    97. <!-- 页脚 -->
    98. <div class="footer">
    99. <div class="content">
    100. <p>安徽小皮教育科技有限公司© | 备案号: 皖ICP *********</p>
    101. </div>
    102. </div>
    103. </body>
    104. </html>

    绝对定位实现通用三列布局:绝对定位

    • 2.2 使用浮动来完成一个通用三列布局

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    6. <title>布局实例: 使用浮动来完成一个通用三列布局</title>
    7. <style>
    8. /* 初始化 */
    9. * {
    10. padding: 0;
    11. margin: 0;
    12. box-sizing: border-box;
    13. }
    14. li {
    15. list-style: none;
    16. }
    17. a {
    18. text-decoration: none;
    19. color: #ccc;
    20. }
    21. /* 页眉页脚 */
    22. .header,
    23. .footer {
    24. height: 40px;
    25. background-color: teal;
    26. }
    27. /* 页眉与页脚的内容区 */
    28. .content {
    29. width: 960px;
    30. margin: auto;
    31. }
    32. .content ul li {
    33. float: left;
    34. line-height: 40px;
    35. padding: 0 15px;
    36. }
    37. .content ul li:hover {
    38. background-color: lightyellow;
    39. }
    40. /* 页脚样式 */
    41. .content p {
    42. text-align: center;
    43. line-height: 40px;
    44. }
    45. .container {
    46. width: 960px;
    47. margin: 10px auto;
    48. min-height: 600px;
    49. }
    50. /* 主体用定位 */
    51. .container > .left {
    52. width: 200px;
    53. background-color: wheat;
    54. min-height: 600px;
    55. float: left;
    56. }
    57. .container > .right {
    58. width: 200px;
    59. background-color: turquoise;
    60. min-height: 600px;
    61. float: right;
    62. }
    63. .container > .main {
    64. background-color: violet;
    65. min-height: 600px;
    66. width: 540px;
    67. float: left;
    68. margin-left: 10px;
    69. }
    70. </style>
    71. </head>
    72. <body>
    73. <!-- 页眉 -->
    74. <div class="header">
    75. <!-- 内容区: 水平居中 -->
    76. <div class="content">
    77. <ul>
    78. <li><a href="">首页</a></li>
    79. <li><a href="">618专场</a></li>
    80. <li><a href="">在线客服</a></li>
    81. </ul>
    82. </div>
    83. </div>
    84. <!-- 主体 -->
    85. <div class="container">
    86. <div class="left">左侧</div>
    87. <div class="main">内容区</div>
    88. <div class="right">右侧</div>
    89. </div>
    90. <!-- 页脚 -->
    91. <div class="footer">
    92. <div class="content">
    93. <p>安徽小皮教育科技有限公司© | 备案号: 皖ICP *********</p>
    94. </div>
    95. </div>
    96. </body>
    97. </html>

    浮动实现三列通用布局:浮动

    • 2.3 使用圣杯来完成一个通用三列布局:二端固定,中间自适应

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    6. <title>
    7. 布局实例: 使用圣杯来完成一个通用三列布局:二端固定,中间自适应
    8. </title>
    9. <style>
    10. /* 初始化 */
    11. * {
    12. padding: 0;
    13. margin: 0;
    14. box-sizing: border-box;
    15. }
    16. li {
    17. list-style: none;
    18. }
    19. a {
    20. text-decoration: none;
    21. color: #ccc;
    22. }
    23. /* 页眉页脚 */
    24. .header,
    25. .footer {
    26. height: 40px;
    27. background-color: lightyellow;
    28. }
    29. /* 页眉与页脚的内容区 */
    30. .content {
    31. width: 960px;
    32. margin: auto;
    33. }
    34. .content ul li {
    35. float: left;
    36. line-height: 40px;
    37. padding: 0 15px;
    38. }
    39. .content ul li:hover {
    40. background-color: seagreen;
    41. color: black;
    42. }
    43. /* 页脚样式 */
    44. .content p {
    45. text-align: center;
    46. line-height: 40px;
    47. }
    48. .container {
    49. border: 1px dashed;
    50. overflow: hidden;
    51. }
    52. .container > * {
    53. min-height: 400px;
    54. }
    55. /* 左右固定 */
    56. .container > .left,
    57. .container > .right {
    58. background-color: thistle;
    59. width: 200px;
    60. }
    61. /* 中间样式 */
    62. .container > .main {
    63. background-color: turquoise;
    64. width: 100%;
    65. }
    66. /* 所有子元素浮动起来 */
    67. .container > * {
    68. float: left;
    69. }
    70. /* 使用内边距把左右二边的位置挤出来 */
    71. .container {
    72. /* padding-right: 200px;
    73. padding-right:200px; */
    74. padding: 0 200px;
    75. }
    76. .container > .left {
    77. /* 使用相对定位将它复位 */
    78. margin-left: -100%;
    79. position: relative;
    80. top: 0;
    81. right: 200px;
    82. }
    83. .container > .right {
    84. margin-right: -200px;
    85. position: relative;
    86. top: 0;
    87. left: 0;
    88. }
    89. </style>
    90. </head>
    91. <body>
    92. <!-- 页眉 -->
    93. <div class="header">
    94. <!-- 内容区: 水平居中 -->
    95. <div class="content">
    96. <ul>
    97. <li><a href="">首页</a></li>
    98. <li><a href="">618专场</a></li>
    99. <li><a href="">在线客服</a></li>
    100. </ul>
    101. </div>
    102. </div>
    103. <!-- 主体 -->
    104. <div class="container">
    105. <!-- 圣杯布局要求主体内容优先渲染 -->
    106. <div class="main">内容区</div>
    107. <div class="left">左侧</div>
    108. <div class="right">右侧</div>
    109. </div>
    110. <!-- 页脚 -->
    111. <div class="footer">
    112. <div class="content">
    113. <p>安徽小皮教育科技有限公司© | 备案号: 皖ICP *********</p>
    114. </div>
    115. </div>
    116. </body>
    117. </html>

    圣杯实现三列通用布局:圣杯

  • 3.使用 Grid 实现三列经典布局(选学)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Grid: 选学</title>
  7. <style>
  8. body {
  9. display: grid;
  10. /* 总共三列,第一列200px,第二列自适应,第三列200px */
  11. grid-template-columns: 200px 1fr 200px;
  12. /* 总共三行,第一行40px,第二行500px,第三行40px */
  13. grid-template-rows: 40px 500px 40px;
  14. /* 定义所有元素间隙10px */
  15. gap: 10px;
  16. }
  17. /* 添加参考线 */
  18. body > * {
  19. outline: 1px dashed red;
  20. /* 定义每个元素背景 */
  21. background-color: lightseagreen;
  22. color: white;
  23. }
  24. .header,
  25. .footer {
  26. /* 跨行跨列 */
  27. grid-column-end: span 4;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div class="header">头部</div>
  33. <div class="left">左侧</div>
  34. <div class="main">主体</div>
  35. <div class="right">右侧</div>
  36. <div class="footer">底部</div>
  37. </body>
  38. </html>

grid 实现三列通用布局,推荐布局方式:grid

  • 4.页面图片懒加载(选学)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>懒加载原理: 滚动高级与偏移高度的案例</title>
  7. </head>
  8. <body>
  9. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  10. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  11. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  12. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  13. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  14. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  15. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  16. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  17. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  18. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  19. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  20. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  21. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  22. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  23. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  24. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  25. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  26. <img src="temp.jpg" alt="图片" data-src="thief.png" />
  27. </body>
  28. <script>
  29. //视口大小:窗口大小
  30. const viewHeight = document.documentElement.clientHeight;
  31. //监听文档对象的滚动事件
  32. document.addEventListener("scroll", showImg);
  33. // 初始化
  34. window.addEventListener("load", showImg);
  35. // 回调
  36. function showImg() {
  37. // 获取所有图片
  38. let imgs = document.querySelectorAll("img");
  39. console.log(imgs);
  40. // 遍历每一张图片,判断当前的图片是否进入到入用户的可视区域
  41. imgs.forEach(function (img) {
  42. let imgTop = img.offsetTop;
  43. // 滚动高度 = 视口高度 + 滚动距离
  44. let scrTop = viewHeight + document.documentElement.scrollTop;
  45. //图片已进入可视区
  46. if (imgTop < scrTop) {
  47. img.src = img.dataset.src;
  48. }
  49. });
  50. }
  51. </script>
  52. </html>

图片懒加载:懒加载

  • 4.总结

    • 任何元素,一旦浮动都自动转为块级元素
    • 浮动元素只会影响到它后面的元素布局,对前面没有影响
    • 浮动元素只能水平方向浮动,浮动元素的浮动边界仅限于内容区
    • 浮动元素浮动之后,它后面的元素会自动填充它让出来的空间大小
    • box2 浮动之后从文档流中脱离出来(意思就是它会释放它原来在文档流中占据的空间)
    • 行内元素用于最终内容的载体, 不能充当容器/当父级,不能设置或设置了宽高也是无效的
    • 浮动元素的高度塌陷与解决方案,最简单的解决方案,用到 BFC(块级格式化上下文),给父元素添加 overflow: hidden 或 overflow: auto;
Correcting teacher:WJWJ

Correction status:qualified

Teacher's comments:写的非常认真仔细,格式工整,继续加油!
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post