【问题标题】:Centering floating divs within another div在另一个 div 中居中浮动 div
【发布时间】:2010-11-19 03:32:37
【问题描述】:

我搜索了其他问题,虽然这个问题似乎与其他几个问题相似,但到目前为止我所看到的似乎都没有解决我遇到的问题。

我有一个 div,其中包含许多其他 div,每个 div 都向左浮动。这些 div 每个都包含一张照片和一个标题。我想要的只是让一组照片在包含的 div 中居中。

正如您从下面的代码中看到的那样,我尝试在父 div 上同时使用 overflow:hiddenmargin:x auto,并且我还在照片之后添加了 clear:both(如另一个主题中所建议) .似乎没有什么不同。

谢谢。我很感激任何建议。

<div style="position: relative; margin: 0 auto; overflow: hidden; text-align: center;">
    <h4>Section Header</h4>

    <div style="margin: 2em auto;">

        <div style="float: left; margin: auto 1.5em;">
            <img src="photo1.jpg" /><br />
             Photo Caption
        </div>
        <div style="float: left; margin: auto 1.5em;">
            <img src="photo2.jpg" /><br />
             Photo Caption
        </div>
        <div style="float: left; margin: auto 1.5em;">
            <img src="photo3.jpg" /><br />
             Photo Caption
        </div>

        <div style="clear: both; height: 0; overflow: hidden;"> </div>

    </div>

</div>

【问题讨论】:

  • @TylerH 怎么会?只需查看被询问的日期即可。似乎您链接中的问题是真正的重复。
  • @ThePragmatick 因为这个问题的浏览量是前者的两倍,答案更多,活动也更多(和最近),而且它的措辞比这个问题更规范。

标签: html center css


【解决方案1】:

首先,删除内部divs 上的float 属性。然后,将text-align: center 放在主外部div 上。而对于内部divs, 使用display: inline-block。给它们明确的宽度也可能是明智的。


<div style="margin: auto 1.5em; display: inline-block;">
  <img title="Nadia Bjorlin" alt="Nadia Bjorlin" src="headshot.nadia.png"/>
  <br/>
  Nadia Bjorlin
</div>

【讨论】:

  • @Darren:你试过后停止漂浮了吗?只要您在浮动/除非/您在浮动容器上设置了固定宽度,您就无法完成您想要的。
  • 哦...我错了。删除浮动看起来完全符合我的要求。我不确定我是否明白为什么,但是...非常感谢。
  • @Darren,请注意在我的代码示例中我没有包含浮动 ;) 下次请仔细阅读,它会为您节省一些挫败感 :) 很高兴您明白了。继续努力,欢迎来到 SO。
  • 当一些图像标题足够长到可以换行时,这种方法开始失败。还有其他建议吗?
  • 没关系,发现可变行数字幕问题可以用'vertical-align:top'解决。 =)
【解决方案2】:

使用Flexbox,您可以轻松地在 div 内水平(和垂直)居中 浮动子项

如果你有这样的简单标记:

<div class="wpr">
    <span></span>
    <span></span>
    <span></span>
    <span></span>
    <span></span>
</div>

使用 CSS:

.wpr
{
    width: 400px;
    height: 100px;
    background: pink;
    padding: 10px 30px;
}

.wpr span
{
    width: 50px;
    height: 50px;
    background: green;
    float: left; /* **children floated left** */
    margin: 0 5px;
}

