css 的居中有水平居中和垂直居中,这两种居中又分为行内元素居中和块级元素居中,不同的居中用不同方法。

水平居中

1、行内元素水平居中(文本,图片)

给父层设置 text-align:center; 可以实现行内元素水平居中。

<!DOCTYPE HTML>
<html lang="en-US">
<head><meta charset="UTF-8"><title></title><style type="text/css">.center{text-align:center;}</style>
</head>
<body><div class="center"><a href="http://www.google.com.hk/">谷歌搜索</a><br/><br/><img src="cat.jpg" width="248" height="162" alt=""/></div>
</body>
</html>

2、确定宽度块级元素水平居中

确定宽度的块级元素水平居中,常用的有 margin:0 auto; 相信很多开发人员都用的是这个,不过本人认为还有更好的写法:margin-left:auto;margin-right:auto; 因为 margin-top 和 margin-bottom 在重置 css 时就已经写了为 0 了。

<!DOCTYPE HTML>
<html lang="en-US">
<head><meta charset="UTF-8"><title></title><style type="text/css">.center{width:100px;height:100px;margin-left:auto;margin-right:auto;background:green;}</style>
</head>
<body><div class="center"></div>
</body>
</html>

3、不确定宽度的块级元素水平居中

不确定宽度的块级元素有三种方法实现。

方法一:

