当前位置: 首页 > 编程日记 > 正文

CSS中各种各样居中方法的总结

        在开发前端页面的时候,元素的居中是一个永远都绕不开的问题。看似简单的居中二字,其实蕴含着许许多多的情况,对应着很多的处理方法,本文就试图对页面布局中的居中问题进行总结~~


        居中问题分为水平居中和竖直居中两种;而根据所居中元素的不同,有内联元素居中和块级元素居中两种居中问题。下面开始分类整理:


一、内联元素的居中

        1、内联元素的水平居中:在父元素上设置text-align:center;

              (为了节省空间、突出重点,每个选择器中无关紧要的样式我都会全部写在第一行,从第二行开始是关键样式~ 下同)



        2、单行内联元素的竖直居中:设置内联元素的行高等于容器的高度



        3、多行内联元素的竖直居中:用具有块级属性的容器包裹起来,然后应用下方块级元素的相关方法。


二、块级元素的居中

        1、块级元素的水平居中:设置居中元素的margin属性: margin: 0 auto;



        2、高度固定的块级元素的竖直居中:相对于父元素进行绝对定位,设置top:50%;并设置margin属性为自身高度一半的负值:

              原理:设置了top:50%;之后,该元素的上边沿正好在父元素的中心上,此时让这个元素向上方移动自身高度的一半,就可以使这个元素的中心与父元素的中心重合,达到竖直居中的效果。此原理也可应用至水平居中的应用上。



        3、高度可变的块级元素的竖直居中:利用display:table-cell,利用表格中的竖直居中来实现。(此方法不兼容IE7及以下版本的浏览器)



        4、容器高度不固定元素的竖直居中: 手动设置内部元素的上下边距相等


三、块级内联元素的居中

        1、水平居中: 方法等同内联元素的水平居中方法

        2、竖直居中: 方法等同块级元素的竖直居中方法


四、各种不寻常的居中方法

        上面所述的都是面对那些分类情况中第一时间应当想到的寻常方法,在居中问题中还有很多原理不寻常的方法,下面尝试进行总结(有的方法上面已经有所应用)


        1、利用display:table-cell进行布局:

              我们都知道,表格中提供了非常方便的居中属性,在DIV+CSS布局还未到来的时代,居中对于前端人员来说(那时似乎也没有前端这个职位23333)并不是个问题。但是在web的新时代中,再使用table进行大布局就显得有些XXXX了。还好新版的CSS为我们提供了display:table-cell的选项,使得一个普通的div也可以表现的像一个表格单元格,从而可以通过直接设置text-align:center; vertival-align:middle;通杀一切居中的效果(块级元素水平居中需在块级元素上加margin: 0 auto;)。 这使得table-cell成为了新一个布局神器,然而因为兼容性问题,所以这个方法似乎还没有太大规模的使用。


        2、使用绝对定位+负边距的方法:

              这种方法的原理在前面“高度固定的块级元素的竖直居中”部分已经有介绍。在水平居中中同样可以使用,将相应属性换成水平方向的对应属性即可。这种方法的缺点在于,需要预先知道居中元素的宽高,不适用于宽高可变的元素。


        3、使用绝对定位+transform的方法:

              这种方法是对上方负边距方法的一个改进。一般来说,CSS中距离单位使用百分比时,都是根据父元素的宽高来计算的。而transform:translate()方法在使用百分比单位时,是以自身的宽高进行计算的,这就弥补了负边距方法中“必须预先获知元素宽高”这一缺陷了。


               当然,缺陷也很明显:translate是CSS3中的内容,并不兼容IE6、7、8。(手动冷漠脸)


        4、使用绝对定位+auto边距的方法:

              使居中元素相对于其父元素绝对定位,设置居中方向上的偏移值为0(两方向都要设置),然后设置居中方向上的margin值为auto(同样两个方向都要设置),即可实现居中。下图为水平竖直居中的例子。


               这种方法有两个负作用:1、居中元素的盒模型中margin部分会填充整个父容器,可能会影响同等级其他元素的布局。

                                                       2、不能用于高度可变元素。例如对一个高度可变的内容容器使用本方法,其高度会自动拉伸至100%,失去高度随内容自适应的性质。


        5、浮动元素的水平居中

              对于一群浮动元素的居中,可以使用以下办法:精确计算浮动元素的总宽度及边距,设置一个宽度等与此值的块级容器,使得浮动元素在此容器内浮动,而此容器相对原先的父容器水平居中。

              对于单个浮动元素的居中。。。。。。就剩一个元素了还浮动个毛线!


        6、一种非常奇怪的方法。。。使用font-size实现竖直居中

