你不知道的margin:auto居中原理


通过对外边距的学习,前端攻城狮都会用margin:auto;或者margin: 0 auto;来对页面块级元素居中布局。本文会对其原理解释。

在通过学习盒子模型中,我们了解到块级元素盒子的中特性:

  1. 盒子的总宽度= width+左右内边距之和+左右边框宽度之和+左右外边距之和 即水平方向能影响块级元素布局的就是width、padding-left、padding-right、border-left、border-right、margin-left、margin-right属性。

  2. 只有margin-left、margin-right、width可以设置auto属性值。

  3. 在没设置浮动属性的块级元素的盒子总宽度就等于父级元素的宽度。

如果margin-left 和margin-right(padding-left和padding-right)中如果只设置了一个值,那么另一个值会

去自适应来补充到父元素的大小。

如果同时设置margin-left、margin-right(padding-left和padding-right)的值,那么浏览器中自动选择其

中影响最小的属性值为auto来适应父级元素的大小。由于浏览器的默认从左向右阅读的,所以最右侧的

空间也是影响最小的,所以 marigin-right 会被浏览器强制作为 auto 来看待。

例如,我在下面代码同时设置了两个div,一个只设置了margin-left为100px,另一个同时设置了margin-left

为100px和margin-right为200px。

<style>
  div
    {   
        height: 20px;
        width: 200px;
        padding: 10px;
        border: 5px solid pink;
    }
    .box1 {
        background-color: lightskyblue;
        margin-left: 100px;
    }
    .box2 {
        background-color: lightblue;
        margin-left: 100px;
        margin-right: 200px;
    }
</style>
<body>
    <div class="box1">box1</div>
    <div class="box2">box2</div>
</body>

效果完全一样。
在这里插入图片描述
理解到这些后,通过对上面margin-left、margin-right、width这三个属性可以设置auto属性值可能的组合

以及实现的效果来介绍。

auto值对布局的影响

当margin-left、margin-right、width其中margin-left、margin-right为特定值,width为auto

<style>
    .box1 {
        background-color: lightblue;
        height: 20px;
        border: 5px solid pink;
        padding: 10px;
        margin-left: 200px;
        margin-right: 200px;
        width: auto;
    }
</style>
<body>
    <div class="box1"></div>
</body>

效果为:
在这里插入图片描述
当margin-left、margin-right、width其中两个为特定值,一个为auto值的时候,浏览器会自动调整 auto

那个属性的值,以填充其父元素的 width。例如我最开始举的第一个例子,其中也是把margin-right自动

调整为auto,来适应父级body元素的宽度。

比如第二个例子中div的父级元素是body,通过检查能看到body宽度为764px。
在这里插入图片描述

我在刚才的例子中给div设置了border(5px)、 margin-right:(200px)、 margin-left(200px)、

padding(10px)。

故此,通过计算width =body(width)- border(border-right(5px) + border-left(5px)) - padding(

padding-right(10px)+ padding-left(10px)) - margin-right:(200px)- margin-left(200px)

=764px - 5px × 2 - 10px × 2 - 200px - 200px = 334px。所以div的width为334px。
在这里插入图片描述

当width 为特定值,margin-left 和 margin-right 为 auto

修改上面的代码

        .box1 {
            background-color: lightblue;
            height: 20px;
            border: 5px solid pink;
            padding: 10px;
            margin-left: auto;
            margin-right: auto;
            width: 200px;
        }

效果为
在这里插入图片描述

故此,安装刚才的计算2 × auto =body(width)- border(border-right(5px) + border-left(5px)) - padding

( padding-right(10px)+ padding-left(10px)) - width = 764px - 5px × 2 - 10px × 2 - 200px = 543px,

所以auto的值为543px ÷ 2 =267px。
在这里插入图片描述
当我们设置margin:auto;或者margin:0 auto时,浏览器就是这样的方式计算水平居中的。

margin-left 或 margin-right 任意一个为特定值,其余为 auto

仍然修改上面的代码

        .box1 {
            background-color: lightblue;
            height: 20px;
            border: 5px solid pink;
            padding: 10px;
            margin-left: 250px;
            margin-right: auto;
            width: auto;
        }

效果为: 在这里插入图片描述

  • 当margin-left 和 width 指定为 auto,marign-right 为特定值,那么 margin-left将被浏览器设置为

    0,width 将通过上面方式计算出;

  • 当margin-right 和 width 指定为 auto,marign-left 为特定值,那么 margin-right将被浏览器设置为

    0,width 将通过上面方式计算出。

三个属性均为 auto

修改上面代码:

        .box1 {
            background-color: lightblue;
            height: 20px;
            border: 5px solid pink;
            padding: 10px;
            margin-left: auto;
            margin-right: auto;
            width: auto;
        }

效果为:
在这里插入图片描述
当三个属性均为 auto时,margin-left 和 margin-right 的值将被浏览器设置为 0,width通过上面方式算出宽度。

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值