2013-04-28 193 views
3

基本上我想要建立一个大小相同的div的页面,例如100x100,但也有200x100的变体。他们都浮动:左侧调整相应的窗口大小。问题是,我不知道如何让他们集中在那个场景中,有时候说是连续3次或其他时间7,因为通常你会在右侧留出更多的空间,使它看起来不在中心。 在此先感谢!中心x浮动数量:左侧divs水平

+2

这是你之后的布局吗? http://i.imgur.com/JEmWoOT.png – Kos 2013-05-06 10:22:54

+1

请发布一些布局图和/或到目前为止的一些代码 – HerrSerker 2013-05-08 10:58:52

回答

4

Are you looking for something like this?设置容器上的自动利润率将水平居中。从那里,您可以浮动或嵌入您的块,以便以您说话的方式显示它们。看看CSS和HTML:

<div class="container"> 
    <div></div> 
    <div class="variant"></div> 
    <div></div> 
    <div></div> 
    ... 
</div> 

这个HTML就像它在语义上一样简单。理想情况下,我通常会将其作为无序列表来执行,但由于标题中标题提到divs,因此我朝这个方向前进。

div.container div{ 
    border: solid 2px black; 
    min-height: 100px; 
    width: 100px; 
    display: inline-block; 
    background-color: white; 
    vertical-align: top; 
    margin: 10px; 
} 
div.container div.variant{ 
    width: 200px; 
} 
div.container{ 
    margin: auto; 
    max-width: 620px; 
    background-color: #ecefec; 
    padding: 10px; 
    font-size: 0; 
} 

JS Fiddle

这是怎么回事就在这里

我们通过内联物业display: inline-block块元素;因此我们需要制定一些附加规则,以便在它们具有不同高度的情况下正确显示(这些将自动清除一行,而不像浮动元素)。

内联元素上的属性vertical-align:top确保排列元素的顶部边界与其兄弟元素的顶部边界齐平。

属性font-size:0可确保在计算块元素之间的间距(否则每个包含一个div标签的关闭与包含另一个div标签的开口之间的空间)时不会考虑标记空白。

这应该完成你正在努力实现的目标。

UPDATE

看着回答另一个问题您的评论后,我们需要添加text-align:center;到容器div的CSS,因为这将中心集装箱内的每一行。

Example

+1

谢谢,这是非常翔实的,但不解决一个特定的问题:当容器收缩到最大宽度以下时,框不再居中(空间是只在右边)(第一个演示)。如果你使用'text-align:center',那么每行都是单独居中的,这完全打破了他们的网格布局(第二个演示)。 – Kos 2013-05-12 19:44:17

+1

不幸的是,所描述的场景是不可能的,没有进入一些相当重的JavaScript。即使是显示器:表格布局也需要固定的宽度。否则,请查看Flexbox模式。它被设计用于这样的困难布局问题(没有明确的解决方案)。然而,浏览器的采用在这一点上是不明智的。 – 2013-05-13 19:19:45

2

我不太清楚你之后(图像可能会帮助)在做什么,但如果我理解正确的话,你应该能够实现使用inline-block!而非float是你的布局:

  • 在你的div上设置display: inline-block,在容器上设置
  • 设置text-align: center(或者可能是justify)。

一些阅读上:

+0

错误(红色空格): http://tinypic.com/view.php?pic = b4aqzl&s = 5 对(相同的空间在每边): http://tinypic.com/view.php?pic=334ntk0&s=5 – user1826176 2013-04-28 11:53:04

+1

好吧,我想我明白了 - http://jsfiddle.net/VYUKf /你想要一个以整体为中心的布局,但保留“text-align:left”的网格状外观,对吧? – Kos 2013-04-28 13:13:02

+0

是的,它几乎是这样,但在这种情况下,它不会像我的图像示例那样留在网格中,每条线都有它自己的中心。 – user1826176 2013-04-28 13:44:42

1

你在找什么样的?

HTML:

<div class="container"> 
    <div class="small"></div> 
    <div class="large"></div> 
    <div class="small"></div> 
    <div class="mini"></div> 
    <div class="small"></div> 
    <div class="mini"></div> 
    <div class="small"></div> 
