垂直对齐:基线有什么用?

2024-02-02

我以为我了解 CSS,但我现在需要向某人解释一些事情,但我发现我做不到。

我的问题基本上可以归结为:为什么vertical-align:baseline当同一行中有其他对齐时被忽略?

示例:如果第二个跨度有vertical-align:bottom,如果是,则第一个跨度的垂直对齐将被忽略baseline;它的行为就好像它有bottom too.

span:first-child {vertical-align:baseline}
span:last-child {font-size:3em; vertical-align:bottom;}
<p>
  <span>one</span> <span>two</span>
</p>

而如果所有跨度都有垂直对齐,而不是baseline,或者,如果它们都是baseline,然后它们的行为就如预期的那样。

span:first-child {vertical-align:top}
span:last-child {font-size:3em; vertical-align:bottom;}
<p>
  <span>one</span> <span>two</span>
</p>
span:first-child {vertical-align:baseline}
span:last-child {font-size:3em; vertical-align:baseline;}
<p>
  <span>one</span> <span>two</span>
</p>

如果这是正常行为,那么为什么没有在任何地方进行描述?我还没有找到任何消息来源表明基线和顶部/底部以这种方式相互干扰。


垂直对齐

vertical-align https://developer.mozilla.org/en/docs/Web/CSS/vertical-align用于对齐行内元素 https://www.w3.org/TR/CSS2/visuren.html#inline-level。这些是元素,其display https://developer.mozilla.org/en-US/docs/Web/CSS/display属性评估为:

  • inline
  • inline-block
  • inline-table(本答案中未考虑)

行内元素在行中彼此相邻放置。一旦元素数量超过当前行,就会在其下方创建一个新行。所有这些线路都有一个所谓的line box,它包含了该行的所有内容。不同大小的内容意味着不同高度的行框。

In the following illustration the top and bottom of line boxes are indicated by red lines. enter image description here

在这些行框内的属性vertical-align负责对齐各个元素。

Baseline

垂直对齐最重要的参考点是相关元素的基线。在某些情况下,元素封闭框的顶部和底部边缘也变得很重要。

行内元素

行高的顶部和底部边缘由红线表示,字体的高度由绿线表示,基线由蓝线表示。

在左侧,文本的行高设置为与字体大小相同的高度。绿线和红线两边都塌陷为一条线。

在中间,行高是字体大小的两倍。

在右侧,行高是字体大小的一半。

请注意,如果行高小于字体高度,则内联元素的外边缘(红线)并不重要。

内联块元素

从左到右你看:

  • an inline-block元素与in-flow https://www.w3.org/TR/CSS21/visuren.html#positioning-scheme content

  • an inline-block元素与in-flow https://www.w3.org/TR/CSS21/visuren.html#positioning-scheme内容和overflow: hidden

  • an inline-block元素没有in-flow https://www.w3.org/TR/CSS21/visuren.html#positioning-scheme内容(但内容区域有高度)

页边距的边界用红线表示,边框为黄色,内边距为绿色,内容区域为蓝色。每个的基线inline-block元素显示为蓝线。

The inline-block元素的基线取决于该元素是否具有in-flow https://www.w3.org/TR/CSS21/visuren.html#positioning-scheme内容。的情况下:

  • in-flow https://www.w3.org/TR/CSS21/visuren.html#positioning-scheme内容的基线inline-blockelement 是正常流程中最后一个内容元素的基线(左边的例子)

  • in-flow https://www.w3.org/TR/CSS21/visuren.html#positioning-scheme内容但overflow属性评估为除可见之外的其他内容,基线是边距框的底部边缘(中间的例子)

  • no in-flow https://www.w3.org/TR/CSS21/visuren.html#positioning-scheme内容基线再次是边距框的底部边缘(右边的例子)

Line box

