vertical-align 支持的属性值及组成

  • inherit
  • 线类
    baseline, top, middle, bottom
  • 文本类
    text-top, text-bottom
  • 上标下标类
    sub, super
  • 数值百分比类
    20px, 2em, 20%, ...

我们先来看看数值百分比类,这个类其实可以分为数值类和百分比类这两个小类。

这两个小类的共性:

  1. 都带数字
  2. 都支持负值(在CSS中,支持负值的属性有margin, letter-spacing, word-spacing, vertical-align)
  3. 行为和表现一致

数值类就是在 baseline 对齐基础上上下偏移对应数值大小,如 vertical-align: 1px; 就是在基线的基础上上移1px。而vertical-align 的百分比值是相对于 line-height 计算的,例如某元素的line-height 是20px, vertical-align:25% 相当于设置vertical-align: 5px。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
p{
background-color: #ccc;
}
#p2{
line-height: 100px;
}
#span1{
vertical-align: 10px;
}
#span2{
vertical-align: 100%;
}
</style>
</head>
<body>
<section>
<p id="p1">
<img src="./123.jpg" /><span id="span1">xxxxxxx</span>
</p>
<p id="p2">
<img src="./123.jpg" /><span id="span2">xxxxxxx</span>
</p>
</section>
</body>
</html>

效果如下:

vertical-align 起作用的前提

vertical-align 只能应用于inline水平以及‘table-cell’元素。

inline水平元素主要有:

  • inline:<img>, <span>, <strong>, <em>,...
  • inline-block:<input>, <button>, ...

'table-cell' 元素有:

  • table-cell:<td>

但是下面方式:

display:更改元素的显示水平

css 声明间接更改元素的显示水平,如下面代码

    <style>
p{
background-color: #ccc;
}
#img1{
float: left;
vertical-align: middle;
}
</style> <section>
<p>
 <img id="img1" src="./123.jpg" /><span>xxxxxxx</span>
</p>
</section>

效果如下,图片浮动了,其display水平变成block,因此 vertical-align 失效了。

再如:

    <style>
p{
background-color: #ccc;
}
#img1{
position:absolute;
vertical-align: middle;
}
</style> <section>
<p>
<img id="img1" src="./123.jpg" /><span>xxxxxxx</span>
</p>
</section>

效果如下图,文字跑到图片后面去了,此时图片display水平也是block。

下面还有一个vertical-align 失效的例子。

    <style>
p{
height: 300px;
text-align: center;
background-color: #ccc;
}
#img1{
vertical-align: middle;
}
</style> <section>
<p>
<img id="img1" src="./123.jpg" />
</p>
</section>

效果如下,图片没有垂直居中。

其实不是vertical-align: middle没起作用,而是太短,不够居中,将行高设为容器高度值就可以解决了。

        p{
height: 300px;
line-height: 300px;
text-align: center;
background-color: #ccc;
}
实现个数不定文字内容和图片垂直居中对齐
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div{
background-color: #ddd;
width: 800px;
margin: 0 auto;
}
li{
list-style: none;
margin-bottom: 10px
}
span{
display: inline-block;
width: 400px;
vertical-align: middle;
}
img{
vertical-align: middle;
}
</style>
</head>
<body>
<div>
<ul>
<li>
<span>一段文字,一段文字,一段文字,一段文字一段文字,一段文字</span>
<img src="./123.jpg"/>
</li>
<li>
<span>一段文字,一段文字</span>
<img src="./123.jpg"/>
</li>
<li>
<span>一段文字,一段文字</span>
<img src="./123.jpg"/>
</li>
</ul>
</div>
</body>
</html>

vertical-align 与 line-height

vertucal-align 和 line-height 之间的关系很明确,即“朋友”关系。如下面几个例子

  • vertical-align 的百分比值是相对于 line-height 计算的
  • 只要出现内联元素,这对好朋友就会出现。

例如容器高度不等于行高的例子,就是vertucal-align 和 line-height 搞的鬼。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
#div1{
line-height: 32px;
background-color: #ccc;
}
#div1 > span{
font-size: 24px;
}
</style>
</head>
<body>
<div id="div1">
x<span>文字x</span>
</div>
</body>
</html>

效果如下

我们可以看到,容器高度为35px, 行高是32px,左右两边的x大小不相同。为什么会这样呢?有一个很关键的点,那就是font-size: 24px 是设置在span元素上的,导致外部div与span字体大小有出入。

由于受line-height:32px 影响,这两个内联盒子高度都是32px,我们应该知道,对字符而言,font-size 越大字符的基线越往下,因为文字默认全部是基线,所以当字号大小不一样的两个文字在一起时,就会发生上下位移,如果位移距离足够大,就会超过行高的限制,而导致意料之外的容器高度,如下图。

搞清楚原因,我们就能找到解决办法了。关于隐匿文本节点和内联盒子,可以参见上一篇。

方法一:我们可以让隐匿文本节点和后面span元素字号一样大

    <style>
#div1{
line-height: 32px;
font-size: 24px;
background-color: #ccc;
}
#div1 > span{
font-size: 24px;
}
</style>

方法二:改变垂直对齐,比如顶部对齐,这样就不会有参差位移。

    <style>
