整理笔记3:CSS布局重点(上)

242 阅读3分钟

CSS布局重点(上)

我是knockkey, 这是我坚持更新博客第2天. 这篇博客的目的是解决: 谁会觉得布局不重要吗? 这篇博客将介绍四个基本点:

  1. 盒模型宽度的计算
  2. margin纵向重叠问题
  3. margin负值问题
  4. BFC理解与应用

不懂这四个点, 后面我介绍双飞翼布局和圣杯布局的时候, 你将崩溃

1. 什么是盒模型?

盒模型用来指定标签如何显示以及元素间相互关系.这个盒子由内容(content)+内边距(padding)+边框(border)+外边界(margin)组成

2. 盒子的实际大小

盒子宽度 = 两个外边距+两个内边距+两个边框+内容宽度 boxsize=margin*2+padding*2+border*2+width 盒子高度 = 略

3. css中的一个属性 -> box-sizing

盒模型有两种:

  • W3C的标准盒子模型

相当于width指的是content内容的宽度

box-sizing:content-box
  • IE的盒子模型

相当于width指的是border+padding+content

box-sizing: border-box

4.margin的负值问题(同样, 会了这道题你就知道了, 自己动手试试! 必须理解)

对 margin 的 top left right bottom 设置负值, 有何效果?

  • margin-top 和 margin-left 负值, 元素向上, 向左移动, 会影响自身的值
  • margin-right负值, 右侧元素左移, 自身不受影响
  • margin-bottom负值, 下方元素上移, 自身不受影响

5. BFC理解

什么是BFC? (翻译,作用,相关代码)

  • Block format context, 块级格式化上下文
  • 一块独立渲染区域, 内部元素的渲染不会影响边界以外的元素

6. BFC的布局规则

  • 内部的Box会在垂直方向,一个接一个地放置。
  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
  • BFC的区域不会与float box重叠。
  • 计算BFC的高度时,浮动元素也参与计算。

6.1 margin纵向重叠问题, 理解这道题, 你就会了

如下代码, AAA 和 BBB 之间的距离是多少?

css代码

    p {
      font-size: 16px;
      line-height: 1;
      margin-top: 10px;
      margin-bottom: 15px;
    }

html代码

  <p>AAA</p>
  <p></p>
  <p></p>
  <p></p>
  <p>BBB</p>

现象:

  • 相邻元素的margin-topmargin-bottom会发生重叠
  • 空白内容的<p></p>也会重叠

正确答案:15

6.3 形成BFC的常见条件

  • flaot的值不是none
  • position是absolute或fixed(即不能是static或者relative)
  • overflow不是visible
  • display是 flex & inline-block & table-cell & inline-flex & table-caption

7. BFC常见应用

7.1 利用BFC避免margin重叠

改之前现象: p之间的垂直距离15px

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>防止margin重叠</title>
</head>
<style>
    *{
        margin: 0;
        padding: 0;
    }
    p {
        color: #f55;
        background: yellow;
        width: 200px;
        line-height: 100px;
        text-align:center;
        margin: 30px;
    }
</style>
<body>
    <p>看看我的 margin是多少</p>
    <p>看看我的 margin是多少</p>
    
</body>
</html>

改之后现象:p之间的垂直距离30px

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>防止margin重叠</title>
</head>
<style>
  * {
    margin: 0;
    padding: 0;
  }

  p {
    color: #f55;
    background: yellow;
    width: 200px;
    line-height: 100px;
    text-align: center;
    margin: 30px;
  }

  div {
    overflow: hidden;
  }
</style>

<body>
  <p>看看我的 margin是多少</p>
  <div>
    <p>看看我的 margin是多少</p>
  </div>
</body>

</html>

7.2 自适应两栏布局

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<style>
  * {
    margin: 0;
    padding: 0;
  }

  body {
    width: 100%;
    position: relative;
  }

  .left {
    width: 100px;
    height: 150px;
    float: left;
    background: rgb(139, 214, 78);
    text-align: center;
    line-height: 150px;
    font-size: 20px;
  }

  .right {
    /* 布局规则:BFC的区域不会与float box重叠 */
    overflow: hidden;
    height: 300px;
    background: rgb(170, 54, 236);
    text-align: center;
    line-height: 300px;
    font-size: 40px;
  }
</style>

<body>
  <!-- 每个盒子的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。 -->
  <div class="left">LEFT</div>
  <div class="right">RIGHT</div>
</body>

</html>

7.3 清楚浮动

  • 当我们不给父节点设置高度,子节点设置浮动的时候,会发生高度塌陷,这个时候我们就要清楚浮动。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>清除浮动</title>
</head>
<style>
    .par {
        border: 5px solid rgb(91, 243, 30);
        width: 300px;
        /* 布局规则: 计算BFC的高度时,浮动元素也参与计算 */
        overflow: hidden;
    }
    
    .child {
        border: 5px solid rgb(233, 250, 84);
        width:100px;
        height: 100px;
        float: left;
    }
</style>
<body>
    <div class="par">
        <div class="child"></div>
        <div class="child"></div>
    </div>
</body>
</html>

因为BFC内部的元素和外部的元素绝对不会互相影响,因此, 当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。同样的,当BFC内部有浮动时,为了不影响外部元素的布局,BFC计算高度时会包括浮动的高度。避免margin重叠也是这样的一个道理。