居然还能用这个??????

              这种方法仅仅在IE6和IE7中有效,可以看作对table-cell方法的补充。在高度固定的父元素中,设置font-size的值为高度除以1.14得到的值(手动十个尼克杨问号脸),子元素为内联或块级内联元素并设置vertical-align:middle,可以实现竖直居中。 

              下面是这个方法与table-cell方法的结合,使用了css hack,可以兼容所有浏览器。



        7、引入新的不可见元素实现居中

              这种方法的原理和上面提到的绝对定位系列方法是类似的。对于单个高度(宽度)固定的元素,可以在同级添加一个div,设置其高度为50%,并设置下边距为居中元素高度一半的负值(这里替换成上面给居中元素设置的负边距或者translate都可以),即可完成居中效果:



              当然,这里面的#another也可以通过伪元素实现:


              需要注意的是,使用此方法实现水平居中时,需要给两个子div和伪元素设置display:inline-block样式,否则块级元素自带的换行效果会使得这种方法失效。


        来做一个小的总结吧。在页面布局的时候,使用CSS进行居中操作,根据情况的不同,有着各种各样不同的方法。而这些各种各样的方法,也都有着各种各样的优劣,有的需要提前确定元素的宽高,有的存在兼容性问题。这就需要我们在开发的过程中,根据实际情况灵活选用方法,并加以自己的修改,方可实现各种居中~~上面这些方法已经足够应对大部分场景,如果遇到了更加奇妙的方法,我也会更新这篇博文与大家分享的~

转载于:https://www.cnblogs.com/zhuwq585/p/6075113.html

相关文章:

iOS 流式播放音频文件

方式一: https://github.com/tumtumtum/StreamingKit 方式二: https://github.com/AlexanderYeah/SK_PlayOnWavFileDemo

java 创建 HMAC 签名

ava 创建 HMAC 签名 psd素材 1. []ComputopTest.java package com.javaonly.hmac.test; import java.io.IOException; import java.security.InvalidKeyException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import …

2014年数字:我的人生在命令行中

by freeCodeCamp通过freeCodeCamp 2014年数字:我的人生在命令行中 (2014 in Numbers: My Life Behind the Command Line) For 2014, I decided to simplify my life. Rather than pursuing a variety of human experiences, as I had previously, I wanted to focu…

c# unity PlayerPrefs 游戏存档,直白点就是讲游戏数据本地保存下来

在游戏会话中储存和访问游戏存档。这个是持久化数据储存,比如保存游戏记录。 我的理解是通过某个特殊的标签来保存在本地,而且该标签为key的意思,初始值不用赋值。 在游戏开发中较为实用。 暂时用到了 SetInt(string key, int value); 还有Ge…

4-类和结构体和可选类型

import UIKit var str “Hello, playground” // 1 枚举语法 // 与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值 // 书写方式一 enum sizeType{ case small case middle case large } // 书写方式二 enum sizeNumber { case x,…

android处理url中的特殊字符

java处理url中的特殊字符(如&,%...) URL(Uniform Resoure Locator,统一资源定位器)是Internet中对资源进行统一定位和管理的标志。 一个完整的URL包括如下内容: 应用协议名称,包括http,ftp,file等标志 资源定位…

