CSS line-height应用
一、固定高度的容器,单行文本垂直居中
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>单行文本垂直居中</title>
<style>
div {
width:200px;
height:80px;
background-color:cyan;
line-height:80px;
}
</style>
</head>
<body>
<div>
<p>单行文本垂直居中</p>
</div>
</body>
</html>
页面效果:

二、固定高度的容器,图像水平垂直居中
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>图像水平垂直居中</title>
<style>
div {
width:350px;
height:200px;
background-color: cyan;
text-align: center;
line-height: 200px;
} img {
vertical-align: middle;
}
</style>
</head>
<body>
<div>
<img src="http://a.hiphotos.baidu.com/zhidao/pic/item/72f082025aafa40fa38bfc55a964034f79f019ec.jpg"
alt="A picture" style="width:175px;height:100px" />
</div>
</body>
</html>
页面效果:

其实现原理,我们可以有两种方式解读。
第一种方式,先让隐藏文本节点垂直居中,然后图像与它垂直居中对齐。
(关于“隐藏文本节点”这个概念,出自张旭鑫大大,感兴趣的朋友可以去查看作者的文章;本博下一篇博文“CSS line-height与vertical-align:baseline”中也有相关说明。)
下面来看这段代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>图像水平垂直居中</title>
<style>
div {
width:350px;
height:200px;
background-color: cyan;
text-align: center;
line-height: 200px;
} span {
background-color: red;
}
</style>
</head>
<body>
<div>
<img src="http://a.hiphotos.baidu.com/zhidao/pic/item/72f082025aafa40fa38bfc55a964034f79f019ec.jpg"
alt="A picture" style="width:175px;height:100px" />
<span>xxx</span>
</div>
</body>
</html>
其页面效果为:

我们知道<img>元素后面有一个隐藏文本节点,在这里,我们将它显现出来,xxx;
根据div {height:200px; line-height:200px;} 的设置,xxx作为div中的单行文本被垂直居中了;
此时vertical-align为默认值baseline,所以图像的底边与文本的基线对齐。
如果我们进一步设置img {vertical-align:middle;},就能得到图像垂直居中;如图:

然后我们在html中删掉帮助我们理解的本来是隐藏的 xxx ,就能得到图像水平垂直居中的结果。
第二种方式,先让图像与隐藏文本节点垂直居中对齐,再逐渐扩大行高,由行高撑开隐藏文本的高度,直到行高等于容器的高度,实现垂直居中。
请看如下代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>图像水平垂直居中</title>
<style>
div {
width:350px;
height:200px;
line-height: normal;
background-color: cyan;
text-align: center;
} img {
vertical-align:middle;
} span {
display: inline-block;
background-color: red;
}
</style>
</head>
<body>
<div>
<img src="http://a.hiphotos.baidu.com/zhidao/pic/item/72f082025aafa40fa38bfc55a964034f79f019ec.jpg" alt="A picture" style="width:175px;height:100px" />
<span>xxx</span>
</div>
</body>
</html>
其初始页面效果:

上图为line-height:normal时的页面效果,下面我们逐渐增大line-height的值,来看看页面的变化。
(我们将span元素设置为display:inline-block,这样就能直观地看到line-height的变化过程。)
当line-height的值为80px时,其页面效果:

因为图像的height值为100px;所以当line-height的值小于100px时,图像是不会移动的。
当line-height的值为150px时,其页面效果:

当line-height的值为200px时,其页面效果:

此时line-height与height的值相等,这就是我们想要的效果。
同时,这也是line-height等于height时单行文本能够垂直居中的直观体现。
不过我们还可以继续增加line-height的值,看看有什么变化。
当line-height的值为400px时,其页面效果:

由于容器的高度是200px,而我们的文本行高是400px;从图像上看出,以xxx内容区的中点为界,上下的高度都是200px。
也就是说,行高被内容区的中点均分。
从这个角度来看待行高,就很容易理解单行文本有行高。
这也就能解释为什么height与line-height相等时文本会垂直居中;比如height为200px,line-height为200px,因为行高被内容区的中点均分,以内容区中点为界,上面100px,下面100px,文本自然就在容器的中间。
但是要注意,只是文本内容区垂直居中了,内容区的中点与文本的中点并不是一个点,文本只是近似垂直居中。
而vertical-align:middle,只是让图像的中点与文本的中点对齐,所以,图像也只是近似居中。
那么,怎么才能做到图像完美垂直居中呢?
如果只有图像,没有文本,设置font-size值为0,内容区的中点与文本的中点重合在一起,自然就能完美垂直居中。
如果既有图像,又有文本,把图像和文本都设置vertical-align:middle,让它们相互居中对齐,图像的中点就会与内容区的中点对齐,从而完美垂直居中。
然而,文本该怎么完美垂直居中呢?我也不知道。。。
三、高度不固定的容器,图像水平垂直居中
根据第二种解释,在高度不固定的容器中,让图像与隐藏文本节点垂直居中对齐,再逐渐扩大行高,由行高撑开隐藏文本的高度,随着行高的增加,当行高大于图像的高度时,就能实现图像在不定高容器中的垂直居中。
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>图像水平垂直居中</title>
<style>
div {
background-color: cyan;
text-align: center;
line-height: normal;
} img {
vertical-align:middle;
}
</style>
</head>
<body>
<div>
<img src="http://a.hiphotos.baidu.com/zhidao/pic/item/72f082025aafa40fa38bfc55a964034f79f019ec.jpg"
alt="A picture" style="width:175px;height:100px">
</div>
</body>
</html>
页面效果:

