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

Rya*_*yan 223 html css vertical-alignment

我使用以下方法在css中创建垂直对齐方式

.base{
        background-color:green;
	    width:200px;
	    height:200px;
	    overflow:auto;
	    position:relative;
	}

    .vert-align{
		padding-top:50%;
		height:50%;
	}
Run Code Online (Sandbox Code Playgroud)

并使用以下div结构.

<!-- and used the following div structure. -->

    <div class="base">
       <div class="vert-align">
    	   Content Here
       </div>
    </div>
Run Code Online (Sandbox Code Playgroud)

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

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

Cam*_*tin 212

的修复程序是肯定的,垂直填充和余量是相对于宽度,但topbottom 不是.

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

  • 也可以添加一个设置百分比高度的'spacer'div.看起来很脏,但它的工作原理.见[这个答案](/sf/ask/439969561/ 6285557#6285557). (4认同)
  • `top`非常适合根据浏览器/窗口高度调整大小.那个div下面有一个div怎么样?你如何能够"清除"第二个div在一个被顶部向下移动的div下面:50%`?? (3认同)
  • 永无止境的@%!^?为什么垂直边距和填充相对于* width *?什么?为什么要做出这个决定? (2认同)

use*_*ser 33

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

<div id="outer">
    <div id="inner">
        content
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

第一种选择:使用伪元素,这里垂直和水平间距都相对于外部.演示

#outer::before, #outer::after {
    display: block;
    content: "";
    height: 10%;
}
#inner {
    height: 80%;
    margin-left: 10%;
    margin-right: 10%;
}
Run Code Online (Sandbox Code Playgroud)

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

#outer {
    padding-left: 10%;
    padding-right: 10%;
}
Run Code Online (Sandbox Code Playgroud)

第二种选择:使用绝对定位.演示

#outer {
    position: relative;
}
#inner {
    position: absolute;
    left: 10%;
    right: 10%;
    top: 10%;
    bottom: 10%;
}
Run Code Online (Sandbox Code Playgroud)


wil*_*ler 31

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

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

<div class="centerme">middle</div>
Run Code Online (Sandbox Code Playgroud)

  • 这是因为它不是针对原始问题量身定制的答案,这是一个有用的技巧,仅适用于少数相关案例. (3认同)
  • 使用“vh”几乎与百分比相同......在某些情况下甚至更糟。这个答案与问题无关 (2认同)

ala*_*ain 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%);
}
Run Code Online (Sandbox Code Playgroud)
    <div class="base">
        <div class="vert-align">
            Content Here
        </div>
    </div>
Run Code Online (Sandbox Code Playgroud)

还有另一种使用柔性盒的解决方案.

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

你会发现两者的优点/缺点.

  • 使用平移是相对于元素自身大小垂直移动元素的唯一真正方法。 (2认同)

Jam*_*s T 8

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

规范

. . . margin 和 padding 属性的百分比,在 CSS2.1 中总是根据包含块的宽度计算,在 CSS3 中是根据包含块的行内大小计算的。

内联大小的定义:

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

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

.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;
}
Run Code Online (Sandbox Code Playgroud)
<div class="resize">
  <div class="outer">
    <div class="middle">
      <div class="inner"></div>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

在您希望元素的纵横比保持不变,但希望其大小与高度而不是宽度相关联的情况下,使用垂直书写模式特别有用。