13

免责声明:我不相信这是重复的,因为我使用相对大小来生成全屏网格布局而不使用px.

问题:在这个 jsFiddle http://jsfiddle.net/X3ZDy/73/中,我有四个等比例的盒子。它们旨在跨越屏幕宽度并保持方形。其中包含一些样本方形 DIV (40% x 40%)。我正在努力获得一个lbl水平和垂直居中的文本标签bbl

我见过(并尝试过)的所有示例都不起作用,因为它们要求我知道标签的高度,或者它们使用了浏览器限制的table-layout技巧。我需要按照小提琴对所有相对大小进行此操作。

有人可以帮忙吗?我需要使用纯 CSS(无 JS)解决方案在所有浏览器上工作。我很惊讶在 div 中垂直对齐文本似乎非常棘手。我不介意我们是否使用块或内联元素作为文本标签。

请注意,我不是在寻找 TABLE 解决方案,这是一个需要工作 jsFiddle 的 DIV 和 CSS 难题。

更多: 感谢大家的回答,但对于未来的海报,请注意 (width == padding-bottom) 是让我的 DIV 成为square的魔法。它是网格布局系统的关键,所以我需要维护它。

更新 使用相对尺寸和没有固定高度非常棘手,但我想我终于找到了问题的答案(如下)。

4

8 回答 8

17

我想我终于找到了解决问题的方法。问题是我见过的几乎所有其他解决方案都无法应对当孩子大小发生变化并且不知道任何高度时。我需要它来实现响应式所有 % 设计,其中任何地方都没有固定的高度。

我偶然发现了这个 SO 答案使用 CSS 3 垂直对齐,这是我的灵感。

垂直居中的文本

首先,使用全 % 设计,您需要一个零高度的包装元素作为父元素内的定位占位符;

<body>
<div class="container">
    <div class="divWrapper">
        <div class="tx">This text will center align no matter how many lines there are</div>
    </div>
</div>
</body>

在这种情况下,我的容器是一个简单的方块图块;

.container
{
    margin:2%;
    background-color:#888888;
    width:30%;
    padding-bottom:30%; /* relative size and position on page  */
    float: left;
    position:relative;  /* coord system stop */
    top: 0px; /* IE? */
}

所以没有什么特别的,除了它没有高度,这使得元素居中这个普遍问题变得棘手。它需要绝对定位,以便我们可以在子元素中使用定位坐标(我认为这可能需要 IE 中的“顶部”)。

接下来,绝对定位的包装器完全覆盖父元素并完全填充它。

.divWrapper
{
     position:absolute;
     top:0px;
     padding-top:50%; /* center the top of child elements vetically */
     padding-bottom:50%;
     height:0px;
}

填充意味着任何子元素都将从父元素的正中间开始,但是这个包装器本身没有高度并且不占用页面上的空间。

还没有什么新东西。

最后,我们要居中的子元素。这里的技巧是让子元素根据它自己的高度垂直向上滑动。你不能使用 50%,因为那是父容器的 50%,而不是我们自己。看似简单的答案是使用转换。我不敢相信我以前没有发现这一点;

.tx
{               
    position: relative;
    background-color: transparent;
    text-align: center; /* horizontal centering */

    -webkit-transform: translateY(-50%); /* child now centers itself relative to the  midline based on own contents */
    -moz-transform: translateY(-50%);
    -ms-transform: translateY(-50%);
    -ms-filter: 'progid:DXImageTransform.Microsoft.Matrix(M11=0.5, M12=0, M21=0, M22=0.5,  SizingMethod="auto expand")'; /*IE8 */
    filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.5, M12=0, M21=0, M22=0.5,  SizingMethod='auto expand'); /*IE6, IE7*/
    transform: translateY(-50%);    
}

这是小提琴

但是,我还没有在 IE6+ 上测试过这个,所以如果有人想验证我的矩阵转换,我会很感激的。

更新

事实证明,甚至不需要包装器。这就是正确垂直居中所需的全部内容;

