博客列表 >前段定位与浮动实现三列经典布局

前段定位与浮动实现三列经典布局

emagic
emagic原创
2020年06月21日 15:16:42736浏览

0618作业

一. 浮动元素高度塌陷产生的原因与解决方案(伪元素与overflow)

浮动元素高度塌陷产生的原因是元素浮动之后,释放原来占据的空间,会从文档流中脱离出来
元素浮动之后其后面的元素会占据浮动元素原来在文档流中的位置

  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-of-type(2) {
  19. background-color: lightcoral;
  20. }
  21. .item:last-of-type {
  22. background-color: lightblue;
  23. }
  24. /* 将三个子元素全部浮动,此时父元素包不住子元素了,有什么办法解决 */
  25. .item {
  26. float: left;
  27. }
  28. /* 解决方案1:给父元素添加一个高度 */
  29. /* .container {
  30. height: 150px;
  31. } */
  32. /* 解决方案2:给父元素也浮动起来 */
  33. /* .container {
  34. float: left;
  35. } */
  36. /* 解决方案3:添加一个专用的清浮动的元素 */
  37. /* .clear {
  38. clear: both;
  39. } */
  40. /* 解决方案4:添加一个伪元素 */
  41. /* .container::after {
  42. content: "";
  43. display: block;
  44. clear: both;
  45. } */
  46. /* 解决方案5:最简单的解决方案 ,用BFC(块级格式化上下文)*/
  47. .container {
  48. overflow: hidden;
  49. /* 或者 overflow: auto; */
  50. }
  51. </style>
  52. </head>
  53. <body>
  54. <div class="container">
  55. <div class="item">1</div>
  56. <div class="item">2</div>
  57. <div class="item">3</div>
  58. </div>
  59. </body>
  60. </html>

解决方案梳理:

序号 解决方案 推荐指数
1 给父元素设置一个高度 不推荐,如果子元素的高度改了,父元素也会包不住,无法自适应
2 给父元素也浮动起来 不推荐,如果父元素上面还有父元素要布局,多层会造成传递效应
3 添加一个专用的清浮动的元素 不推荐,页面要依赖附加的dom结构
4 通过添加伪元素 可以用,但还有更好的,见方案5
5 用BFC(块级格式化上下文) 推荐使用这种overflow: hidden;或者overflow: auto;

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

  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. margin: 0;
  11. padding: 0;
  12. box-sizing: border-box;
  13. }
  14. li {
  15. list-style: none;
  16. /* li前面的小黑点去掉 */
  17. }
  18. a {
  19. text-decoration: none;
  20. /* a标签的下划线去掉 */
  21. color: #666;
  22. }
  23. /* 页眉与页脚 */
  24. .header,
  25. .footer {
  26. height: 40px;
  27. background-color: lightblue;
  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: gold;
  41. font-size: 1.1rem;
  42. }
  43. /* 页脚样式 */
  44. .content p {
  45. text-align: center;
  46. line-height: 40px;
  47. }
  48. /* 主体用定位 */
  49. .container {
  50. width: 960px;
  51. margin: 10px auto;
  52. min-height: 600px;
  53. /* 防止浮动元素的高度塌陷 */
  54. overflow: auto;
  55. }
  56. .container > .left {
  57. width: 200px;
  58. background-color: lightgreen;
  59. min-height: 600px;
  60. float: left;
  61. }
  62. .container > .right {
  63. width: 200px;
  64. background-color: lightgreen;
  65. min-height: 600px;
  66. float: right;
  67. }
  68. .container > .main {
  69. background-color: wheat;
  70. min-height: 600px;
  71. width: 540px;
  72. float: left;
  73. margin-left: 10px;
  74. }
  75. </style>
  76. </head>
  77. <body>
  78. <!-- 页眉 -->
  79. <div class="header">
  80. <div class="content">
  81. <ul>
  82. <li><a href="">首页</a></li>
  83. <li><a href="">会员管理</a></li>
  84. <li><a href="">购物车</a></li>
  85. </ul>
  86. </div>
  87. </div>
  88. <!-- 主体 -->
  89. <div class="container">
  90. <div class="left">左侧栏</div>
  91. <div class="main">中间内容区</div>
  92. <div class="right">右侧栏</div>
  93. </div>
  94. <!-- 页脚 -->
  95. <div class="footer">
  96. <div class="content">
  97. <p>XX电商服务有限公司&copy;|备案号:粤ICP:*****335454***55</p>
  98. </div>
  99. </div>
  100. </body>
  101. </html>

  • min-height: 600px;
    /* 最小高度,无内容也有个区域高度 */