图的连通性和连通分量_英语,人口,连通性和露营地

图的连通性和连通分量by Evaristo Caraballo通过Evaristo Caraballo 英语,人口,连通性和露营地 (English, Population, Connectivity and Campsites) 在世界范围内推动使用Free Code Camp的因素 (Factors driving the use of Free Code Camp worldwide)…

jQuery源码分析系列:属性操作

属性操作 1.6.1相对1.5.x最大的改进,莫过于对属性.attr()的重写了。在1.6.1中,将.attr()一分为二: .attr()、.prop(),这是一个令人困惑的变更,也是一个破坏性的升级,会直接影响到无数的网站和项目升级到1.6…

HDU 5972 Regular Number(ShiftAnd+读入优化)

【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid5972 【题目大意】 给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串的长度为n,并且第i个字符需要在给定的字符集合Si中 【题解】 利用Sh…

把握机缘_机缘巧合,蒙太奇训练以及我的朋友如何使自己失业

把握机缘by Wiley Jones通过威利琼斯 机缘巧合,蒙太奇训练以及我的朋友如何使自己失业 (Serendipity, training montages, and how my friend automated himself out of a job) “No one person’s Hollywood success story has anything in common with anybody e…

Servlet(一)

BS架构的优势 1.数据库之负责数据库的管理 2.Web服务器负责业务逻辑的处理 3.浏览器提供操作界面 4.不需要单独安装客户端 5.开发相对于CS简单,客户端和服务器的通信模块都是使用标准的HTTP协议进行通信 CS架构 1.数据库作为Server,使用数据库特定的编程语言编写业务…

visual webgui theme designer

转载于:https://www.cnblogs.com/jintan/p/3804095.html

51单片机编码自学_这是9个月的自学式编码看起来像什么

51单片机编码自学by Stephen Mayeux斯蒂芬马约(Stephen Mayeux) 这是9个月的自学式编码看起来像什么 (Here’s What 9 Months of Self-Taught Coding Looks Like) 只是划伤表面 (Just Scratching the Surface) Today marks 9 months since I embarked on my journey as a self…

19.Remove Nth Node From End of List

方法1:由于链表不能随机访问,所以很自然的想法是第一遍得到链表长度,然后计算倒数第n个结点的位置,但这样时间复杂度O(n2),想到用空间换取时间,可以用一个地址数组存储每个结点的地址,然后直接删…

HTML 5中SEO可以用那些代码来做优化

头部代码 1、标题标签(title标签) 在HTML5中标题标签依然存在,其仍然具有不可替代的作用;不过我们看到还有更多的可供搜索引擎识别的代码,我们将改代码的等级微降。 2、元标签(meta标签) 字符集编码声明标签 该标签原本就是搜索引擎必看且首先要看的标签…

XCode 导入头文件不提示解决

File --> WorkSpace Settings ---> Build Sysytem ---> Legacy Build System

构建node.js基础镜像_在Android上构建Node.js应用程序

构建node.js基础镜像by Aurlien Giraud通过AurlienGiraud 在Android上构建Node.js应用程序-第1部分:Termux,Vim和Node.js (Building a Node.js application on Android - Part 1: Termux, Vim and Node.js) If you are excited about Node.js and own a…

MyEclipse设置默认的文档注释和背景色设置

转载于:https://www.cnblogs.com/999-/p/6086219.html

C语言之数组中你所不在意的重要知识

#include<stdio.h>void simpleArray();void main() {simpleArray();}//数组的简单操作 void simpleArray() {//数组的声明并赋值int c[5] { 1, 2, 3, 4, 5 };printf("\nC数组内存中占%d个字节",sizeof(c));// /0在内存中会占一个字节&#xff0c;可是仅仅针…

swift 4.0 创建tableview 自定义cell

