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

盒子模型

  • CSS将页面中的所有元素都设置为了一个矩形的盒子,每一个盒子都由以下几个部分组成:

    • 内容区(content)
    • 内边距(padding)
    • 边框(border)
    • 外边距(margin)
  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;

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

    • 初始代码如下
    html 复制代码
    <!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
    html 复制代码
    .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

    html 复制代码
    .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

    例一:

    html 复制代码
    .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

    例二:

    html 复制代码
    .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,则外边距都是0,宽度最大

    html 复制代码
    .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,宽度固定值
    html 复制代码
    .outer {
        width: 800px;
        height: 200px;
        border: 5px skyblue solid;
    }
    
    .inner {
        width: 400px;      //宽度固定
        height: 200px;
        background-color: pink;
        margin: 0 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 = 包含块内容区的高度
相关推荐
Pedantic1 小时前
SwiftUI 手势层级(Gesture Hierarchy)详解
前端
飘尘1 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
一颗烂土豆1 小时前
Meshopt 压缩深度解析,为什么它比 Draco 更快
前端·javascript·webgl
浏览器工程师2 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
雨季mo浅忆2 小时前
VSCode自动格式化三要素
前端
爱勇宝3 小时前
深扒 Anthropic 1680 位工程师简历:应届生几乎没机会,AI 公司最缺的不是博士
前端·后端·程序员
kyriewen4 小时前
同事每天催我 Code Review,我写了个脚本让 AI 替我 review PR——现在他反过来催 AI 了
前端·javascript·ai编程
user20585561518136 小时前
Windows 项目安装时报 `node-sass` 错误,如何快速处理
前端
LiaCode6 小时前
Redis 在生产项目的使用
前端·后端