我们都知道使用margin:auto可以让元素水平居中的。但你有没有想过使用margin:auto可以让元素水平居中的原因,要回答这个问题,我们首先需要看一下margin:auto的工作原理。auto如果它适用于垂直居中,那么又是一种什么情况,下面我们来看具体内容。

首先auto是做什么的?

定义auto元素,因元素类型和上下文而异。在边距中,auto可以表示两种情况:占用可用空间或0 px。这两个将为元素定义不同的布局。

“自动”占用可用空间

这是我们利用auto最常见的用法。通过分配auto元素的左右边距,它们可以平等地占据元素容器中的可用水平空间 - 因此元素将居中。

1

2

3

<div id="outer">

<div id="inner"></div>

</div>

1

2

3

4

5

6

7

8

9

10

11

12

13

#inner {

  margin: auto;

  width: 250px;

  height: 125px;

  background-image: linear-gradient(45deg, #84ECEF 10%, #F8F62F 60%, #FDC018);

}

#outer {

  height: 500px;

  width: 500px;

  background: #1F1D20;

  background-image: linear-gradient(#757575 1px, transparent 1px), linear-gradient(90deg, #757575 1px, transparent 1px);

  background-size: 25px 25px;

}

效果如下:

但是,这只适用于水平边距,它不适用于浮动和内联元素,并且它本身也不能用于绝对和固定定位元素。

推荐手册:CSS在线手册

由于auto左右边距均匀地占据“可用”空间,当你auto只给出其中一个时,你认为会发生什么?

左边距或右边距auto将占据所有“可用”空间,使元素看起来像是向右或向左偏移。

1

2

3

<div id="outer">

<div id="inner"></div>

</div>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#inner {

  margin-right: auto;

  width: 250px;

  height: 125px;

  background-image: linear-gradient(45deg, #84ECEF 10%, #F8F62F 60%, #FDC018);

}

#outer {

  height: 500px;

  width: 500px;

  background: #1F1D20;

  background-image: linear-gradient(#757575 1px, transparent 1px), linear-gradient(90deg, #757575 1px, transparent 1px);

  background-size: 25px 25px;

}

效果如下:

“auto”为0px

如前所述,auto在浮动,内联和绝对元素中不起作用。所有这些元素已经决定了它们的布局,所以没有auto用于边距并期望它像这样集中。

这将破坏使用类似float的最初目的。因此设置这些元素的auto值为0px。

auto如果它没有宽度,也不会对典型的块元素起作用。到目前为止我向你展示的所有例子都有宽度。

值的宽度auto将具有0px边距。块元素的宽度通常覆盖其整个容器,它是auto或100%,因此margin:auto将被设置为0px。

auto设置垂直会是怎样的呢?

auto在顶部和底部边距中总是计算为0px(绝对元素除外)。W3C规范说它是这样的:

“如果”margin-top“或”margin-bottom“为”auto“,则其使用值为0”

到目前为止,为什么这没有说。这可能是因为典型的垂直页面流,页面大小在高度方面增加。因此,相对于页面本身而言,将元素垂直居中于其容器中不会使其显示为居中,这与水平完成(在大多数情况下)不同。

也许是因为同样的原因,他们决定为绝对元素添加一个例外,它可以在整个页面的高度垂直居中。

这也可能是由于边缘坍塌效应(相邻元素“边缘”的崩溃),这是垂直边距的另一个例外。

然而,后者似乎是一个不太可能的情况 - 因为不会折叠其边距的元素 - 如Floats和overflow其他元素visible,仍然为其分配0px垂直边距auto。

以绝对定位元素为中心

由于绝对定位元素恰好存在异常,我们将使用auto值垂直和水平居中。但在此之前,我们需要找出margin:auto实际工作的时间,就像我们希望它在绝对定位的元素中一样。

这是另一个W3C规范的用武之地:

“如果”left“,”width“和”right“中的所有三个都是”auto“:首先将”margin-left“和”margin-right“的任何”auto“值设置为0 ... ”

“如果三者中没有一个是”自动“:如果”margin-left“和”margin-right“都是”auto“,则在额外约束条件下解决方程式,即两个边距得到相等的值”

这几乎说,对水平auto的利润率,抓住间隔相等,则对值left,width并且right不应该auto,他们的默认值。因此,我们所要做的就是在绝对定位的元素中赋予它们一些价值。left并且right应该具有相同的值以实现完美的居中。

该规范还提到了垂直边距类似的东西。

“如果”top“,”height“和”bottom“中的所有三个都是auto,则将”top“设置为静态位置...”

“如果三者中没有一个是”自动“:如果”margin-top“和”margin-bottom“都是”auto“,则在额外约束下解决方程式,即两个边距得到相等的值......”

