首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >不同大小的文字底部对齐,为什么不能使用flex-end

不同大小的文字底部对齐,为什么不能使用flex-end

原创
作者头像
扰乱
发布于 2023-10-24 08:31:48
发布于 2023-10-24 08:31:48
1.6K00
代码可运行
举报
文章被收录于专栏:前端样式前端样式
运行总次数:0
代码可运行

flex容器下,不同大小的文字底部对齐,为什么应该使用 baseline 而不是 flex-end?

背景-从一个兼容性Bug说起

看一下最简单的例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="container" style="display: flex;align-items: flex-end">
    <div class="big-text" style="font-size: 26px">大字体</div>
    <div class="small-text" style="font-size: 14px">小字体</div>
</div>

运行的效果如下:

可以看到两个字体所在矩形虽然对齐了,但是两个文字的底部并没有对齐。 分析原因发现,是因为文字周围有一圈空白的边距,这个边距在字体大小不同的情况下是不一致的,所以矩形区域虽然对齐了,但是文字底部没有对齐。而这个边距其实和 line-height 有关,所以首先来看看如何从 line-height 的角度出发解决问题。

line-height 的角度解决

为什么你不应该使用 line-height: 1

首先想到的就是把文字周围的边距给彻底去掉,也即设置 line-height: 1,那么为什么说不应该使用这种方式呢?有以下几个原因:

  1. line-height: 1 的情况下,文字如果长度不定,出现了换行,就会出现两行文字紧贴在一起的情况,如下。因为 line-height 被用来去掉边距了,所以无法再调整换行后文字的行距了。
  1. line-height: 1overflow: hidden 会出现字体上下部分被剪切的问题,如下。这里有点反直觉,line-height: 1 直觉上应该和字体的高度是一致的,但是在实际运行过程中发现,并不是这样的,主要和设备的字体有关,这里后面再详细探讨具体原因。

使用 line-height 的正确方法

在完全去掉周围边距这种方法不可用的情况下,只能通过把不同字体大小的透明边距宽度设置为一致就可以了。基本原理是 矩形区域高度 = (line-height) ≈ (fontSize + 透明边距)。

修改代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="container" style="display: flex;align-items: flex-end">
    <div class="big-text" style="font-size: 26px;font-size: 30px">大字体</div>
    <div class="small-text" style="font-size: 14px;font-size: 18px">小字体</div>
</div>

运行效果如下:

这样就把透明边距都控制为2px,让文字近似做到了底部对齐的效果。

关于 line-heightfont-size 和 矩形大小的更具体内容可以参考这篇掘金文章,非常清楚: https://juejin.cn/post/6971673576017494053

终极解决方案-align-items: baseline

可能更多人使用的是 align-items 的 flex-startcenterflex-end 这几个特性,很少使用 baselinefirst baselinelast baseline,但是在文字对齐上,后面的这三个特性更有用。

经过实测,align-items: baseline 可以完美的做到文字的底部对齐,修改代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="container" style="display: flex;align-items: baseline">
    <div class="big-text" style="font-size: 26px">大字体</div>
    <div class="small-text" style="font-size: 14px;">小字体</div>
</div>

运行效果:

align-items: baseline
align-items: baseline

个人理解,前面比较经常用的一些属性值主要是用于盒子的对齐,而 baseline 相关的三个属性值,是让盒子内文字的 baseline 对齐。而 first baselinelast baseline 应该是在多行文本情况下有多个 baseline 的情况时,要对齐第一个 baseline 还是最后一个 baseline,实测如下:

  1. first baseline
align-items: first baseline
align-items: first baseline
  1. last baseline
align-items: last baseline
align-items: last baseline

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
谈谈ES6语法(汇总下篇)
ES2017标准引入了async函数,使得异步操作更加方便。async函数是Generator函数的语法糖。不打算写Generator函数,感兴趣的话可以看文档。与Generator返回值(Iterator对象)不同,async返回的是一个Promise对象。
Jimmy_is_jimmy
2019/07/31
4180
ES6新特性
由于ES6在一些低版本的浏览器上无法运行,需转成ES5之前的版本兼容,以下有几种方案可以自动转换
jinghong
2020/05/09
1.1K0
ES6新特性
如何写出一个惊艳面试官的 Promise【近 1W字】 前言源码1.Promise2.Generator3.async 和 await4.Pro
1.高级 WEB 面试会让你手写一个Promise,Generator 的 PolyFill(一段代码); 2.在写之前我们简单回顾下他们的作用; 3.手写模块见PolyFill.
火狼1
2020/05/09
7460
如何写出一个惊艳面试官的 Promise【近 1W字】
                            前言源码1.Promise2.Generator3.async 和 await4.Pro
