为什么width:100%在div {display:table-cell}上不起作用?


68

我正在尝试将某些内容垂直和水平居中放置在图像幻灯片(flexslider)上。这个问题也有类似的问题,但是我找不到直接适用于我的特定问题的令人满意的解决方案。由于FlexSlider的限制,我无法position: absolute;在实现中在img标签上使用。

我几乎在工作下面有解决方法。唯一的问题是我无法inner-wrapper通过display: table-cell属性将该宽度和高度声明用于div 。

这是标准行为,还是我的代码中缺少某些内容?如果这是标准行为,那么对我的问题最好的解决方案是什么?

的HTML

<ul>
    <li>
        <img src="#">
        <div class="outer-wrapper">
            <div class="inner-wrapper">
                <h1>My Title</h1>
                <h5>Subtitle</h5>
            </div>
        </div>
    </li>
</ul>

的CSS

html, body {
    margin: 0; padding: 0;
    width: 100%; height: 100%;
}

ul {
    background: #CCC;
    height: 100%;
    width: 100%;
    list-style-position: outside;
    margin: 0; padding: 0;
}

li {
    width: 100%;
    display: table;
}

img {
    width: 100%;
    height: 410px;
}

.outer-wrapper {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    margin: 0; padding: 0;
}

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

注意:居中内容将超过1个元素,因此我不能使用行高技巧。

jsFiddle

Answers:


72

display:table;里面.outer-wrapper似乎工作...

JSFiddle链接


编辑:两个包装使用显示表单元格

我会评论你的答案,但我的代表太少了:(反正...

离开您的答案,似乎您需要做的就是在display:table;内部添加.outer-wrapper(Dejavu?),您可以table-wrapper全心全意地摆脱。

JSFiddle

但是,是的,position:absolute让您将鼠标放在div上方img,我读得太快了,以为您根本无法使用position:absolute,但似乎您已经知道了。道具!

经过99%timshutes的工作后,我将不发布源代码,因此请参考他的答案,或者仅使用我的jsfiddle链接

更新:使用Flexbox的一个包装器

已经有一段时间了,所有很酷的孩子都在使用flexbox:

<div style="display: flex; flex-direction: column; justify-content: center; align-items: center;">
    stuff to be centered
</div>

完整的JSFiddle解决方案

浏览器支持():IE 11 +,FireFox 42 +,Chrome 46 +,Safari 8 +,iOS 8.4+(-webkit-前缀),Android 4.1+(-webkit-前缀)

CSS技巧:Flexbox指南

如何在CSS中居中:输入您希望内容居中的方式,并输出在html和CSS中的处理方式。未来就在这里!


我需要上面的文字-覆盖在图片上方。
timshutes

应该注意的是,当您仅使用标记将行内文本居中时,flexbox居中的行为很有趣–inline-block然后,这被视为一个元素。
扑热息痛

1
已经有一段时间了,但是这个答案比我原来的答案要好。谢谢你!
timshutes

12

我想通了。我知道这有一天会帮助某人的。

如何在相对位置的图像上将Div垂直和水平居中

关键是第三个包装器。我会投票赞成使用更少包装的任何答案。

的HTML

<div class="wrapper">
    <img src="my-slide.jpg">
    <div class="outer-wrapper">
        <div class="table-wrapper">
            <div class="table-cell-wrapper">
                <h1>My Title</h1>
                <p>Subtitle</p>
            </div>
        </div>
    </div>
</div>

的CSS

html, body {
margin: 0; padding: 0;
width: 100%; height: 100%;
}

ul {
    width: 100%;
    height: 100%;
    list-style-position: outside;
    margin: 0; padding: 0;
}

li {
    width: 100%;
    display: table;
}

img {
    width: 100%;
    height: 100%;
}

.outer-wrapper {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  margin: 0; padding: 0;
}

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

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

您可以在这里看到正在运行的jsFiddle


6

我发现'width'的值越高,盒子的宽度就越小,反之亦然。我发现这是因为我之前有同样的问题。所以:

.inner-wrapper {
    width: 1%;
}

解决了问题。


欢迎来到StackOverflow!尽管人们总是很乐意回答,但这个问题是3年前提出的,已经有了公认的解决方案。请尝试通过提供答案来避免在顶部出现“颠簸”的问题,除非尚未将该问题标记为已解决,或者您找到了解决该问题的更好的替代方法:)
黑曜石时代

当内部包装与任何兄弟姐妹display: table-cell
合用

6

欢迎来到2017年,这几天将使用vWvH完成技巧

html, body {
    margin: 0; padding: 0;
    width: 100%; height: 100%;
}

ul {
    background: #CCC;
    height: 100%;
    width: 100%;
    list-style-position: outside;
    margin: 0; padding: 0;
}

li {
    width: 100%;
    display: table;
}

img {
    width: 100%;
    height: 410px;
}

.outer-wrapper {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    margin: 0; padding: 0;
}

.inner-wrapper {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
    width: 100vw; /* only change is here "%" to "vw" ! */
    height: 100vh; /* only change is here "%" to "vh" ! */
}
<ul>
    <li>
        <img src="#">
        <div class="outer-wrapper">
            <div class="inner-wrapper">
                <h1>My Title</h1>
                <h5>Subtitle</h5>
            </div>
        </div>
    </li>
</ul>


1

100%表示100%的视口,除了宽度的%单位外,您还可以使用vw单位对其进行修复。问题是100vw与视口有关,%与父标记有关。那样做:

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

0

这个怎么样?(jsFiddle链接)

的CSS

ul {
    background: #CCC;
    height: 1000%;
    width: 100%;
    list-style-position: outside;
    margin: 0; padding: 0;
    position: absolute;
}
li {
 background-color: #EBEBEB;
    border-bottom: 1px solid #CCCCCC;
    border-right: 1px solid #CCCCCC;
    display: table;
    height: 180px;
    overflow: hidden;
    width: 200px;
}
.divone{
    display: table-cell;
    margin: 0 auto;
    text-align: center;
    vertical-align: middle;
    width: 100%; 

}
img {
    width: 100%;
    height: 410px;
}
.wrapper {
  position: absolute;
}

此解决方案修复了水平对齐方式,但修复了垂直对齐方式(我也想居中)。另外,我想到将浮动对象放在表格单元格元素中并不是最佳实践。但是,那可能不是真的。
timshutes

您要以div内容为中心吗?
Hushme

尚未在此处执行...文本被聚集在左侧。我希望它居中。我终于解决了这个问题。您可以在这里查看解决方案:jsfiddle.net/timshutes/5pAA3/6或在上面的答案中。
timshutes

-2

只需添加min-height:100%和min-width:100%即可。我有同样的问题。您不需要第三个包装器

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.