父级元素以及子元素高度宽度未知如何实现水平垂直居中?

.child{
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);  /* 使用css3的transform来实现 */
}

这个方案在父级元素们没有设置position为relative的时候,相对于html是水平垂直居中的,但是如果父级元素指定position为relative,并且高度不定的时候,无法实现垂直居中。

我想实现这样的效果:
父级元素占浏览器宽50%,高100%,在浏览器左边,子元素在父元素中水平垂直居中。
图片描述

请问这样可以实现吗?

阅读 11.2k
5 个回答

先上图
图片描述

HTML

<body>
    <div id="parent">
        <div class="wrapper"><!-- 若使用position居中对齐,需要嵌套一层 -->
            <div id="child">
                子元素子元素子元素子元素子元素
           </div>
       </div>
    </div>
    <div id="main">
        正常文档流
    </div>  
</body>

CSS(请无视*选择符)

*{
    padding: 0;
    margin: 0;
}
#main{
    padding-left: 50%;
}
body{
    background: #faa;
    height: 1000px;
}
#parent{
    width: 50%;
    height: 100%;
    position: fixed;
    background: #cee;
    color: #fff;
}
#parent .wrapper{
    width: 100%;
    height: 100%;
    position: relative;
}
#child{
    width: 320px;
    height: 320px;
    background: #543;
    position: absolute;
    top: 50%;
    left: 50%;
    margin: -160px 0 0 -160px;/* 考虑兼容性,使用margin */
}

https://jsfiddle.net/w7c4pda2/

<!DOCTYPE html>  
<html>  
<head lang="en">  
    <meta charset="UTF-8">  
    <title></title>  
    <style>  
        .parent{  
            background-color: wheat; position:relative  
        }  
        .child{  
            transform: translateY(-50%); border:solid 1px red; display:inline-block; position: absolute; top:50%  
        }  
    </style>  
</head>  
<body>  
    <div class="parent" style="height:700px;">  
        <div  class="child" style="height:200px;width:300px; left:5%">  
        </div>  
        <div class="child" style="height:300px;width:300px; left:60%;">  
        </div>  
    </div>  
</body>  
</html> 

你试试就知道了
transform: translateY(-50%)是核心

css vertical-align:middle (块级元素支持)或者用table <td vertical="middle">

可以用<center> </center>来实现

另外还有个办法
position:fixed;left:50%;top:50%;margin-left:width/2;margin-top:height/2;
对于ie6,只能把position:改成absolute;

http://www.gaclib.net/Document.html#~/

我觉得你说的这个事情跟我这个网页是一样的。虽然我并不是50%,不过反正只是个数字。

chrome真是糟糕啊,在拖动边框的时候,总是一片黑。相反IE就没这种问题,一边拖动,里面的东西实时排版。

父元素没有

position:relative;

的时候,子元素

position:absolute;

定位的标准是整个屏幕;
父元素有

position:relative;

的时候,子元素

position:absolute;

定位的标准是父元素。
子元素有

position:fixed;

的时候,定位的标准总是浏览器窗口。‘

你要是想子元素总是在html垂直居中,就用fixed;
你要是想子元素在父元素垂直居中,就直接在父元素添加position:relative;子元素代码用你贴出来的代码就好;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题