auto怎么用?有关盒子模型的水平布局
盒子模型
- CSS将页面中的所有元素都设置为了一个矩形的盒子,每一个盒子都由以下几个部分组成:
- 内容区(content)
- 内边距(padding)
- 边框(border)
- 外边距(margin)
- 如上图所示,其中200x200的蓝色区域就是content(内容区),元素中的所有的子元素和文本内容都在内容区中排列
- 上图中的padding就是内边距,由于内边距是从内容区到边框的距离,所以内边距的设置会影响到盒子的大小。并且如果你给元素设置了背景颜色,这个背景颜色也会延伸到内边距上。
- 最外层的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
.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
.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
例一:
.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
例二:
.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,宽度最大
.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,宽度固定值
.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 = 包含块内容区的高度
转载自:https://juejin.cn/post/7306038092209111078