</div> 

CSS:

.container { 
    text-align: center; 
    letter-spacing:-0.25em; 
    word-spacing: -0.25em; 
} 
.small, .large, .mini { 
    display: inline-block; 
    *display: inline; 
    zoom: 1; 
    height: 50px; 
    letter-spacing:normal; 
    word-spacing: normal; 
} 
.small { 
    width: 25%; 
    background: #f00; 
} 
.large { 
    width: 50%; 
    background: #0f0; 
} 
.mini { 
    width: 12.5%; 
    background: #00f; 
} 
+1

例如:http://jsfiddle.net/n4GzG/ – Tarun 2013-05-06 13:07:31

+1

从我所了解的,块是固定的大小(100x100的增量),线包裹在流体宽度的容器内(@original海报:确认请:-)) – Kos 2013-05-06 18:59:42

+1

@Kos,我看到了你的例子,但看起来像CSS不可能。因为为此你必须将所有div封装在一个容器中有动态div。在这种情况下,容器内的内容(div)将按容器大小的宽度显示。但你正在寻找的情况就像容器应该根据你的第一排的宽度进行调整。这意味着重新计算容器。这只适用于javaScript。 – Tarun 2013-05-07 03:42:05

1

如果我理解正确的话,你有一个可变数目是不同宽度的元素,并且要居中元件组水平的页面上。

如果是这样的话,那对我的作品的解决办法是这样的:

HTML:

<div class="container"> 
    <div class="outer"> 
     <div class="inner"> 
      <!-- your elements here --> 
     </div> 
    </div> 
</div> 

CSS:

.container { 
    overflow: hidden; 
} 
.container .outer { 
    float: left; 
    position: relative; 
    left: 50%; 
} 
.container .outer .inner { 
    float: left; 
    position: relative; 
    left: -50%; 
} 

基本上,发生的事情是,.outer DIV向右移动,使其左边缘位于其父元素的中间。然后,.inner向左移动50%,这意味着.inner的中心与.outer的左边缘对齐。最后,.inner及其内容将集中在屏幕上,而不管.inner内元素的总宽度。

使用自动边距要求包含内容的元素具有定义的宽度。该解决方案以牺牲一些非语义标记为代价来绕过这个问题。

这里有一个演示,显示它在行动:

JsFiddle DEMO

+0

这是一个很好的解决方案,但是网格不再在一些元素被封装之后居中。 – Kos 2013-05-08 16:03:02

+0

正确;此解决方案将仅适用于单行元素。目前仍不清楚海报是否需要该功能才能用于包含SINGLE的元素中的多行元素。如果他提前知道每行中会出现多少项目,他可以将每组元素包装在上述标记中。 – jackwanders 2013-05-15 13:43:27

1

HTML:

<div id="container"> 
    <div class="small"></div> 
    <div class="large"></div> 
    <div class="small"></div> 
    <div class="mini"></div> 
    <div class="small"></div> 
    <div class="mini"></div> 
    <div class="small"></div> 
</div> 

CSS:

* { 
    margin: 0; 
    padding: 0; 
} 
#container { 
    margin: 0px auto; 
    overflow: hidden; 
    border: 1px solid #f00; 
    letter-spacing:-0.25em; 
    word-spacing: -0.25em; 
    line-height: 0; 
} 
.small, .large, .mini { 
    display: inline-block; 
    *display: inline; 
    float: left; 
    zoom: 1; 
    height: 50px; 
    letter-spacing:normal; 
    word-spacing: normal; 
    line-height: auto; 
} 
.small { 
    width: 100px; 
    background: #f00; 
} 
.large { 
    width: 200px; 
    background: #0f0; 
} 
.mini { 
    width: 50px; 
    background: #00f; 
} 

jQuery的:

resizeContainer(); 

function resizeContainer() { 
    var containerWidth = 0; 
    $('#container > div').each(function() { 
     var self = $(this); 
     var offset = self.offset(); 
     if (offset.top < 2) { 
      containerWidth += self.width(); 
     } else { 
      $('#container').css('width', containerWidth); 
      return false; 
     } 
    }); 
} 
+1