async/await 的理解和用法
async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。
全栈程序员站长
2022/09/14
7700
ES7 语法详解(async 与 await(重点))
为什么要写这个ES7的这个知识点呢,是这样的,因为现在这个async函数 与 await已经使用非常广泛了,它的出现就是解决了ES6中的Generator函数的问题,每次都需要调用next方法,这个也是重点知识,至于其他的ES7-ES11的知识点暂时就不写了,这些暂时也够用了,等之后项目碰到了,再恶补一下[手动滑稽]
彼岸舞
2021/08/20
6290
详解ES7的async及webpack配置async
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/78210599
空空云
2018/09/27
2.4K0
从零开始学 Web 之 ES6(五)ES6基础语法三
在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。现在就让我们一起进入 Web 前端学习的冒险之旅吧!
Daotin
2018/09/30
4660
从零开始学 Web 之 ES6(五)ES6基础语法三
ES6之async函数
Async函数是ES2017引入的,这一引入使得异步操作又更加方便了。其实async函数是generator的语法糖。只是把*号变成async,yield变成await。
wade
2020/04/23
3870
ES6之async函数
JavaScript 异步解决方案 async/await
异步操作一直都是 JavaScript 中一个比较麻烦的事情,从最早的 callback hell,到TJ大神的 co,再到 Promise 对象,然后ES6中的 Generator 函数,每次都有所改进,但都不是那么彻底,而且理解起来总是很复杂。
李振
2021/11/26
4280
ES6-语法基础
箭头函数是把函数简写成一个表达式;如果只有一个参数,()可以省略;如果只有一个行,{ }可以省略,return 可以省略。
用户10175992
2022/11/15
5150
ES6-语法基础
谈谈ES6前后的异步编程
Javascript 语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可。
张炳
2019/08/02
8390
JavaScript异步编程:Generator与Async
JavaScript异步编程:Generator与Async 从Promise开始,JavaScript就在引入新功能,来帮助更简单的方法来处理异步编程,帮助我们远离回调地狱。 Promise是下边要讲的Generator/yield与async/await的基础,希望你已经提前了解了它。 在大概ES6的时代,推出了Generator/yield两个关键字,使用Generator可以很方便的帮助我们建立一个处理Promise的解释器。 然后,在
贾顺名
2018/06/14
1.1K0
优雅的异步编程版本答案async和await解析
一比较就会发现,async 函数就是将 Generator 函数的星号(*)替换成 async,将 yield 替换成 await,仅此而已。
henu_Newxc03
2021/12/26
5570
ES6读书笔记(三)
前段时间整理了ES6的读书笔记:《ES6读书笔记(一)》,《ES6读书笔记(二)》,现在为第三篇,本篇内容包括:
全栈程序员站长
2021/07/06
1.2K0
ES6语法使用精华
let 的作用域与 const 命令相同:只在声明所在的块级作用域内有效。且不存在变量提升 。
前端_AWhile
2019/09/16
8500
谈谈ES6语法(汇总中篇)
数组扩展运算符(spread)是三个点(...)。它好比rest参数的逆运算,将一个数组转为用空格分隔的参数序列。
Jimmy_is_jimmy
2019/07/31
8160
ES6知识库汇总三
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/70833357
j_bleach
2019/07/02
3600
async/await 原理及执行顺序分析
之前写了篇文章《这一次,彻底理解Promise原理》,剖析了Promise的相关原理。我们都知道,Promise解决了回调地狱的问题,但是如果遇到复杂的业务,代码里面会包含大量的 then 函数,使得代码依然不是太容易阅读。
桃翁
2019/11/08
2K0
ES6 系列之我们来聊聊 Async
其实 async 函数的实现原理,就是将 Generator 函数和自动执行器,包装在一个函数里。
夜尽天明
2019/07/10
1.1K0
ES6 系列之我们来聊聊 Async
js入门(ES6)[六]---异步编程
promise可以获取异步操作的信息 主要有三种状态 pending(进行中),fulfilled(成功),rejected(失败) 完成后 可以通过resolve()返回数据 也就是定型状态 这是promise对象
代码哈士奇
2021/10/25
1.3K0
js入门(ES6)[六]---异步编程
相关推荐
谈谈ES6语法(汇总下篇)
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档