博客列表 >浮动和BFC

浮动和BFC

杨向贤
杨向贤原创
2020年10月28日 17:40:00753浏览

浮动

理解浮动

浮动能将一个元素拉到容器的一侧,这样文档流就能包围它
浮动元素可以跨容器显示
元素浮动后自动转为块级元素


容器折叠和清除浮动

容器折叠

子元素浮动时,容器出现折叠,这是因为浮动元素同于普通文档流的元素,他们的高度不会加到父元素上

一个容器内的浮动元素会扩展到另一个容器,这样两个容器的文字就能围绕浮动元素排列(虚线高亮的部分是容器),在主元素中,出了页面标题,其他元素都设置了浮动,所以容器的高度只包含页面标题的高度,浮动的媒体元素则扩展到主元素的白色背景下。

清除浮动

一种是容器向下扩展,一种是伪元素清除浮动

容器向下扩展,包围了浮动元素,将一个元素放在主容器的末尾,并对它使用clear,这会让容器扩展到浮动元素下面,clear:both;声明让这个元素移动到浮动元素的下面,不是侧面,clear的值是可以设置的

伪元素,不用额外的div标签,使用::after伪元素选择器,最常见的伪元素是::before和::after,用来向元素的开始或结束位置插入内容

清除浮动元素和外边距
display:table,在清除浮动时使用display:table能够包含外边距。

  1. ::before,::after{
  2. /* 防止伪元素的外边距折叠 */
  3. display: table;
  4. content: " ";
  5. }
  6. ::after{
  7. clear: both;
  8. }

BFC

BFC简称块级格式化上下文,BFC是网页的一块区域,元素基于这块区域布局。BFC是环绕文档流的一部分,但它将内部的内容与外部的上下文隔离开,这种格隔离为创建BFC的元素做了三件事情:

  1. 包含内部所有元素的上下外边距,不会跟BFC外面的元素产生外边距折叠。
  2. 包含了内部所有的浮动元素。
  3. 不会跟BFC外面的浮动元素重叠。
    总之,BFC里面的内容不会跟外部的元素重叠或者互相影响。如果给元素增加clear属性,它只会清除自身所在的BFC内的浮动,如果强制给一个元素生产一个新的BFC,它不会跟其他BFC重叠。
    给元素添加一下任意属性值都会创建BFC。
  • float: left或right,不为none即可。
  • overflow: hidden、auto或scroll,不为visible即可。
  • display: inline-block、table-cell、table-caption、flex、inline-flex、grid或inline-grid,拥有这些属性的元素叫块级容器。
  • position: absolute或position: fixed。
    网页的根元素也创建了一个顶级的BFC。

浮动和BFC实例

  1. <body>
  2. <div class="container">
  3. <header>
  4. <h1>跑步俱乐部</h1>
  5. </header>
  6. <!-- -->
  7. <main class="main clearfix">
  8. <div>
  9. <h2>跑步技巧</h2>
  10. <div class="media">
  11. <img class="media-image" src="shoes.png" alt="" />
  12. <div class="media-body">
  13. <h4>强度</h4>
  14. <p>
  15. 力量训练是一个重要的组成部分。 预防受伤。关注你的核心&mdash;
  16. 特别是你的腹肌和臀部
  17. </p>
  18. </div>
  19. </div>
  20. <div class="media">
  21. <img class="media-image" src="runner.png" alt="" />
  22. <div class="media-body">
  23. <h4>加速</h4>
  24. <p>检查你的步幅周转率。最有效的 跑步者每分钟走180步左右。</p>
  25. </div>
  26. </div>
  27. <div class="media">
  28. <img class="media-image" src="shoes.png" alt="" />
  29. <div class="media-body">
  30. <h4>步伐</h4>
  31. <p>不要每次打的时候都跑一样的。 改变你的步伐,改变你的距离。</p>
  32. </div>
  33. </div>
  34. <div class="media">
  35. <img class="media-image" src="runner.png" alt="" />
  36. <div class="media-body">
  37. <h4>形态</h4>
  38. <p>跑得很高但很放松。</p>
  39. </div>
  40. </div>
  41. </div>
  42. </main>
  43. </div>
  44. </body>
  1. /* 全局设置为 border-box */
  2. :root {
  3. box-sizing: border-box;
  4. }
  5. *,
  6. ::before,
  7. ::after {
  8. box-sizing: inherit;
  9. }
  10. body {
  11. background-color: #eee;
  12. }
  13. /* 设置头部颜色和内边距 */
  14. header {
  15. padding: 1em 1.5em;
  16. color: #ffffff;
  17. background-color: #0072b0;
  18. border-radius: 0.5em;
  19. margin-bottom: 1.5em;
  20. }
  21. /* 主体的颜色和内边距 */
  22. .main {
  23. padding: 0 1.5em;
  24. background-color: #fff;
  25. border-radius: 0.5em;
  26. }
  27. /* 设置容器的宽度和外边距 */
  28. .container {
  29. max-width: 1080px;
  30. margin: 0 auto;
  31. }
  32. /*
  33. 让四个盒子浮动到左侧,并设置宽度和内边距
  34. 子元素浮动的时候,容器会出现折叠
  35. */
  36. .media {
  37. float: left;
  38. /* 给每个media盒子加上右侧和底部的外边距 */
  39. margin: 0 1.5em 1.5em 0;
  40. /* 一行放不下两个元素,所以要从宽度中减去外边距,防止出现不必要的换行 */
  41. width: calc(50% - 1.5em);
  42. padding: 1.5em;
  43. background-color: #eee;
  44. border-radius: 0.5em;
  45. }
  46. /* 给图片添加一个外边距,让它与正文中间出现间隔 */
  47. .media-image {
  48. float: left;
  49. margin-right: 1.5em;
  50. }
  51. /* 创建一个BFC,这样正文就不会跟着浮动的图片重叠 */
  52. .media-body {
  53. overflow: auto;
  54. margin-top: 0;
  55. }
  56. .media-body h4{
  57. margin-top: 0;
  58. }
  59. /*
  60. 选中容器末尾的伪元素 , 不用使用额外的标签
  61. 让 ::before和 ::after伪元素都显示出来
  62. */
  63. .clearfix::before,
  64. .clearfix::after {
  65. /*
  66. 防止伪元素的外边距折叠
  67. */
  68. display: table;
  69. content: " ";
  70. }
  71. .clearfix::after {
  72. /* 清除::after伪元素的浮动 */
  73. clear: both;
  74. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议