css实现垂直居中的方法总结(很详细滴)

news/2024/5/19 17:40:46 标签: css, flex, 垂直水平居中

未知宽高元素的垂直水平居中

第一种方法:组合使用display:table-cell和vertical-align、text-align,使父元素内的所有行内元素水平垂直居中(内部div设置display:inline-block即可)这在子元素不确定宽度和高度时,特别适用哦

咳咳,敲黑板划重点啦:

与其他一些display属性类似,table-cell同样会被其他一些css属性破坏,例如float,position:absolute,所以在使用display:table-cell时,尽量不要使用float或者position:absolute(可以考虑为之增加一个父div定义float等属性。);设置了table-cell的元素对宽度和高度敏感(在父元素上设置table-row等属性,也会使其不感知height。),对margin值无反应,响应padding属性

嗯,下面是例子

    <style>
       .father{width:400px; height:200px; border:1px solid #000;display:table-cell; text-align:center;vertical-align:middle;}
        .son{width:200px; height:100px; background:red;display:inline-block;}
    </style>

<div class="father">
    <div class="son">
       display:table-cell;</br>text-align:center;</br> vertical-align:middle
    </div>
</div>

对table-cell元素设置百分比(如100%)的宽高值是无效的,但是可以将元素设置display:table,再将父元素设置百分比跨高,子元素table-cell会自动撑满父元素。这就可以做相对于整个页面的水平垂直居中。嗯,看下面的代码

    <style>
        html,body{height:100%; margin:0;padding:0;}
        #box{display:table; width:100%;height:100%;}
       .father{width:400px; height:200px; border:1px solid #000;display:table-cell; text-align:center;vertical-align:middle;}
        .son{width:200px; height:100px; background:red;display:inline-block;}
    </style>
<div id="box">
    <div class="father">
        <div class="son">
            display:table-cell;</br>text-align:center;</br> vertical-align:middle
        </div>
    </div>
</div>

 

 

第二种方法:display:flex-box

 

Flexbox(伸缩盒)是CSS3中新增的特性,利用这个属性可以解决页面中的居中问题。只需要3行代码就可以实现,不需要设置元素的尺寸,能够自适应页面。

这个方法只能在现代浏览器上有效,IE10+、chrome、Safari、Firefox。例如:

   <style>
       .father{width:400px; height:200px; border:1px solid #000;display:flex; align-items:center;justify-content:center;}
        .son{width:200px; height:100px; background:red;}
    </style>
    <div class="father">
        <div class="son">
            display:flex;</br>align-items:center;</br> justify-content:center;
        </div>
    </div>

敲黑板喽,敲黑板喽

1.设置container的display的类型为flex,激活为flexbox模式。

2.justify-content定义水平方向的元素位置

3.align-items定义垂直方向的元素位置

 

第三种方法:display:inline-block +伪元素生成content内容

 

 

 

实现原理:原理:利用inline-block的vertical-align: middle去对齐before伪元素,before伪元素的高度与父对象一样,就实现了高度方向的对齐。居中块的尺寸可以做包裹性、自适应内容,兼容性也相当好。缺点是水平居中需要考虑inline-block间隔中的留白(代码换行符遗留问题。)。(宽度是已知的,高度可以是未知的)

    <style>
       .father{width:400px; height:200px; border:1px solid #000;text-align:center;}
       .father:before{content:".";display:inline-block; vertical-align:middle; height:100%;}
        .son{width:200px; height:100px; background:red;display:inline-block; vertical-align:middle;}
    </style>
</head>
<body>

    <div class="father">
        <div class="son">
            display:inline-block;</br>伪元素生成content内容</br>
        </div>
    </div>

咳咳,同学,敲黑板提问了,什么是伪元素?

 

“伪元素”,顾名思义。它创建了一个虚假的元素,并插入到目标元素内容之前或之后。

 

:before 和 :after 伪元素编码非常简单(和大多数的css属性一样不需要一大堆的前缀)。这里是一个简单的例子。
 

#example:before {   
  content: "#";   
}   
    
#example:after {   
  content: ".";   
}  

这个例子中提到了两件事情,第一,我们用#example:before和#example:after来目标锁定相同的元素.严格的说,在代码中他们是伪元素。

第二,在内容模块中提到,伪元素如果没有设置“content”属性,伪元素是无用的。

嗯,先补充这一点小知识,后面我会找时间把伪元素的知识详细的总结一下的

 

 

第四种方法:绝对定位+transform反向偏移。position:absolute; transform:translate(-50%,-50%);

原理很简单:由于top、left偏移了父对象的50%宽度高度,所以需要利用transform反向偏移居中块的50%宽高

嘿嘿,敲黑板了:transform的计算基准是元素本身,所以这里可以用50%来做反向偏移

    <style>
       .father{width:400px; height:200px; border:1px solid #000;position:relative;}

        .son{width:200px; height:100px; background:red;position:absolute; left:50%; top:50%;transform:translate(-50%,-50%);}
    </style>

    <div class="father">
        <div class="son">
            position:absolute;</br>left:50%;top:50%;</br>transform
        </div>
    </div>

 

 

 

已知宽度和高度的水平垂直居中

第五种方法:绝对定位+margin:auto(position:absolute; left:0; top:0; right:0; bottom:0; margin:auto)都要写哦,缺一不可滴

 

下面先看一下例子

    <style>
        .father{width:400px; height:200px; position:relative; border:1px solid #000;}
        .son{width:200px; height:100px; background:red; position:absolute; left:0; top:0; bottom:0; right:0; margin:auto;}
    </style>

<div class="father">
    <div class="son">
        position:absolute;</br> left:0; top:0;</br> right:0; bottom:0; </br>margin:auto
    </div>
</div>

 

下面是效果图

 

解释一下为什么要把几个定位方向值都要写了(其实本来我也不懂,是看了张鑫旭的博客后才恍然大悟的,下面是他的解释)

当一个绝对定位元素,其对立定位方向属性同时有具体定位数值的时候,流体特性就发生了。

具有流体特性绝对定位元素的margin:auto的填充规则和普通流体元素一模一样:

  1. 如果一侧定值,一侧autoauto为剩余空间大小;
  2. 如果两侧均是auto, 则平分剩余空间;

例如,下面的CSS代码:

.father {
    width: 300px; height:150px;
    position: relative;
}
.son { 
    position: absolute; 
    top: 0; right: 0; bottom: 0; left: 0;
}

此时.son这个元素的尺寸表现为“格式化宽度和格式化高度”,和<div>的“正常流宽度”一样,同属于外部尺寸,也就是尺寸自动填充父级元素的可用尺寸的,然后,此时我们给.son设置尺寸,例如:

.son { 
    position: absolute; 
    top: 0; right: 0; bottom: 0; left: 0;
    width: 200px; height: 100px;
}

此时宽高被限制,原本应该填充的空间就被多余了出来,这多余的空间就是margin:auto计算的空间,因此,如果这时候,我们再设置一个margin:auto,那么:

.son { 
    position: absolute; 
    top: 0; right: 0; bottom: 0; left: 0;
    width: 200px; height: 100px;
    margin: auto;
}

我们这个.son元素就水平和垂直方向同时居中了。因为,auto正好把上下左右剩余空间全部等分了,自然就居中啦!

第六种方法:绝对定位+margin反向偏移

position:absolute; top:50%; left:50%; margin-left:-(width+padding)/2+'px'; margin-top:-(height+padding)/2+'px';

咳咳,敲黑板划重点了:margin值的设置不能使用百分比哦,因为margin是基于父元素的宽度来计算百分比的

这个原理和上面的方案4很相似,由于top、left偏移了父对象的50%宽度高度,所以需要利用margin反向偏移居中块的50%宽高

    <style>
        .father{width:400px; height:200px; position:relative; border:1px solid #000;}
        .son{width:200px; height:100px; background:red; position:absolute; left:50%; top:50%;  margin-left:-100px; margin-top:-50px;}
    </style>

<div class="father">
    <div class="son">
        position:absolute;</br>  left:50%; top:50%;</br>margin-left/top
    </div>
</div>

咳咳,敲黑板啦,下课,哈哈

 

 


http://www.niftyadmin.cn/n/952135.html

相关文章

数据库连接方式ODBC与OLE DB的区别

2007-03-06 22:19ODBC(开放数据库互连):是Microsoft引进的一种早期数据库接口技术。它实际上是ADO的前身。早期的数据库连接是非常困难的. 每个数据库的格式都不一样,开发者得对他们所开发的每种数据库的底层API有深刻的了解. 因此,能处理各种各样数据库的通用的API就应运而生了…

python判断两个字典的内容是否相等_Python 3 判断2个字典相同

下面先给大家介绍下Python 3 判断2个字典相同的方法&#xff0c;Python自带的数据结构dict非常好用&#xff0c;之前不知道怎么比较2个字典是否相同&#xff0c;做法是一个一个key比较过去。。。现在想到可以直接用进行判断&#xff01;&#xff01;&#xff01;a dict(one1, …

原生js实现去掉滚动条后的整屏切换(平滑过渡效果)

记得上学期实习的时候&#xff0c;想要用原生的js实现整屏切换&#xff08;平滑过渡&#xff09;的效果&#xff0c;百度了好久都没找到合适的方法&#xff0c;最后采用了很low的措施使用scrollTo();方法实现滚动鼠标到达想要的页面&#xff0c;之后也一直放不下这个问题&#…

.net编程创建 Access 文件和 Excel 文件

2005年1月12日 11:51 - (阅读:17071;评论:22) 一些系统可能需求把数据导出到Access或者Excel文件格式&#xff0c;以方便的传递数据、打印等。Excel 文件或者 Access这两种需要导出的文件可能并不是事先就存在的&#xff0c;这就需要我们自己编程生成他们&#xff0c;下面整理一…

python变量名可以包括的字符有_Python:使用变量名称占位符格式化字符串!

请考虑以下字符串构建语句&#xff1a;s"svn cp %s/%s/ %s/%s/" % (root_dir, trunk, root_dir, tag)使用4&#xff05;s会让人感到困惑,所以我更喜欢使用变量名&#xff1a;s"svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**SOME_DICTIONARY)当…

原生js实现鼠标在页面上滑动时,物体随着转动

嗯&#xff0c;就是鼠标在窗口移动的时候&#xff0c;方块随着鼠标所在的位置转动方向 这里主要运用到了Math.asin()方法&#xff0c;用这种方法求出的是弧度数 不难&#xff0c;所以直接上代码 <!DOCTYPE html> <html lang"en"> <head><meta c…

你真的会JavaScript吗

很久没有看到这样让人唇齿留香的好文了。上次看到的是一篇是 Douglas Crockford 的JavaScript, We Hardly new Ya (我简单翻译了一下&#xff0c;译文在后)。 同其他教你如何用面向对象的思想编写JavaScript的其他文章一样&#xff0c;该文也是着重在这么几个要素&#xff1a; …

python异步io读文件_python之异步IO

我们知道&#xff0c;CPU的速度远远快于磁盘、网络等IO。在一个线程中&#xff0c;CPU执行代码的速度极快&#xff0c;然而&#xff0c;一旦遇到IO操作&#xff0c;如读写文件、发送网络数据时&#xff0c;就需要等待IO操作完成&#xff0c;才能继续进行下一步操作。这种情况称…