<!DOCTYPE HTML>
<html lang="en-US">
<head><meta charset="UTF-8"><title></title><style type="text/css">*{margin:0;padding:0;}ul{list-style:none;}table{margin-left:auto;margin-right:auto;}.demo li{float:left;display:inline;margin-right:5px;}.demo a{float:left;width:20px;height:20px;text-align:center;line-height:20px;background:#316ac5;color:white;border:1px solid #316ac5;text-decoration:none;}.demo a:hover{background:white;color:#316ac5;}</style>
</head>
<body><table><tbody><tr><td><ul class="demo"><li><a href="#">1</a></li></ul></td></tr></tbody></table><table><tbody><tr><td><ul class="demo"><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li></ul></td></tr></tbody></table><table><tbody><tr><td><ul class="demo"><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li></ul></td></tr></tbody></table>
</body>
</html>

这里用到了 table 标签来实现不确定宽度的块级元素水平居中。table 本身不是块级元素,如果不给它设定宽度的话,会由内部元素的宽度“撑开”,但即使不设定它的宽度,仅设置 margin-left:auto 和 margin-right:auto 就可以实现水平居中。

这种方法很巧妙,但是增加了无语义标签,加深了标签的嵌套层数。

方法二:

<!DOCTYPE HTML>
<html lang="en-US">
<head><meta charset="UTF-8"><title></title><style type="text/css">*{margin:0;padding:0;}ul{list-style:none;}.wrapper{width:500px;height:100px;background:black;}.demo{text-align:center;padding:5px;}.demo li{display:inline;}.demo a{padding:2px 6px;background:#316ac5;color:white;border:1px solid #316ac5;text-decoration:none;}.demo a:hover{background:white;color:#316ac5;}</style>
</head>
<body><div class="wrapper"><ul class="demo"><li><a href="#">1</a></li></ul><ul class="demo"><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li></ul><ul class="demo"><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li></ul></div>
</body>
</html>

方法二是改变元素的 display 值,使块级元素变成行内元素,然后使用 text-align:center 使其居中。相对于方法一,它不用增加无语义标签,简化了标签的嵌套深度,但它也存在一定的问题:它将块级元素变成了行内元素,这样就失去了一些块级元素的功能,比如设置宽度,高度。

方法三:

<!DOCTYPE HTML>
<html lang="en-US">
<head><meta charset="UTF-8"><title></title><style type="text/css">*{margin:0;padding:0;}ul{list-style:none;}.wrapper{width:500px;height:100px;background:black;}.demo{clear:both;padding-top:5px;float:left;position:relative;left:50%;}.demo li{display:inline;float:left;margin-right:5px;position:relative;left:-50%;}.demo a{float:left;width:20px;height:20px;text-align:center;line-height:20px;background:#316ac5;color:white;border:1px solid #316ac5;text-decoration:none;}.demo a:hover{background:white;color:#316ac5;}</style>
</head>
<body><div class="wrapper"><ul class="demo"><li><a href="#">1</a></li></ul><ul class="demo"><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li></ul><ul class="demo"><li><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li></ul></div>
</body>
</html>

方法三通过给父层设置浮动和相对定位以及 left:50%,子元素设置相对定位和 left:-50% 来实现水平居中。它可以保留块级元素的功能,而且不会添加无语义标签,不增加嵌套深度,但是设置了相对定位,会带来一定的副作用。

这三种方法各有优缺点,具体使用哪种方法可以视具体情况而定。

垂直居中

1、父层高度不确定的垂直居中

通过给父层设置相同的上下内边距实现。

<!DOCTYPE HTML>
<html lang="en-US">
<head><meta charset="UTF-8"><title></title><style type="text/css">*{margin:0;padding:0;}.demo{width:500px;color:white;margin-bottom:10px;padding-top:20px;padding-bottom:20px;background:black;}.content{width:200px;height:50px;background:red;}</style>
</head>
<body><div class="demo">hello world</div><div class="demo"><img src="cat.jpg" width="248" height="162" alt=""/></div><div class="demo"><div class="content"></div></div>
</body>
</html>

2、父层高度确定的单行文本垂直居中

通过给父层设置行高来实现,行高和父层高度相同。

<!DOCTYPE HTML>
<html lang="en-US">
<head><meta charset="UTF-8"><title></title><style type="text/css">*{margin:0;padding:0;}.demo{width:500px;color:white;background:black;height:100px;line-height:100px;}</style>
</head>
<body><div class="demo">hello world</div>
</body>
</html>

3、父层高度确定的多行文本、图片、块级元素垂直居中

方法一:

说到垂直居中,css 中有个用于垂直居中的属性 vertical-align,但只有在父层为 td 或者 th 时,这个属性才会生效,对于其他块级元素,例如 div、p 等,默认情况是不支持的。在 firefox 和 ie8 下,可以设置块级元素的 display 值为 table-cell,来激活 vertical-align 属性,但 ie6,7 并不支持,所以这种方法没有办法跨浏览器兼容。但是我们可以使用 table。

<!DOCTYPE HTML>
<html lang="en-US">
<head><meta charset="UTF-8"><title></title><style type="text/css">*{margin:0;padding:0;}.wrapper{background:black;width:500px;color:white;height:100px;}.demo{width:200px;background:red;height:50px;}</style>
</head>
<body><table><tr><td class="wrapper">hellow world<br/>hellow world<br/>hellow world<br/></td></tr></table><table><tr><td class="wrapper"><img src="cat.jpg" alt=""/></td></tr></table><table><tr><td class="wrapper"><div class="demo"></div></td></tr></table>
</body>
</html>

table 可以很好的实现垂直居中效果,但是它添加了无语义标签,增加了嵌套深度。

方法二:

对支持 display:table-cell 的 ie8 和 firefox 用 display:table-cell 和 vertical-align:middle 来实现居中,对不支持 display:table-cell 的 ie6 和 ie7 使用 hack 写法。

<!DOCTYPE HTML>
<html lang="en-US">
<head><meta charset="UTF-8"><title></title><style type="text/css">*{margin:0;padding:0;}.mb{margin-bottom:10px;}.wrapper{background:black;width:500px;color:white;height:100px;margin-bottom:10px;display:table-cell;vertical-align:middle;*position:relative;}.demo{width:200px;background:red;height:50px;}.vam{*position:absolute;*top:50%;}.va{*position:relative;*top:-50%;}</style>
</head>
<body><div class="mb10"><div class="wrapper"><div class="vam"><div class="va">hellow world<br/>hellow world<br/>hellow world</div></div></div></div><div class="mb10"><div class="wrapper"><div class="vam"><img src="cat.jpg" alt=""/></div></div></div><div class="mb10"><div class="wrapper"><div class="vam"><div class="va demo"></div></div></div></div>
</body>
</html>

利用 hack 技术区别对待 firefox、ie8 和 ie6、ie7,在不支持 display:table-cell 的 ie6 和 ie7 下,通过给父子两层元素分别设置 top:50% 和 top:-50% 来实现居中。这种方法的好处是没有增加额外的标签,但缺点也很明显,一方面它使用了 hack,不利于维护,另一方面,它设置了 position:relative 和 position:absolute,带来了副作用。

【css】谈谈 css 的各种居中——读编写高质量代码有感相关推荐

  1. 谈谈 css 的各种居中——读编写高质量代码有感

    css 的居中有水平居中和垂直居中,这两种居中又分为行内元素居中和块级元素居中,不同的居中用不同方法. 水平居中 1.行内元素水平居中(文本,图片) 给父层设置 text-align:center; ...

  2. 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

    读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...

  3. java 151建议_编写高质量代码改善java程序的151个建议——导航开篇

    前言 系列文章: 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,惨不忍睹是吧.确实,人和代码一样都在成长,都在变好当中.有时候只是实现功能的编程,长 ...

  4. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...

                 The reasonable man adapts himself to the world; The unreasonable one persists in trying ...

  5. 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符

    建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: int x = 1; int y = 2; int total = x + y; ...

  6. 编写高质量代码:改善Java程序的151个建议(第9章:多线程和并发___建议125~131)

    建议125:优先选择线程池 建议126:适时选择不同的线程池来实现 建议127:lock与synchronized是不一样的 建议128:预防线程死锁 建议129:适当设置阻塞队列的长度 建议130: ...

  7. iOS-《编写高质量代码》笔记-第一章

    <编写高质量代码> 作者 刘一道 看这本书的过程中,做了一些笔记,分享一下. 建议1:视OC 为一门动态语言 写代码的时候切忌心态浮躁,急功近利. OC和C++ 都是在C的基础上加入面向对 ...

  8. python编写高质量代码_用 Python 编写干净、可测试、高质量的代码

    用 Python 编写干净.可测试.高质量的代码 Noah Gift 2010 年 12 月 20 日发布 简介 编写软件是人所承担的最复杂的任务之一.AWK 编程语言和 "K and R ...

  9. 荐书与免费送书:《编写高质量代码改善 Python 程序的 91 个建议》

    为了学习如何打理好微信公众号,Python猫我关注了好几个python技术公众号.然后发现这些同行们都在免费送资源,或者抽奖送书耶.于是,我也去参与抽奖,竟然侥幸抽中啦一本<Python数据科学 ...

最新文章

  1. 虚拟机管理你的服务器,全面解析VMware的虚拟机管理解决方案
  2. 【ssh从零单排】关于HTTP Status 404的debug问题
  3. docker离线包相关脚本编写示例:docker镜像load/push/save脚本
  4. 对称二叉树Python解法
  5. 计算机专业会议评级,2018计算机专业工程教育认证研讨会
  6. 京泉华:与小米生态链公司已在智能家居领域等展开相关业务合作
  7. 字节流Stream(Output 、Input)、字符流(Reader、Writer)
  8. 背包九讲----整理+例题
  9. native2ascii转译HTML字符,native2ascii转字符
  10. Bing必应搜索引擎打开新标签默认页的修改
  11. Python爬虫之小猪短租房
  12. word2019如何删除段落文字带颜色的背景
  13. 基于Python的jieba分词和词云展示
  14. Linux 中复制问题,错误显示 cp:omitting directory
  15. 直播系统开发:宋祖儿直播自曝“抠脚妹”
  16. 相机测试软件,相机篇 软件检测其实意义不大_佳能数码相机_数码影像评测-中关村在线...
  17. MySQL中针对SQL语句优化
  18. 人工智能在教育中的应用场景
  19. miniblink获取html文档,五、【miniblink】直接注册js可以调用的原生函数
  20. vue element 日期范围选择器限制只能选今天之前的时间,或者只能选今天之后的时间

热门文章

  1. 自动给神经网络找bug,Google发布TensorFuzz
  2. 自定义exchange由IMF导致的NDR信息
  3. php扩展模块作用及中文注释
  4. 安卓Android Support Design Library——Snackbar
  5. Postman下一个接口要用到上一个接口的数据
  6. 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、并且——queryset对象序列化...
  7. 老徐FrankXuLei受邀为花旗银行讲授《微软WCF服务分布式开发与SOA架构设计课程》...
  8. python备份数据库
  9. 说明书 Cisco wrv210
  10. Web十大安全隐患之XSS跨站脚本