#div1{
line-height: 32px;
background-color: #ccc;
}
#div1 > span{
font-size: 24px;
vertical-align: top;
}
</style>

理解vertical-align的更多相关文章

  1. What is Vertical Align?

    https://css-tricks.com/what-is-vertical-align/ ************************************************* CSS ...

  2. 关于Vertical Align的理解

    1:vertical-align 翻译就是垂直-对齐... 2:关于line-height的点 2.1:如果一个标签没有定义height属性,那么其最终表现的高度一定是由line-height起作用. ...

  3. 浏览器兼容CSS代码:按钮文字垂直居中(input button text vertical align)

    经过测试的浏览器:IE6, IE7, IE8, IE9, Firefox, Chrome, Safiri, Maxthon 按钮的HTML代码: <input id="btn_comm ...

  4. 前端知识点回顾之重点篇——CSS中vertical align属性

    来源:https://www.cnblogs.com/shuiyi/p/5597187.html 行框的概念 红色(line-height)为行框的顶部和底部,绿色(font-size)为字体的高度, ...

  5. 理解SVG坐标系和变换:视窗,viewBox和preserveAspectRatio

    SVG元素不像HTML元素一样由CSS盒模型管理.这使得我们可以更加灵活定位和变换这些元素-也许一眼看上去不太直观.然而,一旦你理解了SVG坐标系和变换,操纵SVG会非常简单并且很有意义.本篇文章中我 ...

  6. CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  7. Box Model,边距折叠,内联和块标签,CSSReset

    一.盒子模型(Box Model) 1.1.宽度测试 1.2.溢出测试 1.3.box-sizing属性 1.4.利用CSS画图 二.边距折叠 2.1.概要 2.2.垂直方向外边距合并计算 三.内联与 ...

  8. CSS3与页面布局学习笔记(二)——盒子模型(Box Model)、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  9. Highcharts图形报表的简单使用

    Highcharts是一个纯JavaScript框架,与MSChart完全不一样,可以在网页中使用,所以php.asp.net.jsp等等页面中都可以使用.Highcharts官网:http://ww ...

  10. CSS权威指南 - 基础视觉格式化 2

    行内元素 em a 非替换元素 img 替换元素 两者在内联内容处理方式不一样. inline有时候被翻译成内联,比如inline content,有时候被翻译成行内 inline box. 行布局 ...

随机推荐

  1. OCR-Form-Tools项目试玩记录(二)产品评测

    这是一篇软工课程作业博客 项目 内容 这个作业属于哪个课程 北航2020春软件工程 006班(罗杰.任健 周五) 这个作业的要求在哪里 个人博客作业-软件案例分析 个人课程目标 系统地学习软件工程理论 ...

  2. 团队任务拆解$\alpha$

    项目 内容 班级:2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 团队任务拆解 我们在这个课程中的目标 提升团队管理及合作能力,开发一项满意的工程项目 这个作业对我们实现目标的 ...

  3. mitmproxy 获取请求响应数据

    比较好的一个介绍是:https://blog.wolfogre.com/posts/usage-of-mitmproxy/ mitproxy 获取请求响应数据的代码如下: # -*- coding: ...

  4. Vue | 指令实现自动翻译填充英文名功能

    背景:应用系统中存在多个创建实体表单,表单填写时,在填写中文名称后,要填写对应的英文名作为标识或数据库查询索引. 需求:填写中文名的同时,系统自动生成英文名并填充到表单中,辅助用户操作,节约操作时间. ...

  5. [c++] 开发问题

    语言中的很多细节都是为了应对实际开发中会遇到的问题 当编写程序时,我们使用的定义多数不是自己写的,如sqrt(),是很多年前别人写的,我们只是使用它们 在C++中,对于"别处"定义 ...

  6. 优麒麟使用教程第三期:Windows 平台 U 盘启动盘制作

    优麒麟使用教程第三期:Windows 平台 U 盘启动盘制作 发布时间:2019-06-27 09:00:15 点击次数:2847 在前几期教程中,小编介绍了如何在虚拟机中安装和使用优麒麟,接下来,小 ...

  7. VMware虚拟机性能优化

    一.ESX及vCenter服务器的优化 检查ESX物理服务器是否在兼容列表中,特别是BIOS的版本是否符合ESX版本的要求 开启ESX物理服务器硬件虚拟化技术VT-X,AMD-V 关闭BIOS中的英特 ...

  8. k8s 管理存储资源(10)

    一.Kubernetes 如何管理存储资源 理解Volume 我们经常会说:容器和 Pod 是短暂的. 其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据 ...

  9. 027. Python面向对象的__init__方法

    __init__魔术方法(构造方法) 触发时机:实例化对象,初始化的时候触发 功能:为对象添加成员 参数:参数不固定,至少一个self参数 返回值:无 基本用法,至少含有一个参数 class MyCl ...

  10. 8.4 parted:磁盘分区工具

    parted     对于小于2TB的磁盘可以用fdisk和parted命令进行分区,这种情况一般采用flisk命令,但对于大于2TB的磁盘则只能用parted分区,且需要将磁盘转换为GPT格式. p ...