理解vertical-align
vertical-align 支持的属性值及组成
- inherit
- 线类
baseline, top, middle, bottom - 文本类
text-top, text-bottom - 上标下标类
sub, super - 数值百分比类
20px, 2em, 20%, ...
我们先来看看数值百分比类,这个类其实可以分为数值类和百分比类这两个小类。
这两个小类的共性:
- 都带数字
- 都支持负值(在CSS中,支持负值的属性有margin, letter-spacing, word-spacing, vertical-align)
- 行为和表现一致
数值类就是在 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的更多相关文章
- What is Vertical Align?
https://css-tricks.com/what-is-vertical-align/ ************************************************* CSS ...
- 关于Vertical Align的理解
1:vertical-align 翻译就是垂直-对齐... 2:关于line-height的点 2.1:如果一个标签没有定义height属性,那么其最终表现的高度一定是由line-height起作用. ...
- 浏览器兼容CSS代码:按钮文字垂直居中(input button text vertical align)
经过测试的浏览器:IE6, IE7, IE8, IE9, Firefox, Chrome, Safiri, Maxthon 按钮的HTML代码: <input id="btn_comm ...
- 前端知识点回顾之重点篇——CSS中vertical align属性
来源:https://www.cnblogs.com/shuiyi/p/5597187.html 行框的概念 红色(line-height)为行框的顶部和底部,绿色(font-size)为字体的高度, ...
- 理解SVG坐标系和变换:视窗,viewBox和preserveAspectRatio
SVG元素不像HTML元素一样由CSS盒模型管理.这使得我们可以更加灵活定位和变换这些元素-也许一眼看上去不太直观.然而,一旦你理解了SVG坐标系和变换,操纵SVG会非常简单并且很有意义.本篇文章中我 ...
- CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset
一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...
- Box Model,边距折叠,内联和块标签,CSSReset
一.盒子模型(Box Model) 1.1.宽度测试 1.2.溢出测试 1.3.box-sizing属性 1.4.利用CSS画图 二.边距折叠 2.1.概要 2.2.垂直方向外边距合并计算 三.内联与 ...
- CSS3与页面布局学习笔记(二)——盒子模型(Box Model)、边距折叠、内联与块标签、CSSReset
一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...
- Highcharts图形报表的简单使用
Highcharts是一个纯JavaScript框架,与MSChart完全不一样,可以在网页中使用,所以php.asp.net.jsp等等页面中都可以使用.Highcharts官网:http://ww ...
- CSS权威指南 - 基础视觉格式化 2
行内元素 em a 非替换元素 img 替换元素 两者在内联内容处理方式不一样. inline有时候被翻译成内联,比如inline content,有时候被翻译成行内 inline box. 行布局 ...
随机推荐
- 消息队列RabbitMQ(二):RabbitMQ的系统架构概述
前言 RabbitMQ是基于AMQP协议的,要想深入理解RabbitMQ,就必须先了解AMQP是个什么东东? AMQP协议 AMQP即Advanced Message Queuing Protocol ...
- 企业更需要定制化CRM系统满足个性化需求
随着市场的发展和信息技术的进步,越来越多的企业购买CRM客户关系管理系统来帮助管理.提高效率.但哪怕处在相同行业的企业,他们对于CRM的功能需求都会有着很大的不同.因此,大部分企业都开始进行个性化定制 ...
- linux基本命令随笔
cd(change directory) 不跟参数,直接进入当前登录用户的家目录 . 代表当前目录 .. 代表上级目录 ls(list) -l 显示文件详细信息 -a 显示隐藏文件 -S 以文件大小排 ...
- 搭建LAMP环境部署Ecshop电商网站
实战-部署Ecshop电商网站 实验环境 Centos7 ip:192.168.121.17 一.关闭防火墙和selinux [root@localhost ~]# systemctl stop fi ...
- BUUCTF(十一)[极客大挑战 2019]Knife
BUUCTF系列 想着应该不会这么简单吧... 结果就是这么简单ee 疯狂暗示... url:xxx/index.php 密码:Syc 连接成功... cd / ls cat flag
- jmeter完成一个简单的性能测试(jp@gc - PerfMon Metrics Collector的运用)
场景:公司项目解耦,在项目前期对新的架构进行简单的性能测试 工具:jmeter 1.大致结构如下: 1800秒(半个小时)内持续产生20000的线程 创建了聚合报告,主要是查看服务器响应结果以及相应时 ...
- 021.Python的内置函数
内置函数 1 abs 绝对值函数 res = abs(-9.9867) print(res) 执行 [root@node10 python]# python3 test.py 9.9867 2 rou ...
- Redis()- 布隆过滤器
一.布隆过滤器 布隆过滤器:一种数据结构.由二进制数组(很长的二进制向量)组成的.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识 ...
- 微信小程序setdata修改数组或对象
1.this.setdata修改数组的固定一项的值 changeItemInArr: function() { this.setData({ 'arr[0].text':'changed data' ...
- 基于 BDD 理论的 Nebula 集成测试框架重构(上篇)
本文首发于 Nebula Graph 公众号 NebulaGraphCommunity,Follow 看大厂图数据库技术实践. 测试框架的演进 截止目前为止,在 Nebula Graph 的开发过程中 ...