元素居中

Posted 专注前端开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了元素居中相关的知识,希望对你有一定的参考价值。

一、css实现元素水平居中

margin:0 auto;

给元素设定宽度,而且不能加浮动,即可实现水平居中。左右边距自适应,div默认宽度最大化,加浮动后,div宽度最小化。

text-align:center;

 一般只能对图片,按钮,文字等行内元素(display为inline或inline-block)进行水平居中。在IE6、7中,它能对任何元素进行水平居中。

DOM结构
<div class="parent_div">css实现元素水平居中</div>

CSS样式 .parent_div { margin:auto; width: 600px; height: 300; text-align: center; border: 3px solid #f00; }

二、css实现元素垂直居中

1、单行文字垂直居中

如果一个容器中只有一行文字,对它实现居中相对比较简单,我们只需要设置它的实际高度height和所在行的高度line-height相等即可。

.parent_div {
    height: 25px;
    line-height: 25px;
    overflow: hidden;
    border: 3px solid #f00;
}

使用overflow:hidden的设置是为了防止内容超出容器或者产生自动换行,这样就达不到垂直居中效果了。

2、行内块级元素

.parent_div::after, .child_div{
  display:inline-block;
  vertical-align:middle;
}
.parent_div::after{
  content:‘‘;
  height:100%;
}

3、多行文本固定高度的垂直居中(模拟表格)

CSS中的vertical-align属性只会对拥有valign特性的(X)html标签起作用,但是在CSS中还有一个display属性能够模拟<table>,所以我们可以使用这个属性来让<div>模拟<table>就可以使用vertical-align了。注意,display:table和display:table-cell的使用方法,前者必须设置在父元素上,后者必须设置在子元素上,因此我们要为需要定位的文本再增加一个<div>元素。

.parent_div {
    display: table;
    height: 300px;
}
.child_div {
    display: table-cell;
    width: 600px;
    vertical-align: middle;
    border: 3px solid #f00;
}

Internet Explorer 6 并不能正确地理解display:table和display:table-cell,由此产生以下解决方案。

<div class="parent_div">
    <div class="child_div">
        <div class="child_child_div">
        css实现元素垂直居中
        </div>
    </div>
</div>
.parent_div {
    display: table;
    _position: relative;
    overflow: hidden;
    border: 3px solid #00f;
    width: 600px;
    height: 300px;
}
.parent_div .child_div {
    display: table-cell;
    vertical-align: middle;
    _position: absolute;
    _top: 50%;
}
.child_div .child_child_div {
    _position: relative;
    _top: -50%;
    border: 3px solid #f00;
}

4、多行文本不固定高度的垂直居中

.parent_div {
    padding:25px;  
    border: 3px solid #f00;
}

使上下的padding值相同即可,这种方法的优点就是它可以在任何浏览器上运行,并且代码很简单,只不过这种方法应用的前提就是容器的高度必须是可伸缩的。 

5、不固定宽高的垂直居中

<div class="parent_div">
    <div class="child_div">
    元素居中
    </div>
</div>
.parent_div {
    display: table;
    width: 100%;
    border: 3px solid #00f;
}
.parent_div .child_div {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    border: 3px solid #f00;
}

、css实现元素水平垂直居中

1、模拟表格

.parent_div {
    display: table-cell;
    width: 600px;
    height: 500px;
    vertical-align: middle;
    border: 3px solid #f00;
}
.child_div {
    margin: 0 auto;
    width: 200px;
    height: 200px;
    border: 3px solid #00f;
}

2、模拟表格,改良版

<div class="parent_div">
    <div class="child_div">
        <div class="child_child_div">
        css实现元素水平垂直居中
        </div>
    </div>
</div>
.parent_div {
    display: table;
    border: 3px solid #f00;
    width: 600px;
    height: 300px;
}
.parent_div .child_div {
    display: table-cell;
    vertical-align: middle;
    border: 3px solid #00f;
    width: 400px;
    height: 200px;
}
.child_div .child_child_div {
    margin: 0 auto;
    width: 50%;
    border: 3px solid #f00;
}

总之,这可能是最好的居中实现方法,优点是内容块高度会随着实际内容的高度变化,浏览器兼容性也好。缺点是需要大量额外的标记,需要三层元素让最内层的元素居中。

如果你使用表格布局,那完全不用为各种居中问题而烦恼了,只要用到td(也可能会用到 th)元素的 align="center" 以及 valign="middle" 这两个属性就可以完美的处理它里面内容的水平和垂直居中问题了,因为表格默认对它里面的内容进行垂直居中。如果想在css中控制表格内容的居中,垂直居中可以使用 vertical-align:middle,至于水平居中,貌似css中没有相对应的属性,但是在IE6、7中,我们可以用text-align:center对表格里的元素进行水平居中,IE8+以及谷歌、火狐等浏览器的text-align:center只对行内元素起作用,对块状元素无效。在IE6、7中,可以通过css的text-algin来控制表格内容的水平方向的对齐,无论内容是行内元素还是块状元素都有效,但在IE8+以及chrome、firefox等浏览器中,text-align:center对块状元素无效,只能用表格自有的align属性。

3、行内块元素Inline-Block

基本思想是使用display: inline-block, vertical-align: middle和一个伪元素让内容块处于容器中央,下面用after,也可以用before。

如果内容块宽度大于容器宽度,比如放了一个很长的文本,但内容块宽度设置最大不能超过容器的100%减去0.25em,否则使用伪元素:after内容块会被挤到容器顶部,使用:before内容块会向下偏移100%。

如果你的内容块需要占据尽可能多的水平空间,可以使用max-width: 99%;(针对较大的容器)或max-width: calc(100% -0.25em)(取决于支持的浏览器和容器宽度)。

.parent_div {
    text-align: center;
    overflow: auto;
    border: 3px solid #00f;
}
.parent_div:after, .parent_div .child_div {
    display: inline-block;
    vertical-align: middle;
}
.parent_div:after {
    content: ‘‘;
    height: 100%;
    margin-left: -0.25em; /* To offset spacing. May vary by font */
}
.parent_div .child_div {
    max-width: 99%; /* Prevents issues with long content causes the content block to be pushed to the top */
    border: 3px solid #f00;  /* max-width: calc(100% - 0.25em) /* Only for IE9+ */
}

这种方法的优劣和单元格Table-Cell方式差不多,起初我把这种方式忽略掉了,因为这确实是一种hack方法。不过,无论如何,这是很流行的一种用法,浏览器支持的也很好。

优点:

  • 高度可变
  • 内容溢出会将父元素撑开。
  • 支持跨浏览器,也适应于IE7

缺点:

  • 需要一个容器
  • 水平居中依赖于margin-left: -0.25em;该尺寸对于不同的字体/字号需要调整
  • 内容块宽度不能超过容器的100% - 0.25em

4、margin固定宽高居中

.parent_div {
    margin: auto;
    width: 600px;
    height: 500px;
    border: 3px solid #f00;
}
.child_div {
    margin: 150px 200px;
    width: 200px;
    height: 200px;
    border: 3px solid #00f;
}

这种定位方法纯粹是靠宽高和margin拼出来的,不是很灵活。

5、绝对居中Absolute Centering

.parent_div {
    position: relative;
    margin: auto;
    width: 600px;
    height: 300px;
    border: 3px solid #f00;
}
.child_div {
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    margin: auto;
    width: 200px;
    height: 200px;
    border: 3px solid #00f;
}

优点:

  • 支持跨浏览器,包括IE8-IE10
  • 无需其他特殊标记,CSS代码量少
  • 支持百分比%属性值和min-/max-属性
  • 只用一个类即可实现任何内容块居中
  • 不论是否设置padding都可居中(在不使用box-sizing属性的前提下)
  • 内容块可以被重绘
  • 完美支持图片居中

缺点:

  • 必须声明高度(查看可变高度Variable Height)
  • 建议设置overflow:auto来防止内容越界溢出(查看溢出Overflow)
  • 在Windows Phone设备上不起作用

浏览器兼容性:

Chrome,Firefox, Safari, Mobile Safari, IE8-10

6、不确定宽高,绝对定位百分数

.parent_div {
    position: relative;
    margin: auto;
    width: 600px;
    height: 500px;
    border: 3px solid #f00;
}
.child_div {
    position: absolute;
    left: 30%;
    right: 30%;
    top: 15%;
    bottom: 15%;
    border: 3px solid #00f;
}

 这种不确定宽高的居中,较为灵活。只需要保证left和right的百分数一样就可以实现水平居中,保证top和bottom的百分数一样就可以实现垂直居中。

7、负边距Negative Margins

.parent_div {
    position: relative;
    margin: auto;
    width: 600px;
    height: 300px;
    border: 3px solid #f00;
}
.child_div {
    position: absolute;
    left: 50%;
    top: 50%;
    margin: -100px -100px;
    width: 200px;
    height: 200px;
    border: 3px solid #00f;
}
Margin-left:-(width + padding)/2,不使用box-sizing: border-box时,如果有padding,要计算padding ,如果没有padding,就是-width/2;

Margin-top:-(height + padding)/2,不使用box-sizing: border-box时,如果有padding,要计算padding ,如果没有padding,就是-height/2;

这是唯一在IE6-IE7上也表现良好的方法。

优点:

  • 良好的跨浏览器特性,兼容IE6-IE7
  • 代码量少

缺点:

  • 不能自适应,不支持百分比尺寸和min-/max-属性设置
  • 内容可能溢出容器
  • 边距大小和padding与是否定义box-sizing: border-box有关,计算需要根据不同情况

8、弹性盒子Flexbox

.parent_div {
    display: -webkit-flex;
    display: flex;
    -webkit-align-items: center;
    align-items: center;
    -webkit-justify-content: center;
    justify-content: center;
    margin: auto;
    width: 600px;
    height: 500px;
    border: 3px solid #f00;
}
.child_div {
    width: 200px;
    height: 200px;
    border: 3px solid #00f;
}

这是CSS布局未来的趋势。Flexbox是CSS3新增属性,设计初衷是为了解决像垂直居中这样的常见布局问题。

优点:

  • 内容块的宽高任意,优雅的溢出
  • 可用于更复杂高级的布局技术中

缺点:

  • IE8/IE9不支持
  • Body需要特定的容器和CSS样式
  • 运行于现代浏览器上的代码需要浏览器厂商前缀
  • 表现上可能会有一些问题

9、变形Transform

.parent_div {
    position: relative;
    margin: auto;
    width: 600px;
    height: 500px;
    border: 3px solid #f00;
}
.child_div {
    position: relative;
    top: 50%;
    left: 50%;
    width: 200px;
    height: 200px;
    transform: translate(-50%, -50%);
    -webkit-transform: translate(-50%, -50%);
    -ms-transform: translate(-50%, -50%);
    -moz-transform: translate(-50%, -50%);
    border: 3px solid #00f;
}

内容块定义transform: translate(-50%,-50%)必须带上浏览器厂商的前缀。

10、弹层Transform

.parent_div {
    justify-content: center;
    /*子元素水平居中*/    
    align-items: center;
    /*子元素垂直居中*/
    display: -webkit-flex;
    border: 3px solid #00f;
}
.parent_div .child_div {
    position: fixed;
    top: 50%;
    left: 50%;
    width: 50%;
    max-width: 640px;
    min-width: 320px;
    height: auto;
    z-index: 2000;
    /*visibility: hidden;*/
    -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transform: translateX(-50%) translateY(-50%);
    -moz-transform: translateX(-50%) translateY(-50%);
    -ms-transform: translateX(-50%) translateY(-50%);
    transform: translateX(-50%) translateY(-50%);
    border: 3px solid #f00;
}

11、利用button做外容器,里边的块元素会自动垂直居中,只需要控制一下水平居中就可以达到效果。

<button class="parent_div">
    <div class="child_div">
    水平垂直居中
    </div>
</button>
.parent_div {
    margin:auto;
    width: 600px;
    height: 500px;
    border: 3px solid #f00;
}
.child_div {
    margin: 0 auto;
    width: 200px;
    height: 200px;
    border: 3px solid #00f;
}

 四、jquery实现元素水平垂直居中

$(function(){ 
    $(window).resize(); 
});
$(window).resize(function(){ 
    $(".div").css({ 
        position: "absolute", 
        left: ($(window).width() - $(".div").outerWidth())/2, 
        top: ($(window).height() - $(".div").outerHeight())/2 
    });        
});

五、css实现浮动元素的居中

设置容器的浮动方式为相对定位,确定容器的宽高,设置层的外边距。

 

以上是关于元素居中的主要内容,如果未能解决你的问题,请参考以下文章

很实用的JQuery代码片段(转)

css常用代码片段 (更新中)

片段中的布局不居中

是否可以使用 AndroidX 导航将片段中的操作栏标题居中?

在CSS中居中的代码是啥

C语言代码片段