如何将边距或填充设置为父容器高度的百分比?

时间:2011-02-13 04:49:31

标签: html css vertical-alignment

我使用以下

在css中创建垂直对齐方式
.base{
    background-color:green;
    width:200px;
    height:200px;
    overflow:auto;
    position:relative;
}

.vert-align{
    padding-top:50%;
    height:50%;
}

并使用以下div结构。

<div class="base">
   <div class="vert-align">
       Content Here
   </div>
</div>

虽然这似乎适用于这种情况,但我感到惊讶的是,当我增加或减少我的基础div的宽度时,垂直对齐会突然。我期待当我设置padding-top属性时,它将填充占父容器高度的百分比,这在我们的情况下是基数,但是上面的50%的值是以百分比计算的。宽度。 :(

有没有办法将填充和/或边距设置为高度的百分比,而无需使用JavaScript?

8 个答案:

答案 0 :(得分:205)

修复是的,垂直填充和边距是相对宽度的,但topbottom 不是。

所以只需将div放在另一个div中,并在内部div中使用类似top:50%的内容(如果它仍然不起作用,请记住position事项)

答案 1 :(得分:31)

以下是模拟所需行为的两个选项。不是一般解决方案,但在某些情况下可能有所帮助。这里的垂直间距是根据外部元素的大小而不是它的父元素计算的,但是这个大小本身可以相对于父元素,这样间距也是相对的。

<div id="outer">
    <div id="inner">
        content
    </div>
</div>

第一个选项:使用伪元素,这里垂直和水平间距都是相对于外部的。 Demo

#outer::before, #outer::after {
    display: block;
    content: "";
    height: 10%;
}
#inner {
    height: 80%;
    margin-left: 10%;
    margin-right: 10%;
}

将水平间距移动到外部元素使其相对于外部的父级。 Demo

#outer {
    padding-left: 10%;
    padding-right: 10%;
}

第二个选项:使用绝对定位。 Demo

#outer {
    position: relative;
}
#inner {
    position: absolute;
    left: 10%;
    right: 10%;
    top: 10%;
    bottom: 10%;
}

答案 2 :(得分:30)

回答略有不同的问题:您可以使用vh单位将元素填充到视口的中心:

.centerme {
    margin-top: 50vh;
    background: red;
}

<div class="centerme">middle</div>

答案 3 :(得分:10)

要使子元素绝对位于其父元素,您需要设置父元素的相对位置和子元素的绝对位置。

然后在子元素'top'上相对于父元素的高度。所以你还需要向孩子“翻译”50%的高度。

.base{
    background-color: green;
    width: 200px;
    height: 200px;
    overflow: auto;
    position: relative;
}
    
.vert-align {
    position: absolute;
    top: 50%;
    transform: translate(0, -50%);
}
    <div class="base">
        <div class="vert-align">
            Content Here
        </div>
    </div>

还有另一种使用弹性盒的解决方案。

.base{
    background-color:green;
    width: 200px;
    height: 200px;
    overflow: auto;
    display: flex;
    align-items: center;
}
<div class="base">
    <div class="vert-align">
        Content Here
    </div>
</div>

你会发现两者的优点/不足。

答案 4 :(得分:3)

将一行文字居中的其他方法是:

.parent{
  position: relative;
}

.child{
   position: absolute;
   top: 50%;
   line-height: 0;
}

或只是

.parent{
  overflow: hidden; /* if this ins't here the parent will adopt the 50% margin of the child */
}

.child{
   margin-top: 50%;
   line-height: 0;
}

答案 5 :(得分:2)

这可以通过writing-mode属性来实现。如果将元素的writing-mode设置为垂直书写模式(例如vertical-lr),则元素的后代在两个维度上的填充和边距百分比值将相对于高度而不是宽度。

来自spec

  

。 。 。在CSS2.1中始终根据包含块的宽度计算的边距和填充属性百分比是在CSS3中相对于包含块的内联大小计算的。

inline size的定义:

  

内联尺寸的度量:是指水平书写模式下的物理宽度(水平尺寸),以及垂直书写模式下的物理高度(垂直尺寸)。

例如,对于一个可调整大小的元素,其中水平边距相对于宽度,垂直边距相对于高度。

.resize {
  width: 400px;
  height: 200px;
  resize: both;
  overflow: hidden;
}

.outer {
  height: 100%;
  background-color: red;
}

.middle {
  writing-mode: vertical-lr;
  margin: 0 10%;
  width: 80%;
  height: 100%;
  background-color: yellow;
}

.inner {
  writing-mode: horizontal-tb;
  margin: 10% 0;
  width: 100%;
  height: 80%;
  background-color: blue;
}
<div class="resize">
  <div class="outer">
    <div class="middle">
      <div class="inner"></div>
    </div>
  </div>
</div>

在您希望元素的长宽比保持恒定,但希望其大小与高度而不是宽度成比例的情况下,使用垂直书写模式特别有用。

答案 6 :(得分:1)

50%的衬垫不会让您的孩子居中,它会将它放在中心下方。我认为你真的想要25%的填充率。也许你的内容越来越高,你的空间已经用完了?您是否尝试过设置margin-top而不是padding-top?

编辑:没关系,w3schools网站说

  

%指定填充元素宽度百分比的填充

所以也许它总是使用宽度?我从来没有注意到。

您正在做的事情可以通过display:table来实现(至少对于现代浏览器而言)。 The technique is explained here

答案 7 :(得分:0)

这是一个非常有趣的错误。 (在我看来,无论如何这都是一个错误)很好找!

关于如何设置它,我会推荐Camilo Martin的答案。但至于为什么,如果你们不介意的话,我想解释一下。

the CSS specs我找到了:

  

<强> '填充'
  百分比:指的是包含块的宽度

......这很奇怪,但还可以。

因此,对于父width: 210px和孩子padding-top: 50%,我得到padding-top: 96.5px的计算/计算值 - 这不是预期的105px

这是因为在Windows中(我不确定其他操作系统),常见滚动条的大小默认为17px × 100%(或水平条为100% × 17px)。那些17px在计算50%之前被减去,因此50% of 193px = 96.5px