课堂小结:

懒加载:根据滚动条,让进入用户可视区的图片才加载

  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="15.jpg" alt="" data-src="16.png" />
  10. <img src="15.jpg" alt="" data-src="16.png" />
  11. <img src="15.jpg" alt="" data-src="16.png" />
  12. <img src="15.jpg" alt="" data-src="16.png" />
  13. <img src="15.jpg" alt="" data-src="16.png" />
  14. <img src="15.jpg" alt="" data-src="16.png" />
  15. </body>
  16. <script>
  17. // 视口大小,获取视口高度
  18. const viewHeight = document.documentElement.clientHeight;
  19. // 滚动距离
  20. document.addEventListener("scroll", showImg);
  21. // 初始化 ,打开页面的时候先加载已进入页面的图,
  22. window.addEventListener("load", showImg);
  23. // 回调函数
  24. function showImg() {
  25. // 获取所有图片
  26. let imgs = document.querySelectorAll("img");
  27. // 遍历每一张图片,判断当前图片是否进入到了用户的视口区域
  28. imgs.forEach(function (img) {
  29. let imgTop = img.offsetTop;
  30. // 滚动高度 = 视口高度+滚动距离
  31. let scrTop = viewHeight + document.documentElement.scrollTop;
  32. //当前图片如果进入定位父级的高度 < 当前的滚动高度 表明图片已经进入了可视区
  33. if (imgTop < scrTop) {
  34. img.src = img.dataset.src;
  35. //用自定义的类里面的图片地址替换原生的图片地址
  36. }
  37. });
  38. }
  39. </script>
  40. </html>

<img src="占位图.png" alt="" data-src="实际要显示的图片.jpg"/>

  • data-src是一个自定义的类

  • 1.拿到视口大小
    const viewHight = document.documentElement.clientHeight;

  • 2.监听文档对象的移动事件 ,,监听scroll事件
    document.addEventListener("scroll", showImg);
  • 3.滚动高度 = 视口高度+滚动距离

  • 4.当前图片如果进入定位父级的高度 < 当前的滚动高度 表明图片已经进入了可视区

  1. if (imgTop < scrTop) {
  2. img.src = img.dataset.src;
  3. //用自定义的类里面的图片地址替换原生的图片地址
  4. }
  • 5.初始化,打开页面的时候先加载已进入页面的图,监听load事件
    window.addEventListener("load", showImg);

浮动的知识点

  • 浮动只能沿着水平方向浮动(即左右方向)
  • 浮动元素的浮动边界仅限于内容区
  • `元素浮动之后释放原来占据的空间,会从文档流中脱离出来
  • 元素浮动之后其后面的元素会占据浮动元素原来在文档流中的位置
  • 浮动元素只会影响其后面的元素布局,不会影响其前面的元素布局

  • 行内元素用于最终内容的载体(如文本),不能充当容器/父级,设置宽高是无效的。除非浮动起来

  • 任何元素一旦浮动都自动转为块级元素

  • 不想让他受到前面元素的影响,用clear. clear:left清除左浮动的影响,clear:right清除右浮动的影响,clear:both清除全部浮动的影响,

  • min-height: 设置最小高度,无内容也有个区域高度

圣杯布局

  • 两边固定,中间自适应
  • margin可以是负值
  • 圣杯布局要求主体内容优先渲染(写在同级元素前面)
  • 使用内边距把容器左右两边位置挤出来放左右边栏 ,因为浮动只在内边距区域内生效,而且主体设了100%

Grid布局

  • 1.整个页面转为Grid布局display: grid;
  • 2.列设置:
    根据需要设置三列
    grid-template-columns: 第一列的宽度 自适应(1fr) 第三列的宽度
    grid-template-columns: 200px 1fr 200px;
  • 3.行设置
    grid-template-rows: 40px 1fr 40px;
    -4.页眉、页脚归位
    grid-column-end: span 4;
  • 5.行列间距
    gap:10px;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议