博客列表 >使用 overflow 给元素定位与浮动完成三列经典布局学习总结

使用 overflow 给元素定位与浮动完成三列经典布局学习总结

JKY辉哥
JKY辉哥原创
2020年06月19日 18:19:59905浏览
  • 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;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议