垂直对齐属性如何工作?

2023-11-26

我不明白什么时候vertical-align会和不会工作。

每次我遇到一个用例vertical-align至于它是否真的有效,这似乎是一个抛硬币的问题。我知道它必须应用于内联元素。我读到我必须指定一个line-height对于通常没有的元素。我读过height属性必须具有静态(非自动/非%)值。我读到一些(现代)浏览器无法处理vertical-align如果使用它们的元素本身不是内联元素,则正确。我不清楚是否vertical-align应该位于包含元素上(例如text-align) 或我想要垂直对齐的元素。

我已经创建了这个jsfiddle试图解决问题,但仍然感到困惑。

#outer {
  box-sizing: border-box;
  border: red 1px solid;
  height: 200px;
  width: 400px;
  text-align: center;
}

#inner {
  border: blue 1px solid;
  display: inline-block;
  height: 200px;
  vertical-align: middle;
}
    
#header {
  border: green 1px solid;
  display: inline-block;
  line-height: 1em;
  margin: 0;
}
<div id="outer">
  <div id="inner">
    <h1 id="header">
      Some Text
    </h1>
  </div>
</div>

在上面的 jsfiddle 中我期望#header位于顶部和底部之间的中间位置#outer and #inner。显然,事实并非如此。


理解为什么它不起作用的最简单方法是添加多行文本,因为垂直对齐将在相应的行(行框)上对齐,而不是像您想象的那样在整个容器上对齐。

因此,如果我们添加更多文本,就会得到以下内容。

#outer {
  box-sizing: border-box;
  border: red 1px solid;
  height: 200px;
  text-align: center;
}

#inner {
  border: blue 1px solid;
  height: 200px;
  width:180px;
  display: inline-block;
  overflow:hidden;
}

.header {
  display: inline;
  border: green 1px solid;
  margin: 0;
}
<div id="outer">
  <div id="inner">
    <h1 class="header">
      Some Text Some Text Some Text
    </h1>
  </div>
  <div id="inner">
    <h1 class="header" style="vertical-align:middle;">
      Some Text Some Text Some Text
    </h1>
  </div>
  <div id="inner">
    <h1 class="header" style="vertical-align:top;">
      Some Text Some Text Some Text
    </h1>
  </div>
</div>

基本上不需要对齐,所有对齐方式几乎都是等效的,因为文本定义了行框,因此它的高度等于行框的高度,并且没有对齐的空间。

现在让我们增加行的高度(使用行高)

#outer {
  box-sizing: border-box;
  border: red 1px solid;
  height: 200px;
  text-align: center;
}

#inner {
  border: blue 1px solid;
  height: 200px;
  width:180px;
  line-height:200px;
  display: inline-block;
}

.header {
  display: inline;
  border: green 1px solid;
  margin: 0;
  line-height:1em;
}
<div id="outer">
  <div id="inner">
    <h1 class="header">
      Some Text Some Text Some Text
    </h1>
  </div>
  <div id="inner">
    <h1 class="header" style="vertical-align:middle;">
      Some Text Some Text Some Text
    </h1>
  </div>
  <div id="inner">
    <h1 class="header" style="vertical-align:top;">
      Some Text Some Text Some Text
    </h1>
  </div>
</div>

看看现在每行变得更大,每个文本在其各自的行上对齐,高度为200px我们可以清楚地看到对齐方式有何不同。

在这种情况下,文本有足够的空间可以按照您想要的方式对齐,如果我们只保留一行文本,我们就会看到神奇的效果:

#outer {
  box-sizing: border-box;
  border: red 1px solid;
  height: 200px;
  text-align: center;
}

#inner {
  border: blue 1px solid;
  height: 200px;
  line-height: 200px;
  display: inline-block;
}

.header {
  display: inline;
  border: green 1px solid;
  margin: 0;
  line-height:1em;
}
<div id="outer">
  <div id="inner">
    <h1 class="header">
      Some Text
    </h1>
    <h1 class="header" style="vertical-align:middle">
      Some Text
    </h1>
    <h1 class="header" style="vertical-align:top">
      Some Text
    </h1>
    <h1 class="header" style="vertical-align:bottom">
      Some Text
    </h1>
  </div>
</div>

您还可以注意如何middle and baseline非常接近,因为:

Aligns the middle of the element with the baseline plus half the x-height of the parentref

只有一半x-height的差异。

另一个需要注意的重要事实是,如果我们不为内联元素设置行高,则该元素将继承其父元素的行高和对齐方式,例如top不会有任何影响。

#outer {
  box-sizing: border-box;
  border: red 1px solid;
  height: 200px;
  text-align: center;
}