这可能是使用时最令人困惑的部分vertical-align。这意味着,基线放置在需要满足所有其他条件(例如vertical-align and 最小化行框的高度。它是一个自由参数在等式中。

由于线框的基线是不可见的,因此可能不会立即明显看出它在哪里。但是,您可以很容易地使其可见。只需在问题的行首添加一个字符,如图中的“x”即可。如果该字符未以任何方式对齐,则默认情况下它将位于基线上。

在其基线周围,行框有我们所谓的文本框(图中的绿线)。文本框可以简单地视为行框内的内联元素,无需任何对齐。它的高度等于font-size其父元素。因此,文本框仅包围行框的未格式​​化文本。由于此文本框与基线相关联,因此它会随着基线移动而移动。

Snippet

如果你想做一些不同的实验vertical-align and font-size这里有一个片段,您可以在其中尝试一下。也可用于JSFiddle https://jsfiddle.net/rcp47hm4/6/.

let sl1 = document.getElementById('sl1');
let sl2 = document.getElementById('sl2');
let sl3 = document.getElementById('sl3');
let sl4 = document.getElementById('sl4');
let elm1 = document.getElementById('elm1');
let elm2 = document.getElementById('elm2');
let elm3 = document.getElementById('elm3');
let elm4 = document.getElementById('elm4');
let ip1 = document.getElementById('ip1');
let ip2 = document.getElementById('ip2');
let ip3 = document.getElementById('ip3');
let ip4 = document.getElementById('ip4');
let slArr = [sl1, sl2, sl3, sl4];
let elmArr = [elm1, elm2, elm3, elm4];
let ipArr = [ip1, ip2, ip3, ip4];
let valueArr = ['baseline', 'top', 'middle', 'bottom'];
for (let i = 0; i < slArr.length; i++) {
  slArr[i].addEventListener('change', (event) => {
    elmArr[i].style.verticalAlign = event.target.value;
    elmArr[i].innerHTML = event.target.value;
    addDiv();
  })
}
for (let i = 0; i < ipArr.length; i++) {
  ipArr[i].addEventListener('change', (event) => {
    elmArr[i].style.fontSize = event.target.value + 'em';
    addDiv();
  })
}

document.getElementById('btnRandom').addEventListener('click', () => {
  for (let i = 0; i < elmArr.length; i++) {
    let element = elmArr[i];
    let fontSize = Math.floor(Math.random() * 4 + 1);
    ipArr[i].value = fontSize;
    element.style.fontSize = fontSize + 'em';
    let styleIndex = Math.floor(Math.random() * 4);
    element.style.verticalAlign = valueArr[styleIndex];
    element.innerHTML = valueArr[styleIndex];
    slArr[i].selectedIndex = styleIndex;
  }
}, this);

function addDiv() {
  let view = document.getElementById('viewer');
  view.innerHTML = "";
  elmArr.forEach(function(element) {
    let div = document.createElement('div');
    div.appendChild(element.cloneNode());
    view.appendChild(div);
  }, this);
}
.header span {
  color: #000;
}

select {
  width: 100px;
}

#elms {
  border: solid 1px #000;
  margin-top: 20px;
  position: relative;
}

span {
  color: #FFF;
  font-size: 1em;
}

#elm1 {
  background-color: #300;
}

#elm2 {
  background-color: #6B0;
}

#elm3 {
  background-color: #90A;
}

#elm4 {
  background-color: #B00;
}

div {
  z-index: -1;
}

#div1 {
  width: 100%;
  height: 1px;
  background-color: #000;
  position: absolute;
  left: 0;
  top: 25%;
}

#div2 {
  width: 100%;
  height: 1px;
  background-color: #000;
  position: absolute;
  left: 0;
  top: 50%;
}

#div3 {
  width: 100%;
  height: 1px;
  background-color: #000;
  position: absolute;
  left: 0;
  top: 75%;
}
<div class="header"> <span style="width: 100px;display: block;float: left;margin-right: 20px;">vertical align</span> <span>font-size(em)</span> </div>
<div>

  <select name="sl1" id="sl1">
    <option value="baseline">baseline</option>
    <option value="top">top</option>
    <option value="middle">middle</option>
    <option value="bottom">bottom</option>
  </select>
  <input type="number" value="1" id="ip1" />
  <br>
  <select name="sl2" id="sl2">
    <option value="baseline">baseline</option>
    <option value="top">top</option>
    <option value="middle">middle</option>
    <option value="bottom">bottom</option>
  </select>
  <input type="number" value="1" id="ip2" />
  <br>
  <select name="sl3" id="sl3">
    <option value="baseline">baseline</option>
    <option value="top">top</option>
    <option value="middle">middle</option>
    <option value="bottom">bottom</option>
  </select>
  <input type="number" value="1" id="ip3" />
  <br>
  <select name="sl4" id="sl4">
    <option value="baseline">baseline</option>
    <option value="top">top</option>
    <option value="middle">middle</option>
    <option value="bottom">bottom</option>
  </select>
  <input type="number" value="1" id="ip4" />
  <br>
  <button id="btnRandom" (onclick)="random()">Random</button>
