• 作者:老汪软件技巧
  • 发表时间:2024-12-27 15:06
  • 浏览量:

前言

今天是星期四,一提到星期四就有不少掘友想到KFC疯狂星期四,要去吃肯德基了,所以有没有人能V我50,我也要去吃肯德基。偷偷说一句,虽然肯德基涨了2%,但你只需要V我50就可以了,剩下那1块钱我自己掏。

OIP.jpg

好了,不扯淡了,作为一个搞前端的牛马,我们不应该只知道KFC,还应该了解BFC,FFC,GFC和IFC,如果我讲的这几个你都熟练掌握了的话,不妨奖励自己吃一顿KFC!

BFC 块级格式化上下文什么是BFC?

BFC(Block Formatting Context)是一个独立的渲染区域,其中的元素布局遵循一套特定的规则,并且不会与外部元素发生重叠或相互影响。一个HTML元素可以创建一个新的BFC,这样它的内部布局就可以独立于父元素和兄弟元素进行计算。

触发BFC的方式

以下是几种触发BFC的方法:

根元素 浮动元素 (float 不为 none)绝对定位或固定定位的元素 (position: absolute 或 fixed)行内块元素 (display: inline-block)表格单元格 (display: table-cell) 和表格标题 (table-caption)设置 overflow 为非 visible 的值使用 display: flow-root弹性盒子 (flex item) 和网格布局项 (grid item)应用场景与示例清除浮动

CSS布局中,浮动(float)是一种常见的布局技术,它允许元素脱离正常的文档流,并向左或右移动,直到它的外边缘碰到包含块或另一个浮动框的边框为止。然而,浮动元素可能会导致父容器的高度塌陷,即父容器的高度没有正确地包含浮动子元素的高度。我们可以通过创建新的BFC来解决这个问题。

<style>
  .one {
    float: left;
    width:180px;
    height: 180px;
    background-color:pink;
    }
    .two{
      width:300px;
      height:300px;
      background-color:coral;
    }
  style>
  <body>
      <div class="box">
          <div class="one">snjtgdiv>
          <div class="two">少年姜太公div>
      div>
  body>

image.png

在这里我们可以看到第二个盒子被覆盖掉了一部分,我们可以通过触发后面这个盒子形成BFC,从而来清除浮动元素造成的覆盖。

<style>
  .one {
    float: left;
    width:180px;
    height: 180px;
    background-color:pink;
    }
    .two{
      width:300px;
      height:300px;
      background-color:coral;
      overflow: hidden;
    }
  style>
  <body>
      <div class="box">
          <div class="one">snjtgdiv>
          <div class="two">少年姜太公div>
      div>
  body>
  

image.png

在这里,.two类通过设置overflow: hidden创建了一个新的BFC,从而包裹了所有浮动的子元素。

避免外边距折叠

在同一BFC内的相邻块级元素之间,垂直方向上的外边距会发生折叠。我们可以使用overflow属性创建新的BFC来避免这种情况。

<style>
  .box{
    width:180px;
    height:180px;
    background-color:pink;
    margin: 60px auto;
  }
style>
<body>
    <div class="box">snjtgdiv>
    <div class="box">少年姜太公div>
body>

按照惯性思维,我们会觉得这两个盒子之间的间隔一共是120px,但事实并非如此,他们之间的间距会是60px。请看下图:

image.png

其实在这种情况下的margin边距会是两者的最大值,而不是二者相加,我们可以使用BFC来解决这种外边距折叠的问题。请看代码:

<style>
  .box {
    width: 180px;
    height: 180px;
    background-color: pink;
    margin: 60px auto;
  }
  .total_box{
    overflow: hidden;;
  }
style>
<body>
  <div class="total_box">
    <div class="box">snjtgdiv>
  div>
  <div class="box">少年姜太公div>
body>

image.png

这里,.total_box创建了一个新的BFC,使得两个.box元素之间的外边距不再折叠,而是各自保持60px的距离。

解决高度塌陷

利用弹性布局(Flexbox)或网格布局(Grid),我们可以轻松创建响应式设计。这些布局模式会自动创建新的BFC,因此它们非常适合用来构建复杂的布局结构。

<style>
  .box{
    float:left;
    width:180px;
    height:180px;
    background-color:pink;
    margin: 60px;
  }
  .out_box{
    background:lightblue;
  }
style>
<body>
    <div class="out_box">
        <div class="box">snjtgdiv>
        <div class="box">少年姜太公div>
    div>
body>

image.png

在这张图片里我们可以看到它的外层容器的高度为0,导致背景颜色没有显示出来,我们同样可以用BFC来解决这个问题,请看下面代码:

<style>
  .box{
    float:left;
    width:180px;
    height:180px;
    background-color:pink;
    margin: 60px;
  }
  .out_box{
    display: inline-block;
    background:lightblue;
  }