.tx
{       
    width:100%;        // +1 to @RonM
    position: absolute;
    text-align: center;
    padding-top:100%;
    -webkit-transform: translateY(-50%); /* child now centers itself relative to the midline based on own contents */
    -moz-transform: translateY(-50%);
    -ms-transform: translateY(-50%);
    -o-transform: translateY(-50%);
    -ms-filter: 'progid:DXImageTransform.Microsoft.Matrix(Dx=0,Dy=0)'; /*IE8 */
    filter: progid:DXImageTransform.Microsoft.Matrix(Dx=0,Dy=0); /*IE6, IE7*/
    transform: translateY(-50%);    
}

和更新的小提琴

但仍然不能在 IE6 中工作 - 看看这些转换,我认为没有 JavaScript 就无法为那个遗留物做到这一点。

于 2013-04-24T15:00:15.953 回答
2

现实情况是,HTML 中唯一具有原生流体垂直对齐的标签是表格单元格。

CSS 没有任何东西可以让你得到你想要的。今天不行。

如果要求是: 1. 适用于所有浏览器 2. 流畅的高度 3. 垂直居中 4. 没有脚本 5. 没有表格 6. 你现在想要解决方案,而不是几年后

您只剩下 1 个选项: 1. 放弃您的一项要求

否则这个“谜题”是不完整的。这是对您的请求的唯一完整可接受的答案。

......如果我能在这个特殊的挑战上浪费时间得到所有的薪水:)

于 2013-01-08T22:12:10.083 回答
2

不要自虐;让 IE7 去吧... :) (据此使用它的人并不多。)

我用两种方法试了一下,一种是 uses display: table,另一种是 uses line-height。不幸的是,我无法使用 PC,因此它们仅在 Mac 10.8.1、iOS 6.0.1 Safari 和 iOS Simulator 5.0 和 5.1 Safari 上的 Chrome 25.0.1365.1 canary、FF 18 和 Safari 6.0 中进行了测试.

display: table方法在 iOS Simulator 5.0 和 5.1 上存在问题,文本垂直居中不完全。

根据quirksmode,该display:table方法应与 IE8 及更高版本兼容。理论上,line-height 方法可能与 IE 6/7 兼容。

为了在每个正方形中创建居中的框,我将样式设置.box6position: relative并将.bc样式更改为:

.bc  {
    position:absolute;
    top: 30%;
    bottom: 30%;
    left: 30%;
    right: 30%;
    overflow: hidden;
}

.bc每种方法都会创建一个非常高的容器,在元素内部具有静态高度。静态高度的确切值是任意的,它只需要高于它将包含的内容。

display: table方法将.bbl.bbl .lbl样式更改为:

.bbl {
  display: table;
  height: 500px;
  padding-top: 50%;
  margin-top: -250px;
  background-color: blanchedalmond;
  width: 100%;
}

.bbl .lbl {
  display: table-cell;
  vertical-align: middle;
  text-align:center;
}

对于该line-height方法,HTML 为:

<div class="bc">
    <div id="line-h-outter">
        <span id="line-h-inner">a lot more text than in the other blob. The quick brown fox jumped over the lazy dog</span>
    </div>
</div>

CSS:

#line-h-outter {
  line-height: 500px;
  vertical-align: middle;
  margin-top: -250px;
  padding-top: 50%;
}

#line-h-inner {
  display: inline-block;
  line-height: normal;
  vertical-align: middle;
  text-align: center;
  width: 100%;
}

http://jsfiddle.net/X3ZDy/93/

于 2013-01-09T05:09:40.387 回答
0

标题应该以未知为中心 ;-)

我使用表格更新了您的示例:http: //jsfiddle.net/uWtqY/并且文本在您使用表格描述的框中对齐,但您不想要这个。

添加了一个像这样的表:

<table width="100%" height="100%"><tr><td>One line</td></tr> </table></div>

里面 <div class="lbl">

只是为了跨浏览器支持。

编辑

在做了一些研究之后,确实很难在百分比内对齐元素。尝试了很多东西,但你的代码我不确定它是否适合所有人的设计。那么我的意思是,你可能首先需要构建你的垂直对齐,然后尝试使用百分比。从我在这个领域的经验中,我了解到一个好的方法是从内部元素开始设计,然后在复杂性增加时退出。因此,在所有事情中都有百分比可能不是最好的实现(而且在移动设备上也不是)。