然后我们改变line-height的值为150px,由隐藏文本节点撑开父容器的高度,得到如下效果:

四、多行文本水平垂直居中
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>多行文本水平垂直居中</title>
<style>
div.box {
width:500px;
height:300px;
background-color: cyan;
text-align: center;
line-height: 300px;
} div.container {
display:inline-block;
vertical-align: middle;
line-height: 1.5;
width: 380px;
text-align: left;
}
</style>
</head>
<body>
<div class="box">
<div class="container">
<ul>
<li>多行文本水平垂直居中的原理与图像一样;</li>
<li>将文本用一个容器封装起来,把它当成图像看待;</li>
<li>设置display属性值为inline-block;</li>
<li>设置line-height属性值;</li>
<li>设置width属性值;</li>
<li>设置text-align属性值。</li>
</ul>
</div>
</div>
</body>
</html>
页面效果:

总结:
关于垂直居中,关键是让容器的height值与line-height值相等!
CSS line-height应用的更多相关文章
- [css] line boxes
原文链接:http://www.zhangxinxu.com/wordpress/2010/01/css-float%E6%B5%AE%E5%8A%A8%E7%9A%84%E6%B7%B1%E5%85 ...
- css中height 100vh的应用场景,动态高度百分比布局,浏览器视区大小单位
css中height 100vh的应用场景,动态高度百分比布局,浏览器视区大小单位 height:100vh 一些只能vw, vh才能完成的应用场景: 1. 场景之:元素的尺寸限制 vw vh 主要是 ...
- css & auto height & overflow: hidden;
css & auto height & overflow: hidden; {overflow: hidden; height: 100%;} is the panacea! {溢出: ...
- CSS设置height为100%无效的情况
CSS设置height为100%无效的情况 笔者是小白,不是特别懂前端.今天写一个静态的HTML页面,然后想要一个div占据页面的100%,但是尝试了很多办法都没有实现,不知道什么原因. 后来取百度搜 ...
- 构建前端第4篇之---使用css用法 height
张艳涛 写于2021-1-20 height: 100%; What: html的元素标签,例如 <html>,<body>,<div>都有height的css属 ...
- 深入了解css的行高Line Height属性
什么是行间距? 古时候我们使用印刷机来出来文字.印刷出来的每个字,都位于独立的一个块中. 行间距,即传说中控制两行文字垂直距离的东东.在CSS中,line-height被用来控制行与行之间垂直距离. ...
- CSS——对height和line-height的理解
最近在做CSS界面时经常遇到line-height和height这两个属性,一直没搞很明白,今天静下心来好好网上查阅了一下,算是有所领悟.https://blog.csdn.net/a20131263 ...
- IE6 CSS高度height:100% 无效解决方法总结
原文地址:http://www.cnblogs.com/huangyong8585/archive/2013/02/05/2893058.html 上面红色部分为 height:100%; 自动拉 ...
- css之height: 100%的有效场景
在css的日常应用中,经常会遇到想要通过 height: 100%来达到使子盒子与父盒子高度一样的目的,但是偶尔明明设置了height: 100%,但是却没有达到想要的结果,这次我们就一起探索一下,什 ...
- css width height
css 中body 的默认宽度是100%,但是默认高度为0px
随机推荐
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- vs2017自动生成的#include“stdafx.h”详解及解决方案
vs2017自动生成的#include“stdafx.h”详解及解决方案 问题描述: 在高版本的Visual Studio的默认设置中,会出现这么一个现象,在新建项目之后,项目会自动生成#includ ...
- 一种KEIL中定义过的变量在使用中提示未定义的情况
[环境] > KEIL5.25 > win10 > @2018-4-23 [问题] 头文件互包含导致的错误(使用了另一文件的类型定义) 文件<fileA.h> <f ...
- 洛谷 P1685 游览 解题报告
P1685 游览 题目描述 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!! ...
- 【poj2406】 Power Strings
http://poj.org/problem?id=2406 (题目链接) 题意 给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的, 求 R 的最大值. Solution 后 ...
- Linux内核分析第八周——进程的切换和系统的一般执行过程
Linux内核分析第八周--进程的切换和系统的一般执行过程 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...
- android 布局的两个属性 dither 和 tileMode
tileMode(平铺)tileMode(平铺) 的效果类似于 让背景小图不是拉伸而是多个重复(类似于将一张小图设置电脑桌面时的效果) dither(抖动) Dither(图像的抖动处理,当每个颜色值 ...
- centos详细安装redis步骤
1. 从官网(http://redis.io)下载最新稳定版2. 使用命令解压下载的tar包:tar –zxvf redis-3.2.0.tar.gz3. 通过命令cd redis-3.2.0进入源码 ...
- (转)话说C语言const用法
const在C语言中算是一个比较新的描述符,我们称之为常量修饰符,意即其所修饰 的对象为常量(immutable). 我们来分情况看语法上它该如何被使用. 1.函数体内修饰局部变量. 例: void ...
- Java入门:JDK与Eclipse之类的集成开发工具的关系
JDK是Java Development Kit,也就是说Java开发所需的工具包.有了这个东西,一切Java开发理论上都不是问题了.当然,根据你下载的版本不同,可能擅长的领域不同.通常大家都是用JD ...