</div>
<div id="elms">
  <span id="elm1">one</span>
  <span id="elm2">two</span>
  <span id="elm3">three</span>
  <span id="elm4">four</span>
  <div id="div1"></div>
  <div id="div2"></div>
  <div id="div3"></div>
</div>
<div id="viewer"></div>

这个片段是由Duannx https://stackoverflow.com/users/4254681/duannx.


Source: Please note that this is an extract of Vertical-Align: All You Need To Know http://christopheraue.net/2014/03/05/vertical-align/ written by Christopher Aue.

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

垂直对齐:基线有什么用? 的相关文章

  • 如何删除标题中的粗体?

    我有一个标题 h1 THIS IS A HEADLINE h1 如何使短语 THIS IS 不加粗 其余部分不做任何更改 我在文本装饰中找不到任何相关标签 标题看起来很粗体 因为它大尺寸 如果您已应用粗体或想要更改行为 您可以执行以下操作
  • PDF 在 Safari 中隐藏 Jquery Modal

    这是与我有关的事情this https stackoverflow com questions 24052681 pdf hide jquery modal in ie问题 在 IE 中 我在对话框中使用 iframe 解决了问题 所以它工
  • 为什么使用 iPhone 或 iOS 设备在“iframe”中查看“position:fixed”时不起作用?

    我研究过 stackoverflow 似乎position fixed在 iOS 移动设备的 iframe 中 https stackoverflow com questions 15874910 position fixed and if
  • 重新创建 CSS3 过渡三次贝塞尔曲线

    在 CSS3 过渡中 您可以将计时函数指定为 cubic bezier 0 25 0 3 0 8 1 0 在该字符串中 您仅指定曲线上点 P1 和 P2 的 XY 因为 P0 和 P3 始终分别为 0 0 0 0 和 1 0 1 0 根据苹
  • 从字体到跨度(大小和颜色)和背面的正则表达式(VB.NET)

    我正在寻找一个正则表达式 可以将我的字体标签 仅具有大小和颜色属性 转换为具有相关内联CSS的span标签 如果有帮助的话 这将在 VB NET 中完成 我还需要一个正则表达式来实现相反的效果 下面详细说明的是我正在寻找的转换示例 font
  • 编辑类名中带有空格的元素的 css 样式

    我正在创建一个 tumblr 我必须编写一个外部 CSS 文件 但我在编辑 post 元素的 css 样式时遇到问题 这是它的结构 li class post quote other code li 问题是类名中有空格 我如何创建一个 CS
  • 如何将大于整个页面 100% 的元素居中对齐?

    我有一个宽度为 100 的 div 并且隐藏了一个宽度为 3000px 的 div 我希望3000px的div左右均匀地被切断 我会使用背景位置 中心 然而 事情比这更复杂 3000px div 包含 30 100px div 我尝试过在
  • 如何强制折断不可折断的字符串?

    我有一个根据数据库中包含的数据生成的 HTML 页面 数据库有时包含浏览器无法分解的长字符串 因为这些字符串不包含可分解的字符 空格 点 逗号等 有没有办法使用 html css 甚至 javascript 来解决这个问题 看到这个link
  • 使 Material UI Grid 项目的子项拉伸以适合父容器的剩余高度

    1 现状 我有一个包含 4 个网格项的 Material UI 网格容器 每个 Grid 项中都有一个 Typography 组件 其中包含标题和包含一些内容的 Card 如下所示 2 期望的外观 我希望卡片填充网格项目的剩余高度并且不超过
  • 将父容器扩展至 100% 高度以容纳浮动内容

    我正在为一个客户项目而苦苦挣扎 我的全部divs 没有绝对定位 height 100 for html body 和容器divs 但静态内容未达到其内容 在 910 像素处 我可以将溢出属性更改为auto 并且背景会继续向下到内容的末尾 但
  • 增加数字输入、CSS、HTML 上的向下和向上箭头的大小

    有没有办法利用CSS来增大数字输入框右侧的上下箭头的大小 只是向上和向下箭头 而不是整个输入框 或者至少是按比例的 看这个例子 size 36 font size 36px size 12 font size 12px
  • 根据变量值将 LESS 编译为多个 CSS 文件

    有一个指定颜色的变量variables less文件 例如 themeColor B30F55 和一个 json构成实体列表的文件 其中每个键是一个实体 ID 键的值是该实体的颜色 例如 8ab834f32 B30F55 3cc734f31
  • CSS:水平滚动时背景不存在

    好的 我的背景设置如下 HTML div div CONTENT HERE div div CSS container background url image gif content width 800px margin auto 因此
  • 使用deployJava.runApplet来定位特定元素

    经过多年成功维护一个使用旧有的小程序 嵌入Java小程序的方法 我们无法捂住耳朵唱 啦啦啦 不再了 是时候使用 deployJava runApplet 当我使用点击处理程序触发此方法时 此处通过 jQuery 在按钮上使用事件侦听器 但这
  • 如何使用 a-href 标签链接回文件夹? [复制]

    这个问题在这里已经有答案了 好吧 我在文件夹中有一个页面 该页面称为 jobs html 该文件夹简称为 jobs 它是我的 网站 文件夹的子文件夹 在 main 文件夹的主目录中是我的 home html 文件 当我尝试做的时候 a hr
  • 如何在背景剪辑中包含文本装饰:文本;影响?

    我在用 webkit background clip text border and color transparent在锚标记上 下划线似乎永远不可见 我想要的是将文本装饰包含在背景剪辑中 这是我的CSS background clip
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • 为范围旋钮 ionic-range 添加边框颜色

    我正在使用离子范围添加范围滑块 并想向范围旋钮添加边框 由于它的 ionic4 和范围旋钮是 Shadow dom 的一部分 我无法使用范围旋钮的 border 属性直接更改边框 我已附上我想要实现的图像 范围旋钮周围有白色边框 现有属性只
  • HTML 默认图像大小

    我在我的代码上显示 3 张图片 图片具有不同的尺寸 宽度和高度 div class row div class col lg 12 h2 class page header Gallery h2 div div class col md 4
  • 带显示块的SPAN

    和默认有什么区别 div 元素和默认值 span 元素与display block HTML 元素的有效性和语义存在差异 否则它们是相同的 div and span两者都被定义为通用容器 在 HTML 方面没有更深层次的含义 一个默认为块显