// // ViewController.swift // AlamofileDemo // // Created by Alex on 2019/3/5. // Copyright © 2019 AlexanderYeah. All rights reserved. //import UIKit import Alamofire// 遵守协议方法 class ViewController: UIViewController,UITableViewDataSource,UITa…

ux体验网站 英国_?? 用户体验(UX)资源和工具的完整列表??

ux体验网站 英国by Jason Hreha杰森赫雷哈(Jason Hreha) ?? 用户体验(UX)资源和工具的完整列表?? (?? The Complete List of User Experience (UX) Resources & Tools ??) 超过100个链接&#xff0c;可以链接到最好的书籍&#xff0c;课程&#xff0c;新闻通讯和工…

Android 第三方图表类 MPChart 的使用

先看看条形图的的效果还不错是吧&#xff0c;实现这样的效果很合适呢&#xff01; 还有折线图、饼图很多效果 效果不错对吧~ 下面我们就先来看看条形图的实现方法吧&#xff01; 第一步&#xff1a; 引入第三方包 MPChart 如果你碰巧看过我之前写的Recycleview的博客这就简单多…

C++ STL的sort 函数 以及自定义的比较函数

没什么特别擅长的内容&#xff0c;先做个小笔记好了。在编程时&#xff0c;使用C的标准模板库&#xff08;STL&#xff09;能节约工作量&#xff0c;增加代码的可读性&#xff0c;能灵活运用无疑会提高编程的效率&#xff0c;俗话说&#xff1a;Write less, create more ~ 然后…

7-构造器方法

import UIKit// 1 构造器 // 结构体和类在实例的构造过程中会调用一种特殊的方法init&#xff0c;称之为构造器 // 构造器的主要作用是初始化存储属性 // 如果存储属性在构造器中没有初始化 在定义的时候也没有初始化 就会产生编译错误class Employee{let no:Int;var name:Stri…

模糊推理 控制 易于实现_代码“易于推理”是什么意思?

模糊推理 控制 易于实现by Preethi Kasireddy通过Preethi Kasireddy 代码“易于推理”是什么意思&#xff1f; (What does it mean when code is “easy to reason about”?) You’ve probably heard the expression “easy to reason about” enough times to make your ear…

简单介绍一下R中的几种统计分布及常用模型

统计学上分布有很多&#xff0c;在R中基本都有描述。因能力有限&#xff0c;我们就挑选几个常用的、比较重要的简单介绍一下每种分布的定义&#xff0c;公式&#xff0c;以及在&#xff32;中的展示。 统计分布每一种分布有四个函数&#xff1a;d――density&#xff08;密度函…

leetcode题解:Construct Binary Tree from Preorder and Inorder Traversal (根据前序和中序遍历构造二叉树)...

题目&#xff1a; Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. 说明&#xff1a; 1&#xff09;二叉树可空 2&#xff09;思路&#xff1a;a、根据前序遍历的特点, 知前序序列…

swift string,Int,Double相互转换

import UIKitvar str "Hello, playground" // 1 字符串转Int Double Float var str1 "818"; // 转Int var val1 Int(str1); // 转Double var val2 Double(str1); // 转float var val3 Float(str1);// 如果是25.0 转 Int&#xff0c;则需要先转为Doubl…

classlist使用方法_如何通过使用HTML5的classList API在没有jQuery的情况下操作类

classlist使用方法by Ayo Isaiah通过Ayo Isaiah 如何通过使用HTML5的classList API在没有jQuery的情况下操作类 (How to manipulate classes without jQuery by using HTML5s classList API) As a front end developer, you often need to change CSS rules based on how a us…

键盘码 ascii码

ASCII码表 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 96 、 1 SOH 33 &#xff01; 65 A 97 a 2 STX 34 ” 66 B 98 b 3 ETX 35 # 67 C 99 c 4 EOT 36 $ 68 D 100 d 5 ENQ 37 % 69 E 101 e 6 ACK 38 & 70 F 102 f 7 BEL …