#inner {
  border: blue 1px solid;
  height: 200px;
  line-height: 200px;
  display: inline-block;
}

.header {
  display: inline;
  border: green 1px solid;
  margin: 0;
}
<div id="outer">
  <div id="inner">
    <h1 class="header">
      Some Text
    </h1>
    <h1 class="header" style="vertical-align:middle">
      Some Text
    </h1>
    <h1 class="header" style="vertical-align:top">
      Some Text
    </h1>
  </div>
</div>

将元素及其后代元素的顶部与整行的顶部对齐。

具有相同的行高意味着该元素已经位于行框的顶部和底部,因此两者top bottom其行为类似于基线(默认值)。


行框的高度也可以通过元素的高度来控制。您可能为一个元素设置较大的字体大小,这将使行的高度更大,并且有足够的空间在同一行框中对齐其旁边的小文本:

#outer {
  box-sizing: border-box;
  border: red 1px solid;
  height: 200px;
  text-align: center;
}

#inner {
  border: blue 1px solid;
  height: 200px;
  display: inline-block;
}

.header {
  display: inline;
  border: green 1px solid;
  margin: 0;
}
@keyframes change {
  from {font-size:20px;}
  to {font-size:100px;}
}
<div id="outer">
  <div id="inner">
    <h1 class="header">
      Text
    </h1>
    <h1 class="header" style="font-size:100px;animation:change 5s linear alternate infinite">
      T
    </h1>
    <h1 class="header" style="vertical-align:middle;">
      Text
    </h1>
    <h1 class="header" style="vertical-align:top;">
      Text
    </h1>
    <h1 class="header" style="vertical-align:bottom;">
      Text
    </h1>
  </div>
</div>

您还可以通过设置高度来控制线框inline-block元素:

#outer {
  box-sizing: border-box;
  border: red 1px solid;
  height: 200px;
  text-align: center;
}

#inner {
  border: blue 1px solid;
  height: 200px;
  display: inline-block;
}

.header {
  display: inline;
  border: green 1px solid;
  margin: 0;
}
.elem {
 display:inline-block;
 background:red;
 width:2px;
 height:5px;
 animation:change 5s linear alternate infinite;
}
@keyframes change {
  from {height:20px;}
  to {height:100px;}
}
<div id="outer">
  <div id="inner">
    <h1 class="header">
      Text
    </h1>
    <div class="elem">
    </div>
    <h1 class="header" style="vertical-align:middle;">
      Text
    </h1>
    <h1 class="header" style="vertical-align:top;">
      Text
    </h1>
    <h1 class="header" style="vertical-align:bottom;">
      Text
    </h1>
  </div>
</div>

作为结论:对齐使用vertical-align您应该有一个高度足够大的行框(明确设置或由其他元素设置),您可以在其中对齐元素。如果您的元素正在定义行框(这是常见情况),则无需对齐。


一些好问题以获得更多详细信息:

垂直对齐不适用于内联块

行内元素和行高

我的内联块元素没有正确排列

为什么这个内联块元素被向下推?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

垂直对齐属性如何工作? 的相关文章