因此,对于一个绝对元件被垂直居中,其top,height和bottom值不应该auto。

现在结合所有这些,这是我们将得到的:

1

2

3

<div id="outer">

<div id="inner"></div>

</div>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

HTML

 

CSS

Result

EDIT ON#inner {

  margin: auto;

  position: absolute;

  left: 0px;

  right: 0px;

  bottom: 0px;

  top: 0px;

  width: 250px;

  height: 125px;

  background-image: linear-gradient(45deg, #84ECEF 10%, #F8F62F 60%, #FDC018);

}

#outer {

  position: relative;

  height: 500px;

  width: 500px;

  background: #1F1D20;

  background-image: linear-gradient(#757575 1px, transparent 1px), linear-gradient(90deg, #757575 1px, transparent 1px);

  background-size: 25px 25px;

}

效果如下:

最后

如果您想要将页面上的元素向右或向左偏移而没有包含它的其他元素(就像浮点数一样),请记住有auto用于边距的选项。

将元素转换为绝对定位只是为了使它可以垂直居中可能不是一个好主意。还有其他选项,如flexbox和CSS变换,更适合那些。

转载自:https://www.php.cn/css-tutorial-412560.html

 

CSS中margin:auto什么意思?margin:auto属性的用法详解的更多相关文章

  1. 教程-Delphi中Spcomm使用属性及用法详解

    Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...

  2. 关于CSS的table-layout属性的用法详解

    前言: 今天来和大家详细说一下table-layout属性的用法. /*eg:设置表格布局算法*/ table{ table-layout:fixed; } ***本文关键词:table-layout ...

  3. css3中font-face属性的用法详解

    @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有许 ...

  4. moviepy音视频剪辑:moviepy中的剪辑基类Clip的属性和方法详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...

  5. java中的Static、final、Static final各种用法详解

    前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...

  6. 1:CSS中一些@规则的用法小结 2: @media用法详解

    第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下     at-rule ...

  7. 盘点CSS中可以和不可以继承的属性

    CSS中可以和不可以继承的属性   一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定 ...

  8. CSS中伪类及伪元素用法详解

    CSS中伪类及伪元素用法详解   伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...

  9. SVN组成中trunk,branches and tags功能用法详解

    SVN组成中trunk,branches and tags功能用法详解  我相信初学开发在SVN作为版本管理时,都估计没可能考虑到如何灵活的运用SVN来管理开发代码的版本,下面我就摘录一篇文章来简单说 ...

随机推荐

  1. LeetCode 025 Reverse Nodes in k-Group

    题目描述:Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time an ...

  2. 将 python3 添加到环境变量(ubuntu)

    将 python3 添加到环境变量 echo alias python = python3 >> ~/.bashrc 更新环境变量 source ~/.bashrc

  3. vue绑定用户页面

    1.vue微博回调空页面 微博回调空页面为: http://127.0.0.1:8888/oauth/callback/ 1.1 页面路径 components\oauth.vue <templ ...

  4. PP-OCR论文翻译

    译者注: 我有逛豆瓣社区的习惯,因此不经意间会看到一些外文翻译成中文书的评价."书是好书,翻译太臭"."中文版别看"."有能力尽量看原版". ...

  5. (七)if/else就是goto

    一.CPU如何执行指令 CPU上有数以亿计的晶体管组层的复杂电路,我们先不用管具体电路如何实现:逻辑上我们可以认为CPU由许多寄存器组成,而这些寄存器又由许多锁存器和触发器组成,N个锁存器或触发器就可 ...

  6. python核心高级学习总结1---------*args和**kwargs

    *args 和 ** kwargs 的用法 首先,这两者在用法上都是用来补充python中对不定参数的接受. 比如下面的列子 def wrappedfunc(*args, **kwargs): pri ...

  7. tcp socket学习

    更新一波学的socket编程,socket还是比较重要的,探测端口,连接服务底层都是socket编程.tcp有server 和 client.client和udp发送差不多. server端是建立了两 ...

  8. iOS崩溃日志 如何看

    日志主要分为六个部分:进程信息.基本信息.异常信息.线程回溯.线程状态和二进制映像. 我们在进行iPhone应用测试时必然会在"隐私"中找到不少应用的崩溃日志,但是不会阅读对于很多 ...

  9. leetcode计划

    5.17 星期日,应完成的下周leetcode题目:279,300,1143,72,(前4个动态规划),104,110,543(后三个关于树)(https://cyc2018.github.io/CS ...

  10. 你知道Python基本数据类型是哪6个么

    Python 是强类型语言,在学习 Python 时,有必要了解 Python 有哪些基本数据类型,一共 6 个:Number(数字).String(字符串).List(列表).Tuple(元组).S ...