我们都知道使用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. wirshark找不到本地接口

    解决方法: 1.以管理员权限运行wireshark 2.以管理员身份运行cmd,输入net start npf,打开网络抓包服务,运行wireshark legacy,选择要抓包的网卡

  2. 开源脉冲神经网络深度学习框架——惊蛰(SpikingJelly)

    开源脉冲神经网络深度学习框架--惊蛰(SpikingJelly) 背景 近年来神经形态计算芯片发展迅速,大量高校企业团队跟进,这样的芯片运行SNN的能效比与速度都超越了传统的通用计算设备.相应的,神经 ...

  3. sql bool盲注

    [CISCN2019 总决赛 Day2 Web1]Easyweb 考察: robots.txt image.php?bak文件泄露,image.php.bak可以下载别的不大行 盲注 php日志挂马 ...

  4. 【面试】关于get和post两种方法的不同。

    最近在面试题和笔试题中经常会看到这道题,所以打算系统的整理一下. 一般标准的答案是这样的. GET在浏览器回退时是无害的,而POST会再次提交请求(浏览器应该告知用户数据会被重新提交). GET产生的 ...

  5. Java基础学习之面向对象(4)

    目录 1.面向对象概述 1.1.类与对象的关系 1.2.类的具体描述 2.面向对象的三大特性 2.1.继承 2.2.多态 2.3.封装 1.面向对象概述 1.1.类与对象的关系 有对象吗,没有的话我给 ...

  6. go中位运算

    左移右移 const ( // 将 1 左移 100 位来创建一个非常大的数字 // 即这个数的二进制是 1 后面跟着 100 个 0 Big = 1 << 100 // 再往右移 99 ...

  7. 基于gin的golang web开发:服务间调用

    微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...

  8. 从输入 URL 到页面展示,这中间发生了什么?

    当面试官问到,请你说说看"从输入 URL 到页面展示,这中间发生了什么?" 以前的我是这样回答的: 用户输入URL后,向服务器端发起请求.如果顺利,得到网络响应之后,浏览器对资源进 ...

  9. MariaDB的安装及相关配置

    MariaDB的安装及相关配置 安装 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB systemctl start mar ...

  10. 使用git客户端免密码进行拉取等相关操作

    前言 如果使用git客户端进行pull或push操作时,遇到有权限的项目总要输入用户名密码,真的是太麻烦了,因此需要稍作修改,然后就可以免密码操作啦! 方法: 进入C盘->用户->你的主机 ...