likes
comments
collection
share

auto怎么用?有关盒子模型的水平布局

作者站长头像
站长
· 阅读数 64

盒子模型

  • CSS将页面中的所有元素都设置为了一个矩形的盒子,每一个盒子都由以下几个部分组成:
    • 内容区(content)
    • 内边距(padding)
    • 边框(border)
    • 外边距(margin)
    auto怎么用?有关盒子模型的水平布局
  1. 如上图所示,其中200x200的蓝色区域就是content(内容区),元素中的所有的子元素和文本内容都在内容区中排列
  2. 上图中的padding就是内边距,由于内边距是从内容区到边框的距离,所以内边距的设置会影响到盒子的大小。并且如果你给元素设置了背景颜色,这个背景颜色也会延伸到内边距上。
  3. 最外层的margin即为外边距,外边距不会影响盒子可见框的大小,但是外边距会影响盒子的位置,影响到盒子实际占用空间。默认情况下,如果我们设置的是左和上外边距,将会移动元素自身,而设置下和右外边距,会移动其他元素。如果是负值,元素会向相反的方向移动。

盒子模型的水平布局

  • 一个元素在其父元素中,水平布局必须要满足以下等式:margin-left + border-left + padding-left+ width+ padding-right + border-right + margin-right = 其父元素内容区的宽度

  • 以上等式必须满足,如果相加结果使等式不成立,则称为过度约束,调整情况如下:

    • 如果这七个值中没有为auto的情况,则浏览器会自动调整margin-right值以使等式满足
    • 如果某个值为auto,则会自动调整为auto的那个值以使等式成立(谁设置为auto就调整谁)
    • 如果同时将一个宽度和一个外边距设置为auto,则宽度会调整为最大,设置为auto的外边距会自动为0
    • 如果将三个值都设置为auto,则外边距都是0,宽度最大
    • 如果将两个外边距设置为auto,宽度固定值,则会将两个外边距设置为相同的值
  • 其中,这七个值中有三个值可以设置为auto:

    • width
    • margin-left
    • margin-right
  • 我们经常利用这个特点来使一个元素在其父元素中水平居中:margin:0 auto;

  • 下面用代码举例以上过渡约束的几种情况

    • 初始代码如下
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>盒子模型的水平布局</title>
    </head>
    <style>
        .outer {
            width: 800px;
            height: 200px;
            border: 5px skyblue solid;
        }
    
        .inner {
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>
    <body>
        <div class="outer">
            <div class="inner"></div>
        </div>
    </body>
    </html>
    
    • 情况一:初始代码不变,这七个值中没有为auto的情况,浏览器会自动调整margin-right值以使等式成立,即 0 + 0 + 0 + 200 + 0 + 0 + 600 = 800
    auto怎么用?有关盒子模型的水平布局
    • 情况二:如果某个值为auto
    .outer {
        width: 800px;
        height: 200px;
        border: 5px skyblue solid;
    }
    
    .inner {
        width: auto;    //宽度设置为auto
        height: 200px;
        background-color: pink;
        margin-right: 200px;    //给一个200px的右外边距
    }
    

    将宽度设置为auto,外边距设置固定的值,会自动调整为auto的那个值以使等式成立,如上图所示: 0 + 0 + 0 + auto + 0 + 0 + 200 = 800 , 则auto=600

    auto怎么用?有关盒子模型的水平布局
    .outer {
         width: 800px;
         height: 200px;
         border: 5px skyblue solid;
     }
    
     .inner {
         width: auto;   //仅仅把宽度设置为auto
         height: 200px;
         background-color: pink;
     }
    

    如果只把宽度设置为auto,就调整宽度以使等式成立,即 0 + 0 + 0 + auto + 0 + 0 + 0 = 800 ,也就是auto=800

    auto怎么用?有关盒子模型的水平布局

    • 情况三:同时将宽度和一个外边距设置为auto,或将三个值都设置为auto

    例一:

    .outer {
        width: 800px;
        height: 200px;
        border: 5px skyblue solid;
    }
    
    .inner {
        width: auto;   //宽度为auto
        height: 200px;
        background-color: pink;
        margin-left: auto;  //左外边距为auto
    }
    

    同时将宽度和一个外边距设置为auto,宽度调整为最大,设置为auto的外边距为0

    auto怎么用?有关盒子模型的水平布局

    例二:

    .outer {
        width: 800px;
        height: 200px;
        border: 5px skyblue solid;
    }
    
    .inner {
        width: auto;   //宽度为auto
        height: 200px;
        background-color: pink;
        margin-left: 100px;  //左外边距为100px
        margin-right: auto;  //右外边距为auto
    }
    

    auto怎么用?有关盒子模型的水平布局

    例三:将三个值都设置为auto,则外边距都是0,宽度最大

    .outer {
        width: 800px;
        height: 200px;
        border: 5px skyblue solid;
    }
    
    .inner {
        width: auto;            //auto
        height: 200px;
        background-color: pink;
        margin-left: auto;      //auto
        margin-right: auto;     //auto
    }
    

    auto怎么用?有关盒子模型的水平布局

    • 情况四:将两个外边距设置为auto,宽度固定值
    .outer {
        width: 800px;
        height: 200px;
        border: 5px skyblue solid;
    }
    
    .inner {
        width: 400px;      //宽度固定
        height: 200px;
        background-color: pink;
        margin: 0 auto;      //左右外边距都为auto
    }
    

    auto怎么用?有关盒子模型的水平布局

    可以看到,设置为auto的外边距的左右两边拥有了相同的值

    auto怎么用?有关盒子模型的水平布局

盒子模型的垂直布局

  • 子元素是在父元素的内容区中排列的,默认情况下,父元素的高度被内容撑开。如果子元素的大小超过了父元素,则子元素会从父元素中溢出。使用overflow属性来设置父元素如何处理溢出的子元素。可选值:
    • visible,默认值,子元素会从父元素中溢出,在父元素外部的位置显示
    • hidden,溢出的内容将会被裁剪,不会显示
    • scroll 生成两个滚动条,通过滚动条来查看完整的内容
    • auto 根据需要生成滚动条,不会生成多余的滚动条

行内元素的盒模型

  • 行内元素不支持设置宽度和高度。
  • 行内元素可以设置padding、border、margin。但是垂直方向的padding、border、margin不会影响页面的布局。
  • display:用来设置元素显示的类型,可选值:
    • inline 将元素设置为行内元素
    • block 将元素设置为块元素
    • inline-block 将元素设置为行内块元素,既可以设置宽度和高度,又不会独占一行
    • table 将元素设置为一个表格
    • none 元素不在页面中显示
  • visibility 用来设置元素的显示状态,可选值:
    • visible 默认值,元素在页面中正常显示
    • hidden 元素在页面中隐藏,不显示。但是依然占据页面的位置

盒子的尺寸问题

  • 默认情况下,盒子可见框的大小由内容区、内边距和边框共同决定。box-sizing 用来设置盒子尺寸的计算方式(设置width和height的作用),可选值:
    • content-box 默认值,宽度和高度用来设置内容区的大小
    • border-box 宽度和高度用来设置整个盒子可见框的大小

开启了绝对定位的元素的水平与垂直方向的布局

  • 当我们开启了绝对定位以后:水平方向的布局需要添加left和right两个值,此时规则和之前一样,只是多添加了两个值。当发生过度约束的时候:
    • 如果九个值中没有auto,则自动调整right值,以使等式满足
    • 如果有auto,则自动调整auto的值,以使等式满足
    • left和right的值默认是auto,所以如果不指定left和right,则等式不满足时,则自动调整这两个值。
  • 可以设置auto的值:margin-left margin-right width left right
  • 垂直方向的布局的等式也必须要满足: top + margin-top/bottom + padding-top/bottom + border-top/bottom + height = 包含块内容区的高度
转载自:https://juejin.cn/post/7306038092209111078
评论
请登录