博客列表 >浮动与布局

浮动与布局

王佳祥
王佳祥原创
2020年06月19日 14:56:17665浏览

浮动与布局

一、浮动

1.浮动的原理:

  • 浮动会使元素漂浮再没有设置浮动的元素上面,它默认会把行元素转换成块元素

  • 没有浮动之前,块元素都是垂直排列,浮动之后块元素会水平排列

  • 浮动的元素会从文档流中脱离出来(意思是它会释放它原来在文档中占据的空间)

  • 元素浮动之后,后面没有浮动的元素会自动填充它让出来的空间

  • 浮动元素只会影响到它后面的元素布局,对前面没影响

  • 行元素浮动之前,不可以设置宽高,浮动之后转为块元素后,便可以设置宽高

  • 实例:

  1. <style>
  2. .box {
  3. width: 300px;
  4. height: 200px;
  5. font-size: 30px;
  6. text-align: center;
  7. line-height: 200px;
  8. }
  9. .box1 {
  10. background-color: deepskyblue;
  11. }
  12. .box2 {
  13. background-color: dimgray;
  14. margin-left: 200px;
  15. float: left;
  16. }
  17. .box3 {
  18. background-color: gold;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div class="box box1"></div>
  24. <div class="box box2"></div>
  25. <div class="box box3"></div>
  26. <hr />
  27. <a href="">php.cn</a>
  28. <span>php中文网欢迎您</span>
  29. </body>
  • 浮动之前:

  • 浮动之后:

2.清除浮动

  • 额外标签法(在最后一个浮动标签后,新加一个标签,给其设置clear:both;)(不推荐)

  • 父级添加overflow属性(父元素添加overflow:hidden)(不推荐)

  • 使用after伪元素清除浮动(推荐使用)

  1. :after{/*伪元素是行内元素 正常浏览器清除浮动方法*/
  2. content: "";
  3. display: block;
  4. height: 0;
  5. clear:both;
  6. visibility: hidden;
  7. }
  • 给浮动元素父级设置高度,在浮动元素高度不确定的时候不适用

  • 以浮制浮(父级同时浮动),需要给每个浮动元素父级添加浮动,浮动多了容易出现问题

3.浮动的高度塌陷与解决方案

  • 当三个元素浮动之后,父级没有撑开如下图:

  • 代码:
  1. <style>
  2. .div1 {
  3. border: 5px dashed #000;
  4. }
  5. .box {
  6. width: 200px;
  7. height: 200px;
  8. float: left;
  9. }
  10. .box1 {
  11. background-color: deepskyblue;
  12. }
  13. .box2 {
  14. background-color: dimgray;
  15. }
  16. .box3 {
  17. background-color: gold;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div class="div1">
  23. <div class="box box1"></div>
  24. <div class="box box2"></div>
  25. <div class="box box3"></div>
  26. </div>
  27. </body>
  • 解决方案一:
  1. 给父级添加高度:height:200px;
  2. 如图:

这种方案不能自适应盒子高度,所以不推荐使用

  • 解决方案二:
  1. 把父元素也浮动,但是父元素太多的话,容易产生传导效应,导致一些问题出现
  2. .div{flaot:left;}
  3. 也不推荐使用

  • 解决方案三:
  1. 添加一个专门清除浮动的元素
  2. <div class="clear"></div>
  3. .clear{clear:both;}
  4. 添加无意义标签,语义化差,不推荐使用

  • 解决方案四:
  1. 使用::after伪元素
  2. .div::after{content:"";display:block;clear:both;}

  • 解决方案五:(推荐使用)
  1. 最简单的解决方案,用到BFC(块级格式化上下文)
  2. .div1{overflow:auto;//overflow:hidden;}

二、布局实战

1. 绝对定位布局

  • 代码:
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .header,
  7. .footer {
  8. width: 960px;
  9. height: 50px;
  10. background: lightgreen;
  11. margin: 0 auto;
  12. }
  13. .main {
  14. height: 600px;
  15. width: 960px;
  16. margin: 10px auto;
  17. position: relative;
  18. }
  19. .left,
  20. .right {
  21. min-width: 190px;
  22. min-height: 600px;
  23. background: moccasin;
  24. }
  25. .main > * {
  26. position: absolute;
  27. }
  28. .left {
  29. left: 0px;
  30. }
  31. .right {
  32. right: 0px;
  33. }
  34. .content {
  35. min-width: 560px;
  36. min-height: 600px;
  37. background: paleturquoise;
  38. left: 200px;
  39. }
  40. </style>
  41. </head>
  42. <body>
  43. <!-- 头部 -->
  44. <div class="header"></div>
  45. <!-- 主体 -->
  46. <div class="main">
  47. <div class="left"></div>
  48. <div class="content"></div>
  49. <div class="right"></div>
  50. </div>
  51. <!-- 尾部 -->
  52. <div class="footer"></div>
  53. </body>

2. 浮动实现三列布局

  • 代码:
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .header,
  7. .footer {
  8. width: 960px;
  9. height: 50px;
  10. background: rgb(144, 238, 230);
  11. margin: 0 auto;
  12. }
  13. .main {
  14. height: 600px;
  15. width: 960px;
  16. margin: 10px auto;
  17. }
  18. .left,
  19. .right {
  20. min-width: 190px;
  21. min-height: 600px;
  22. background: rgb(255, 211, 181);
  23. }
  24. .main > * {
  25. float: left;
  26. }
  27. .left {
  28. }
  29. .right {
  30. }
  31. .content {
  32. min-width: 560px;
  33. min-height: 600px;
  34. background: rgb(238, 175, 235);
  35. margin: 0 10px;
  36. }
  37. </style>
  38. </head>
  39. <body>
  40. <!-- 头部 -->
  41. <div class="header"></div>
  42. <!-- 主体 -->
  43. <div class="main">
  44. <div class="left"></div>
  45. <div class="content"></div>
  46. <div class="right"></div>
  47. </div>
  48. <!-- 尾部 -->
  49. <div class="footer"></div>
  50. </body>

3. 用圣杯来完成一个通用三列布局,两端固定,中间自适应

  • 代码:
  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .header,
  7. .footer {
  8. width: 960px;
  9. height: 50px;
  10. background: rgb(144, 238, 230);
  11. margin: 0 auto;
  12. }
  13. .main {
  14. height: 600px;
  15. width: 960px;
  16. margin: 10px auto;
  17. }
  18. .left,
  19. .right {
  20. width: 190px;
  21. height: 600px;
  22. background: rgb(255, 211, 181);
  23. }
  24. .main > * {
  25. float: left;
  26. }
  27. .left {
  28. margin-left: -100%;
  29. }
  30. .right {
  31. margin-left: -190px;
  32. position: relative;
  33. top: 0;
  34. }
  35. .content {
  36. width: 100%;
  37. height: 600px;
  38. background: rgb(238, 175, 235);
  39. padding: 0 -200px;
  40. }
  41. </style>
  42. </head>
  43. <body>
  44. <!-- 头部 -->
  45. <div class="header"></div>
  46. <!-- 主体 -->
  47. <div class="main">
  48. <div class="content"></div>
  49. <div class="left"></div>
  50. <div class="right"></div>
  51. </div>
  52. <!-- 尾部 -->
  53. <div class="footer"></div>
  54. </body>

4.用grid网格布局

  • 代码:
  1. <style>
  2. body {
  3. display: grid;
  4. grid-template-columns: 200px 1fr 200px;
  5. grid-template-rows: 40px 500px 40px;
  6. }
  7. /* 轮廓线 */
  8. body > * {
  9. outline: 1px dashed rebeccapurple;
  10. }
  11. .header,
  12. .footer {
  13. grid-column-end: span 4;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <!-- 头部 -->
  19. <div class="header"></div>
  20. <!-- 主体 -->
  21. <div class="content"></div>
  22. <div class="left"></div>
  23. <div class="right"></div>
  24. <!-- 尾部 -->
  25. <div class="footer"></div>
  26. </body>

三、懒加载:滚动高级与偏移高级案例

  • 代码:
  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. img {
  9. height: 500px;
  10. display: block;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  16. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  17. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  18. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  19. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  20. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  21. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  22. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  23. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  24. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  25. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  26. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  27. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  28. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  29. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  30. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  31. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  32. <img src="jiazai1.jpg" alt="" data-src="j1.jpg" />
  33. </body>
  34. <script>
  35. //获取当前视口高度
  36. const html = document.documentElement.clientHeight;
  37. //触发滚动的事件
  38. document.addEventListener("scroll", showImg);
  39. window.addEventListener("load", showImg);
  40. //执行函数
  41. function showImg() {
  42. const imgs = document.querySelectorAll("img");
  43. //获取所有图片
  44. imgs.forEach(function (img) {
  45. //遍历所有图片
  46. let imgTop = img.offsetTop;
  47. //获取当前图片上边距的高度
  48. let scrTop = html + document.documentElement.scrollTop;
  49. //获取当前滚动条的高度(视口加上滚动条上边距)
  50. if (imgTop < scrTop) {
  51. //当前图片上边距的高度小于当前滚动条高度时显示图片
  52. img.src = img.dataset.src;
  53. }
  54. });
  55. }
  56. </script>
  57. </html>

四、学习总结

1. 浮动:

  1. float:left/right;左浮动右浮动
  2. 元素浮动之后,元素会让出原来的空间,后面的元素会占据原来的位置
  3. 浮动会让行元素默认变成块元素来处理
  4. 清除浮动有多种方法,但建议用伪元素::after{overflow:hidden;/overflow:auto;}

2. 布局

  1. 绝对定位布局
  2. 浮动布局
  3. 圣杯布局,两端固定,中间自适应
  4. grid布局(最强大的布局方式,推荐使用)

3.懒加载

  1. 懒加载:只刷新当前视口的内容,大大的优化了网页的访问速度
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议