(这是(预期的 - 不受欢迎的)RESULT

现在将以下规则添加到包装器中:

display: flex;
justify-content: center; /* align horizontal */

浮动的孩子对齐中心 (DEMO)

只是为了好玩,要获得垂直对齐,只需添加:

align-items: center; /* align vertical */

DEMO

【讨论】:

  • 仍然需要检查浏览器的兼容性,但这似乎很棒!
  • 你也可以使用 display: inline 代替 flex 来使 div 居中。 Flex 在 Safari 和 Opera 方面存在问题。
  • 内联对我不起作用。此解决方案的问题是,如果框超出 div 的宽度,则框不会进入第二行。所以你实际上把它们变成了一张桌子......
【解决方案3】:

我使用相对定位和向右浮动完成了上述操作。

HTML 代码:

<div class="clearfix">                          
    <div class="outer-div">
        <div class="inner-div">
            <div class="floating-div">Float 1</div>
            <div class="floating-div">Float 2</div>
            <div class="floating-div">Float 3</div>
        </div>
    </div>
</div>

CSS:

.outer-div { position: relative; float: right; right: 50%; }
.inner-div { position: relative; float: right; right: -50%; }
.floating-div { float: left; border: 1px solid red; margin: 0 1.5em; }

.clearfix:before,
.clearfix:after { content: " "; display: table; }
.clearfix:after { clear: both; }
.clearfix { *zoom: 1; }

JSFiddle:http://jsfiddle.net/MJ9yp/

这适用于 IE8 及更高版本,但不能更早(惊喜,惊喜!)

不幸的是,我不记得这个方法的来源,所以我不能相信原作者。有知道的请发下链接!

【讨论】:

  • +1 这很好用。接受的答案对我不起作用。它造成了垂直对齐问题...
  • @TimH 迟到了,我知道,但垂直对齐问题可以通过在容器中添加 'vertical-align: top' 来解决
  • 对不起,我指的是内部 div,而不是容器 div*
  • 几乎完美无缺。如果溢出,项目将转到下一行,但当它们溢出时,它们不会居中。
【解决方案4】:

以下解决方案不使用内联块。但是,它需要两个辅助 div:

  1. 内容是浮动的
  2. 内部助手是浮动的(它与内容一样延伸)
  3. 内部辅助对象被向右推 50%(其左侧与外部辅助对象的中心对齐)
  4. 内容向左拉 50%(其中心与内部助手的左侧对齐)
  5. 外部助手设置为隐藏溢出

.ca-outer {
  overflow: hidden;
  background: #FFC;
}
.ca-inner {
  float: left;
  position: relative;
  left: 50%;
  background: #FDD;
}
.content {
  float: left;
  position: relative;
  left: -50%;
  background: #080;
}
/* examples */
div.content > div {
  float: left;
  margin: 10px;
  width: 100px;
  height: 100px;
  background: #FFF;
}
ul.content {
  padding: 0;
  list-style-type: none;
}
ul.content > li {
  margin: 10px;
  background: #FFF;
}
<div class="ca-outer">
  <div class="ca-inner">
    <div class="content">
      <div>Box 1</div>
      <div>Box 2</div>
      <div>Box 3</div>
    </div>
  </div>
</div>
<hr>
<div class="ca-outer">
  <div class="ca-inner">
    <ul class="content">
      <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
      <li>Nullam efficitur nulla in libero consectetur dictum ac a sem.</li>
      <li>Suspendisse iaculis risus ut dapibus cursus.</li>
    </ul>
  </div>
</div>

【讨论】:

    【解决方案5】:

    display: inline-block; 在任何 IE 浏览器中都不起作用。这是我用的。

    // change the width of #boxContainer to 
    // 1-2 pixels higher than total width of the boxes inside:
    
    #boxContainer {         
        width: 800px; 
        height: auto;
        text-align: center;
        margin-left: auto;
        margin-right: auto;
    }
    
    #Box{
        width: 240px; 
        height: 90px;
        background-color: #FFF;
        float: left;
        margin-left: 10px;
        margin-right: 10px;
    }
    

    【讨论】:

      【解决方案6】:

      解决方案:

      <!DOCTYPE HTML>
      <html>
          <head>
              <title>Knowledge is Power</title>
              <script src="js/jquery.js"></script>
              <script type="text/javascript">
              </script>
              <style type="text/css">
                  #outer {
                      text-align:center;
                      width:100%;
                      height:200px;
                      background:red;
                  }
                  #inner {
                      display:inline-block;
                      height:200px;
                      background:yellow;
                  }
              </style>
          </head>
          <body>
              <div id="outer">
                  <div id="inner">Hello, I am Touhid Rahman. The man in Light</div>
              </div>
          </body>
      </html>
      

      【讨论】:

      • 这个解决方案是题外话。内部应该是 float:left 以满足 OP 的要求。
      【解决方案7】:

      在我的情况下,我无法得到@Sampson 的答案来为我工作,充其量我得到一个位于页面中心的列。然而,在这个过程中,我了解了浮动的实际工作原理并创建了这个解决方案。从本质上讲,修复非常简单,但很难从这个线程中找到,在这篇文章的时候已经有超过 146,000 的浏览量没有提及。

      所需要的只是合计所需布局将占用的屏幕空间宽度,然后使父级宽度相同并应用边距:自动。就是这样!

      布局中的元素将决定“外部” div 的宽度和高度。取每个“myFloat”或元素的宽度或高度+它的边界+它的边距和它的填充并将它们加在一起。然后以相同的方式将其他元素添加在一起。这将为您提供父宽度。它们的大小都可能有所不同,您可以使用更少或更多的元素来做到这一点。

      例如(每个元素都有 2 个边,因此边框、边距和内边距乘以 x2)

      所以一个宽度为 10 像素、边框为 2 像素、边距为 6 像素、内边距为 3 像素的元素看起来像这样: 10 + 4 + 12 + 6 = 32

      然后将所有元素的总宽度相加。

      Element 1 = 32
      Element 2 = 24
      Element 3 = 32
      Element 4 = 24
      

      在本例中,“外部”div 的宽度为 112。

      .outer {
        /* floats + margins + borders = 270 */
        max-width: 270px;
        margin: auto;
        height: 80px;
        border: 1px;
        border-style: solid;
      }
      
      .myFloat {
          /* 3 floats x 50px = 150px */
          width: 50px;
          /* 6 margins x 10px = 60 */
          margin: 10px;
          /* 6 borders x 10px = 60 */
          border: 10px solid #6B6B6B;
          float: left;
          text-align: center;
          height: 40px;
      }
      <div class="outer">
        <div class="myFloat">Float 1</div>
        <div class="myFloat">Float 2</div>
        <div class="myFloat">Float 3</div>
      </div>

      【讨论】:

      • 这是我一直在寻找的答案,谢谢。你如何计算你需要的px?我不清楚。
      猜你喜欢
      • 1970-01-01
      • 2011-06-03
      • 2010-10-24
      • 2015-02-22
      • 2022-11-20
      • 2013-07-08
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      相关资源
      最近更新 更多