随机推荐

  • TypeScript 需要进行类型检查

    我正在使用 TypeScript v1 4 1 并且希望需要一个外部模块 在本例中为 chai 并对其进行类型检查 但是 我遇到了与此代码的某种命名冲突
  • 字符串替换转义字符

    今天我发现将字符串放入资源文件中会导致它们被视为文字 即放置 第一行文本 n第二行文本 将导致转义字符本身被转义 因此存储的内容是 第一行的文本 n 第二行的文本 然后这些出现在显示屏中 而不是我的回车符和制表符 所以我想做的是使用 str
  • 无法在 VBA 中创建新枚举

    我正在 VBA 中创建一个不可变链接列表类 它提供ToArray and ToCollection方法 我已经验证这两种方法都有效 但是 那Get NewEnum As IUnknown财产不工作 我不知道为什么 Public Proper
  • 如何使用 Android UiAutomation.injectInputEvent 注入点击事件

    我正在自动测试我安装设备管理员的应用程序中的流程 要在大多数设备上激活设备管理员 假设这里没有一些企业 API 可以让我像三星提供的那样执行此操作 系统会向用户显示一个弹出窗口 然后用户必须单击 激活 按钮 我在用着Robotium和 An
  • Angular.js 说自定义 HTTP 响应标头为 null

    POST 的回调函数为我的自定义 HTTP 标头返回 nullX Auth Token Chrome 显示了正确的 POST 响应标头 但 Angular js 却没有 Angular 唯一返回的是 Cache Control 和 Cont
  • 在 AngularJS 中创建阅读更多链接

    我想创建一个包含阅读更多文本的链接 如果段落中的行数超过 3 行 则此链接应该可见 单击此链接将显示所有行 我想做同样的事情 所以我创建了一个指令 看看这里 https gist github com doukasd 0744566c549
  • 没有位置服务的 iOS 后台轮询

    这是一个我们都曾多次想知道的问题 但似乎没有人有一个好的答案 像 DataMan 这样的应用程序如何在后台定期 无限期地运行 并且仍然进入应用程序商店 该应用程序允许用户打开 精确数据跟踪 并选择应用程序在零用户交互的情况下更新其数据使用计
  • dotnetpublish 未发布正确的 appsettings.{env.EnvironmentName}.json

    当我在命令行中发出以下命令时 dotnet publish o output c Release The dotnetcli正确发布项目 然而 它并不复制appsettings Production json文件 仅appsettings
  • 如何直接在 Visual Studio 中构建 mex 文件?

    我有一个包含函数库的 Visual Studio 2010 解决方案 并且我希望能够使用 MATLAB 作为该库的几个可能的前端之一 因此 我希望 Visual Studio 在构建解决方案时自动生成 mex 文件 而不必将所有构建选项和路
  • 别名模板专业化

    别名模板 14 5 7 可以显式专门化 14 7 3 吗 我的标准 fu 失败了 我找不到编译器来测试 文本 当 template id 引用别名模板的专门化时 意味着yes 但这个例子似乎指的是其他东西 暗示no NB I m worki
  • 包含非自反元素的集合的比较

    在Python中 一个值x并不总是被限制为等于自身 也许最著名的例子是NaN gt gt gt x float NaN gt gt gt x x False 现在考虑仅包含一项的列表 我们可以考虑两个这样的列表equal当且仅当它们包含的物
  • 在 C# 中使用 Linq 或 lambda 从数据库表中获取 X 个随机元素

    我有一个包含 x 个用户的数据库 我想随机获取所有用户 然后在我的网站上写下 50 个用户 现在我只使用 take 50 并检索最新 50 个用户 我希望它从整个表中随机洗牌 50 个 有什么想法吗 这就是我的代码现在的样子 userLis
  • %r 是什么意思?

    是什么意思 r在下面的声明中 print r 1 我想我听说过 s d and f但从未听说过这个 背景 在Python中 有两个内置函数用于将对象转换为字符串 str vs repr str应该是一个友好的 人类可读的字符串 repr应该
  • 防止 JSPX 创建自关闭标签 (
    !=

    JSPX 有一个可爱的旋转副作用 div class magic div Into div class magic div 对于许多浏览器来说 即使它是有效的 XHTML 这也会导致布局混乱 因此 我求助于使用 groovy 脚本通过以下正
  • jQuery DataTables 渲染列数据

    我正在使用 jQuery DataTables 显示来自 JSON 编码的 PHP 响应的信息 JSON 响应包含对象 名称 姓名 包含 全名 姓氏 ID 我一直在使用columns以我想要的方式显示数据 但是我遇到了一个我无法弄清楚的问题
  • 如何使用 wallet:accounts:read 请求访问所有用户帐户?

    当我的应用程序请求时wallet accounts read permission使用 Coinbase API v2 用户会看到一个包含所有帐户的下拉列表 他只能在三个可能的钱包中选择一个 如果我的应用程序想要与所有三个钱包 例如 BTC
  • Python:为什么(“hello”是“hello”)评估为True? [复制]

    这个问题在这里已经有答案了 为什么 hello is hello 生产True在Python中 我读了以下内容here 如果两个字符串文字相等 则它们已被置于相同的位置 内存位置 字符串是一个不可变的实体 没有伤害可以 做完了 那么每个 P
  • 添加列之前如何检查列是否存在

    我有一个数据库 如果它不存在 我想向其中添加一列 如何使用 sqlite swift API 做到这一点 通常 如果要向现有表添加新列 您将需要一个迁移路径 您可以使用userVersion管理数据库架构版本的属性 if db userVe
  • 一个用于验证美国和加拿大邮政编码的正则表达式

    我正在开发一个文具程序 客户可以选择美国或加拿大地区 当他们输入地址时 必须输入邮政编码 我正在尝试验证字段 但我无法对美国或加拿大使用 reg exp 我需要一个可验证两个国家 地区邮政编码的正则表达式 不知道您使用的是什么语言 我不会使
  • 垂直对齐属性如何工作?

    我不明白什么时候vertical align会和不会工作 每次我遇到一个用例vertical align至于它是否真的有效 这似乎是一个抛硬币的问题 我知道它必须应用于内联元素 我读到我必须指定一个line height对于通常没有的元素