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

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,带来了副作用。

转载于:https://www.cnblogs.com/axl234/p/3867347.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET遗留应用改造——性能优化篇

由于各种原因我们总是要与公司各种老项目打交道。天有不测风云&#xff0c;谁也不知道这坨屎山会从哪个方向把你的嘴塞的满满的&#xff0c;还不让你吐出来。既然如此...那只能细嚼慢咽的吞下去吧。说实在话&#xff0c;只要业务不死&#xff0c;那些老大伯项目就还有价值。更何…

《杀死一只知更鸟》读后感

今天我看完了这本书&#xff0c;从中我学到真正的勇敢不是一个人手握枪支&#xff0c;是当你还未开始就已知道自己会输&#xff0c;可你依然要去做&#xff0c;而且无论如何都要把它坚持到底。以前我总认为一个人敢动手就是勇敢&#xff0c;我发现我错了&#xff0c;我需要慢慢…

华为西安工业大学鸿蒙,培养百位将领、19位院士,这所211大学被誉为“华为人的母校”...

在社会上&#xff0c;985工程重点大学认可度是普遍要比211工程大学高的&#xff0c;并且985工程大学实力也比较强。但比较例外的是&#xff0c;华为这个让国人骄傲的企业&#xff0c;对一个211工程大学青睐程度却超过了绝大部分985工程大学&#xff0c;这所211大学甚至还被誉为…

Android Studio之Instant Run requires ‘Tools | Android | Enable ADB integration‘ to be enabled解决办法

1、问题 Android studio运行项目时候出现这个提示 Instant Run requires Tools | Android | Enable ADB integration to be enabled 2、原因 由于新版本中的Instant Run &#xff08;即时运行&#xff09;引起的 官方介绍 即使运行 https://developer.android.com/studio/r…

C# 11 预览,又增加了实用的语法糖

文 | 罗奇奇出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;.NET 首席项目经理凯瑟琳在博客中介绍了 C# 11 的一些预览性新功能&#xff0c;这些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中体验&#xff0c;下面摘录一部分新特性作介绍&#…

css 中图片旋转,倾斜,位移,平滑

在开发中&#xff0c;我们常常需要对图片有一些绚丽的效果&#xff0c;比如是图片旋转&#xff0c;平移&#xff0c;倾斜等。其实这些在css3中都已经存在&#xff0c;整理下作为demo&#xff0c;以后参考使用&#xff0c;也希望供大家交流学习。如果不足&#xff0c;多多指导。…

java程序

This XML file does not appear to have any style information associated with it. The document tree is shown below.博客园_首页代码改变世界uuid:5de59c50-a92f-4447-96ed-ab86451ed183;id61182014-07-27T11:59:08Zfeed.cnblogs.comhttp://www.cnblogs.com/jianyus/p/386…

android 网卡监听,Android实时监听网络的变化