style>
<body>
    <div class="out_box">
        <div class="box">snjtgdiv>
        <div class="box">少年姜太公div>
    div>
body>

image.png

知道应该离开可是我就是心太软__知道应该怎么办

FFC 弹性格式化上下文什么是FFC

FFC(Flex Formatting Context是弹性格式化上下文由使用了display: flex或inline-flex属性的容器触发。在这种上下文中,子元素被称为弹性项目(flex items),它们会根据可用空间和设置的弹性属性来调整大小和顺序。

触发FFC的方式

当display的值为flex或inline-flex时,将生成弹性容器(Flex Containers), 一个弹性容器为其内容建立了一个新的弹性格式化上下文环境(FFC)

代码示例

<style>
  .out_box {
    display:flex;
    width:100%;
  } 
  .one {
    float: left;
    width:180px;
    height: 300px;
    background-color:pink;
  }
  .two{
    flex: 1;
    height:400px;
    background-color:orange;
    overflow: hidden;
   }
  style>
  <body>
      <div class="out_box">
          <div class="one">snjtgdiv>
          <div class="two">少年姜太公div>
      div>
  body>

image.png

在这里第二个盒子会随着页面的拖动而自行变化

GFC 网格布局式上下文什么是GFC

GFC (Grid Formatting Context)是网格格式化上下文,由设置了display: grid或inline-grid的容器触发。在这个上下文中,子元素按照显式或隐式的网格轨道进行布局。

特性触发GFC的方式

当为一个元素设置display值为grid或者inline-grid 的时候,此元素将会获得一个独立的渲染区域

应用场景与代码

在这里笔者将展示一下如何模仿传统的网页布局(由头部、导航栏、侧边栏、内容区和页脚组成)

<style>
  .grid-container {
    display: grid;
    grid-template-areas:
      "header header"
      "nav main"
      "nav sidebar"
      "footer footer";
    grid-template-columns: 200px 1fr;
    grid-template-rows: auto 1fr auto;
    gap: 10px;
    padding: 10px;
  }
  .header {
    grid-area: header;
    background-color: #d3d3d3;
    padding: 20px;
    text-align: center;
  }
  .nav {
    grid-area: nav;
    background-color: #f4f4f4;
    padding: 20px;
  }
  .main {
    grid-area: main;
    background-color: #fff;
    padding: 20px;
  }
  .sidebar {
    grid-area: sidebar;
    background-color: #e9e9ff;
    padding: 20px;
  }
  .footer {
    grid-area: footer;
    background-color: #d3d3d3;
    padding: 20px;
    text-align: center;
  }
style>
head>
<body>
  <div class="grid-container">
    <div class="header">Headerdiv>
    <div class="nav">Navigationdiv>
    <div class="main">Main Content Areadiv>
    <div class="sidebar">Sidebardiv>
    <div class="footer">Footerdiv>
  div>
body>

image.png

这个布局如果用其他方法如相对/绝对定位,或是flex来实现的话,复杂度将会提高好几个等级。

IFC 行内格式化上下文什么是IFC

IFC (Inline Formatting Context)是行内格式化上下文,它决定了行内元素如何被排列和渲染。在一个IFC中,盒模型中的元素根据行内流进行布局,一行内的内容会尽可能地紧密排列在一起,直到没有更多空间为止,然后换到下一行继续。

主要特性触发IFC的方式代码示例

<style>
  .container {
    border: 1px solid black;
    padding: 10px;
    background-color: #f9f9f9;
  }
  .inline-element {
    background-color: lightblue;
    padding: 5px 10px;
    margin: 5px;
    border: 1px solid #ccc;
  }
style>
head>
<body>
<div class="container">
  <span class="inline-element">Item 1span>
  <span class="inline-element">Item 2span>
  <span class="inline-element">Item 3span>
div>
body>

在这个简短的例子中,所有的元素都在同一个.container内形成了一个IFC,并在同一行内水平排列。当一行的空间不足以容纳下一个元素时,它们会自动换到下一行继续排列。

image.png

image.png

从上面这段代码可以看出IFC非常适合用于文本内容中嵌入链接或其他小型组件的情况。

小结

本文介绍了前端开发中常见的几种格式化上下文:BFC、FFC、GFC和IFC。BFC通过创建独立的渲染区域解决浮动和外边距折叠问题;FFC利用弹性布局自动调整子元素大小和顺序;GFC提供二维网格布局,支持复杂页面结构;IFC则确保行内元素合理排列,适用于文本中的嵌入组件。掌握这些上下文有助于开发者更好地控制页面布局,避免常见布局问题,提高代码的可维护性和响应性。希望能对你有些许帮助

c224676594aae6804009e3fe521b122.jpg


上一条查看详情 +智保未来:国泰产险的 AI 网关革新之旅
下一条 查看详情 +没有了