随机推荐

  • z3 是否支持有理算术的输入约束?

    事实上 SMT LIB标准是否有理性的 不仅仅是真实的 排序 按其website http smtlib cs uiowa edu theories shtml 它不是 如果 x 是有理数并且我们有约束 x 2 2 那么我们应该返回 不可满
  • 比较 Slick 查询中的类型映射值

    考虑下面的收藏夹表对象 我们想要编写一个查询来按收藏夹的类型 定义如下 查找收藏夹 我们还定义了一个类型映射器 将FavoriteType映射到数据库的字符串 import scala slick driver PostgresDriver
  • Autofac 和 IHttpClientFactory:无法解析参数“System.Net.Http.HttpClient httpClient”

    我正在构建一个控制台应用程序 我决定按照详细示例使用 Autofachere https www thecodebuzz com configure httpclientfactory autofac di httpclient So I
  • 创建 UICollectionViewCell 时如何在发送者中添加标签值?

    我对 Swift 非常菜鸟 所以我有一个问题来解决我的应用程序中的问题 在 UIView 中 我刚刚添加了一个集合视图作为子视图 然后在每个单元格中我在 包装视图 内添加了不同的图像 所以我的问题是 如何添加一个手势来接收每个单元格的发送者
  • 惰性 getter 在类中不起作用

    class a get b delete this b return this b 1 var c get b delete this b return this b 1 console log c b works as expected
  • JsonProvider 可以反序列化为 Generic.Dictionary 吗?

    我正在学习类型提供程序 它看起来像是一个突破性的功能 但是 我无法设法使用 JsonProvider 反序列化 json 以便目标类型具有 Generic Dictionary 属性 可以使用 Json NET 来完成 这是代码 type
  • 在 GO 中获取传入的 TTL

    我正在为我正在进行的一个小项目而苦苦挣扎 我想在 GO 中实现功能 允许我在传出 UDP 数据包上设置 IP 标头 TTL 然后发送该数据包并查看另一端收到的 TTL 我尝试使用 net 库提供的多个连接 但到目前为止没有成功 我可以设置
  • 逐行读取输入

    如何在Java中逐行读取输入 我搜索过 到目前为止我有这个 import java util Scanner public class MatrixReader public static void main String args Sca
  • 在 Android ActionBar 上设置导航图标

    因此 我正在努力将 ActionBarSherlock 和导航抽屉添加到以前实现自定义 写得很差 操作栏 的项目中 某些活动不使用片段和活动的后台堆栈进行导航 而是显示和隐藏不同的布局 也就是说 假设我处于列表模式 然后选择一个按钮进入编辑
  • CQRS 项目是否需要像 NServiceBus 这样的消息传递框架?

    过去 6 个月的学习曲线充满挑战 CQRS 和 DDD 是罪魁祸首 这很有趣 我们的项目已经完成了 1 2 我还没有时间深入研究的领域是消息传递框架 目前我不使用 DTC 因此如果我的读取模型未更新 那么很可能会出现读取和写入数据库之间的不
  • MediaCodec 给出了 storeMetaDataInBuffers 跟踪错误

    在 Android 中通过 MediaCodec 进行编码时 我在 logcat 上遇到了下一个错误 实际的编码工作正常并且输出生成正确 所以我无法真正理解为什么我得到这个跟踪 这是无害的错误跟踪 还是我遗漏了什么 E ACodec 643
  • 使用 PowerShell 授权 Office365 逻辑应用 API 连接

    尝试设置一堆支持Azure功能等的逻辑应用程序 概念是利用ML Azure功能 逻辑应用程序等来设置自动邮件系统 一切都是使用 ADO Git 和 CD CI 管道进行部署的 但我们在 Office365 连接器方面遇到了问题 它在创建后需
  • 即使应用程序似乎未安装,也会失败 [INSTALL_FAILED_UPDATE_INCOMPATIBLE]

    当尝试将我的应用程序部署到 Android 设备时 我收到以下错误 Deployment failed because of an internal error Failure INSTALL FAILED UPDATE INCOMPATI
  • Glyphicon 在 bootstrap 版本 4.1 及更高版本中不起作用

    我试图展示一个搜索图标形式 但唯一的按钮显示没有字形
  • 将数据文件添加到python项目setup.py

    我有一个这样的项目 CHANGES txt LICENSE MANIFEST in docs index rst negar Negar py Virastar py Virastar pyc init py data init py un
  • 随机长长生成器 C++ [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 生成随机数的解决方案是什么long
  • 验证 struts 2 中的双字段

    我的 struts 2 表单之一中有一个 长度 字段 length 的数据类型是 double 我已经在 XML 文件中应用了 双重 验证 但是当我在 长度 文本字段中键入字母时 它显示错误消息为 Invalid field value f
  • 我搞砸了我的 System_server 服务吗?

    我的手机正在产生不间断的 Log d 输出 以下内容不断重复每秒1200次 04 25 15 58 04 883 1542 5012 D NetworkStatsCollection getHistory mUID 10266 isVide
  • antlr4:如何知道在给定上下文的情况下选择了哪个替代方案

    假设有一个关于 类型 的规则 它可以是预定义类型 由 IDENTIFIER 引用 或 typeDescriptor type IDENTIFIER typeDescriptor 在我的程序中 我有一个 typeContext ctx 的实例
  • 垂直对齐:基线有什么用?

    我以为我了解 CSS 但我现在需要向某人解释一些事情 但我发现我做不到 我的问题基本上可以归结为 为什么vertical align baseline当同一行中有其他对齐时被忽略 示例 如果第二个跨度有vertical align bott