4中情况。1.无网 2.wifi 3.移动信号 4.网线BroadcastReceiver netReceiver new BroadcastReceiver(){Overridepublic void onReceive(Context context, Intent intent) {String action intent.getAction();if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {Con…

深入理解加密、解密、数字签名(签名证书、加密证书)的组成和数字证书

深入理解加密、解密、数字签名和数字证书 随着电子商务的迅速发展&#xff0c;信息安全已成为焦点问题之一&#xff0c;尤其是网上支付和网络银行对信息安全的要求显得更为突出。为了能在因特网上开展安全的电子商务活动&#xff0c;公开密钥基础设施&#xff08; PKI, Public …

使用Blazor做个简单的时间戳在线转换工具

时间戳转换时间戳转换&#xff0c;关键点在于双向绑定bind-Value&#xff0c;就简单贴源码吧TimestampTool.razorpage "/timestamp" using BlazorComponent.I18n layout PublicLayout<PageTitle>T("TimestampToolTitle")</PageTitle><h2 st…

转载:Pixhawk源码笔记一:APM代码基本结构

转自 新浪微博WalkAnt 基础知识 详细参考&#xff1a;http://dev.ardupilot.com/wiki/learning-the-ardupilot-codebase/ 第一部分&#xff1a;介绍 详细参考&#xff1a;http://dev.ardupilot.com/wiki/learning-ardupilot-introduction/ ArduPilot 代码分为5个主要部分&…

html页面阴影怎么做,html – 做弯曲阴影的最佳方式

您将使用伪元素和box-shadow属性来执行此操作.我在这里为你做了一个例子&#xff1a;http://jsfiddle.net/joshnh/NWnXw/这在IE9及以上工作./* Shadow */.shadow {box-shadow: 0 1px 5px hsla(0,0%,0%,.25),inset 0 0 50px hsla(0,0%,0%,.05);position: relative;}.shadow:afte…

nginx+tomcat8+memcached实现session共享具体操作

本次试验用到的软件包的版本如下&#xff1a;一、针对10.43.2.134的操作1.安装jdk环境tar zxf jdk-8u5-linux-x64.tar.gz mkdir /usr/javamv jdk1.8.0_05/ /usr/java/编辑/etc/profile在文档的末尾追加如下5行内容&#xff1a;JAVA_HOME/usr/java/jdk1.8.0_05JRE_HOME/usr/java…

Android之解决Base64 encode中文乱码问题

1、问题 需求需要&#xff0c;把字符串转化为UTF-8编码之后需要base64.encode处理&#xff0c;但是我写了 String ss new String(value.getbytes("UTF-8"), "UTF-8");Base64.encode(ss); 死活出不来&#xff0c;依然乱码&#xff0c;然后写了检测当前编码…

.NET6之MiniAPI(十九):NLog

在本系例文章的第八篇中&#xff0c;我们聊过官方的日志实现&#xff0c;即《.NET6之MiniAPI(八)&#xff1a;日志》。但官方的日志功能更多是提供了一个实现基础&#xff0c;对于要求一个灵活&#xff0c;强大&#xff0c;方便的日志体系&#xff0c;官方的还是有差距的&#…

mysql-proxy

yum -y install mysql-proxy#mysql-proxy?--daemon?--log-leveldebug?--log-file/var/log/mysql-proxy.log?-P?10.254.157.xxx:3310(本机内网IP,端口自己随意设置)?--proxy-backend-addresses10.137.192.xxx:3306&#xff08;rds内网IP&#xff09; 您看下这几个步骤 是…

字符串倒序

#include "stdafx.h" #include <stdio.h>#include "t11.h" #include <string.h> #include <stdlib.h>//以下代码是把一个字符串倒序 int t11() {char* src "1234567890";int len strlen(src);char* dest (char*)malloc(len…

html地区三级联下拉列表,JS-三级联下拉列表

/p>var types"家电,服饰,家具,日用";var types_str1"电视机,洗衣机,电冰箱,空调|外套,衬衣,大衣,裤子|书桌,书柜,饭桌,衣柜|清洁,洗发,纸品,厨房";var types_str2"索尼,海信,康佳,飞利浦^海尔,LG,三星^海尔,飞利浦,韩电^格力,美的,海尔,长虹"…

Android ndk之Check that/ndk/openssl/crypto/libsfk.so exists or that its path is corret

1、问题 编译ndk里面的子模块的时候出现这个错误 Android ndk Check that/ndk/openssl/crypto/libsfk.so exists or that its path is corret 2、解决办法 是因为编译模块依赖libsfk.so这个文件&#xff0c;所以把这个文件拷贝到这个编译的模块就可以执行 ndk-build succe…

完美:C# Blazor中显示Markdown并添加代码高亮

昨天发了一篇介绍这个库&#xff1a;C# Blazor中显示Markdown文件&#xff0c;介绍怎么在Blazor中显示Markdown内容的文章&#xff0c;文章内的代码是没有高亮的&#xff0c;思来相去&#xff0c;还是要做好&#xff0c;于是百度到这篇文章.NET C# Blazor 服务端渲染Markdown&a…