编辑 2

在与我的几个工作伙伴以及 HTML 领域的真正极客合并后,答案很明确。要么您支持 < IE7 并且您使用表格或幽灵元素或跨度来做到这一点,要么您使用几篇文章中描述的所有 tequniques 并且您可以支持 >=IE7 。另一种选择是为每个浏览器使用特定的结构。

我认为该链接按原样解释它并有一个不错的标题(基本上就是您需要的):

->以未知为中心

希望最好。

PS。参考链接:

让我知道它是否有帮助

于 2013-01-02T13:48:41.053 回答
0

我更新了 CSS 以利用“间隔”类。它放置在您的“bc”div 之前和彩色框内。这给了我我认为你要求的效果。

html:
<div class="rgCol boxCol box6" style="background-color:lightgray">
        <div class="spacer"></div>
        <div class="bc">


css
.spacer {width:100%;padding-bottom:30%;display:block; }

我将垫片底部填充了 30%,然后将“bbl”div 的绝对左侧位置移动到 30%(从 2%)。blanchdelemond 盒子保持其形状和大小。

http://jsfiddle.net/X3ZDy/37/

于 2013-01-04T15:43:03.523 回答
0

今天我偶然发现了类似的问题 - 垂直和水平居中的方形 div 的子元素具有预先设置的宽度(它们是使用填充技术制成的方形)。我必须在保持纵横比的同时将其用于图像,但是将子元素更改为任何目标元素会很简单。

对于这种情况,不适合行高、边距/填充或显示:表格单元格的解决方法。但是有一个使用margin: auto.

HTML:

<div class="squareContainer>
    <div class="contentWrapper">
        <img class="imagePreview" alt="Image preview" src="//URL.jpg">
    </div>
</div>

CSS:

div.squareContainer {
    position: relative;
    box-sizing: border-box;
    height: 0;
    padding-bottom: 25%;
    width: 25%;
}
div.contentWrapper {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    top: 0;
}
img.imagePreview {
    display: block;
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    top: 0;
    margin: auto;  /* This is the important line */
    max-height: 90%;
    max-width: 90%;
}

有用的资源:

http://jsfiddle.net/mBBJM/1/

http://codepen.io/HugoGiraudel/pen/ucKEC

希望有帮助!

于 2015-07-13T17:12:07.473 回答
0

你可以简单地解决这个问题,没有所有的怪异(也许有一天他们会修复 CSS 盒子模型,但在那之前):

<table>
<tr>
<td width="50" height="50" align="center" valign="middle">text</td>
</tr>
</table>

这里的所有都是它的。选择你的宽度和高度,把它放在一个 div 中并称之为好。

从不使用表格的想法是一个非常糟糕的指导方针,以至于自虐。

于 2016-01-30T22:33:33.253 回答
-2

你的意思是这样吗?

图片

<div class="mycontainer">
  <div class="rgRow">
    <div class="rgCol" style="background-color:pink">
      <div class="boxCol">BOX1</div>
    </div>
    <div class="rgCol" style="background-color:lightgray">
      <div class="boxCol">
        <div class="boxLabel">a lot more text than in the other blob. The quick brown fox jumped over the lazy dog</div>
      </div>
    </div>
    <div class="rgCol" style="background-color:maroon">
      <div class="boxCol">
        <div class="boxLabel">One liner</div>
      </div>
    </div>
    <div class="rgCol" style="background-color:yellow">
      <div class="boxCol">BOX4</div>
    </div>
  </div>
</div>


.mycontainer
{
    background-color: #000000;
    display: inline-table;
}

.rgRow
{
    width: 100%;
    display: table-row;
}

.rgCol
{
    width: 25%;
    height: 100%;
    text-align: center;
    vertical-align: middle;
    display: table-cell;
}

.boxCol
{
    display: inline-block;
    width: 100%;
    text-align: center;
    vertical-align: middle;
}

.boxLabel
{
    text-align: center;
    vertical-align: middle;
    background-color: blanchedalmond;
    overflow: hidden;
    margin: 2%;
    width: 96%;
    height: 96%;
}
于 2013-01-03T00:52:31.450 回答