例如:http://jsfiddle.net/n4GzG/2/ – Tarun 2013-05-07 04:07:32

2

我有一个解决方案,我认为满足您的需要。它使用媒体查询将容器宽度调整为适合当前视口宽度的块宽度的最大倍数。然后,该容器以自动边距为中心,并且其中的块刚好左对齐。

由于容器始终是块宽度的精确倍数,容器内绝不会有多余的空间。而容器本身也是居中的,所以任何一边的间距都会非常平衡。计算媒体查询有点乏味,所以我更喜欢用SASS来做这件事,但如果你的数据块相当大(如果块越大,媒体越少,你就不需要它们的数量)。查询需要)。

Codepen example using SASS

如果你喜欢更小,或者只是普通的老CSS,我会很乐意提供一个转换。

+1

媒体查询获胜?一个不错的,开箱即用的想法。我的+150,因为它实际上是我设想的工作,我希望它也可以帮助OP。 :-) – Kos 2013-05-12 19:37:54

+1

我很高兴你喜欢这个解决方案。这是一个很棒的奖励。谢谢。 :) – 2013-05-12 19:43:27

2

在这个页面上有很多问题和答案,很难弄清楚OP真正需要什么,但这里是我的帮助尝试。在Josh Burgess in his answer提供的漂亮的jsFiddle的基础上构建。我不确定他的jsFiddle是否已经是Kos或OP之后的,但我想用另一种方法使用flexbox model来补充他的回答,因为这增加了许多其他选项,您可能需要考虑考虑。首先,flexbox模型在过去的几年中一直在进行相当多的改变,一个全新的实现目前是fully supported by Chrome and Opera and partially supported by a number of other major browsers。当涉及到支持下面的示例所需的功能时,我相信它们应该可以在除FireFox以外的所有主流浏览器的所有当前版本中工作。预测Firefox将为fully supporting the new flexbox model in version 22,即scheduled to be released on June 25, 2013

现在,这里是Josh Burgess jsFiddle的副本,它描绘了与他提供的更新示例jsFiddle完全相同的外观和行为,但使用了flexbox模型来完成此操作。

div.container { 
    margin: auto; 
    max-width: 620px; 
    background-color: #ecefec; 
    padding: 10px; 
    font-size: 0; 

    display: -webkit-flex; /* Chrome */ 
    display: -ms-flexbox;  /* IE 10 */  
    display: flex;   /* Opera 12.1, Firefox 20+ */ 

    /* Chrome */ 
    -webkit-flex-flow: row wrap; 
    -webkit-justify-content: center; 

    /* IE10 */ 
    -ms-flex-flow: row wrap; 
    -ms-justify-content: center; 

    /* Opera 12.1, Firefox 20+ */ 
    flex-flow: row wrap; 
    justify-content: center; 
} 

现在看看会发生什么,当我justify-content值更改为:

如果你没有介意div的n不是一个特定的宽度,你甚至可以将它们设置为自动调整大小的弹性盒,就像我在这个jsFiddle中所做的那样,它可以有效地将div的width变成min-width的。

div.container div { 
    -webkit-flex: auto;  /* Chrome */ 
    -ms-flex: auto;   /* IE10 */ 
    flex: auto;    /* Opera 12.1, Firefox 20+ */ 
} 

无论如何,这是非常强大的东西,我认为。而且,尽管我意识到,在所有主流浏览器中,它仍然不能完美地工作的事实对于任何人来说都可能是一个足够大的障碍,当谈到在当前实际实现这一点时,我相信这个功能应该在页面的问题就像OP的问题。

此外,也许,以防万一Josh Burgess answer仍然不是什么Kos或OP正在寻找,一些提供的jsFiddles(当在浏览器中看到支持他们)可以用来解释究竟是什么他们都是寻找。

+1

谢谢,我只开始学习flexbox,这是非常丰富的。但是我相信它与OP的目标不相符(是的,我知道它可能没有被描述得足够好)。请看James Holderness的演示;你认为flexbox可以简化它吗?我很想知道是否是这种情况。 – Kos 2013-05-12 19:40:17