【问题标题】:Packing fixed width div's into fluid container将固定宽度的 div 打包到流体容器中
【发布时间】:2013-06-08 20:33:06
【问题描述】:

我的结构很简单,有容器和内箱:

<div id="container">
    <div class="block"></div>
    // more blocks
    <div class="block"></div>
</div>

我想要实现的是将盒子放在这个容器内的中心,但尽可能将它们打包在一行中。我可以用 JS 做同样的事情:http://jsfiddle.net/JhxSd/ 但我想避免这种情况,只使用 CSS。那可能吗?

【问题讨论】:

  • 容器内的块数是固定的?
  • 很遗憾没有 - 有时可能只有 1 个块,有时是 25 个。

标签: css responsive-design alignment


【解决方案1】:

@媒体查询

使用一组@media 查询根据当前屏幕尺寸定义不同的网格布局。布局中唯一需要改变的部分是网格包装的宽度。

出于所有实际目的,这是目前唯一可用的 CSS 解决方案。要了解为什么 @media 查询是合适的,以及为什么其他可用的 CSS 选项不起作用,请参阅 this answer

JSFiddle Demo

上面的演示有@media 查询最大1200px 宽的屏幕尺寸(可以根据需要添加更多),并且不使用JavaScript。 #container 的渲染宽度始终为 75%(不包括边框),并且网格在 #container 内居中。

注意:此解决方案需要在块周围添加一个包装器 div。在每个@media 查询中,包装器的宽度刚好足以容纳适合当前屏幕大小的列数。固定的包装宽度允许整个网格在#container 内居中。如果编辑静态 HTML 不是一个选项,可以在使用 jQuery 加载页面时添加包装器 div。

HTML

<div id="container">
    <div class="grid-wrapper">
        <div class="block"></div>
        ...
    </div>
</div>

CSS

#container {
    width: 75%;
    ...
}
.grid-wrapper {
    margin: 0 auto;
    width: 70px;   /* Default: 1 column */
}
@media (min-width: 200px) {
    .grid-wrapper {width: 140px;}   /* 2 columns */
}
@media (min-width: 290px) {
    .grid-wrapper {width: 210px;}   /* 3 columns */
}
...

【讨论】:

  • 我需要将宽度设置为百分比的容器,因此无法设置。我需要与 JS 示例完全相同的解决方案。
  • @PawełFus:this demo 是你需要的吗?这使用@media 查询并且没有JavaScript。在这个演示中,#container 的渲染宽度始终为 75%,并且网格以#container 为中心。它支持任意数量的网格项,并且可以添加额外的@media 查询以支持任意范围的屏幕尺寸。
  • 没错!没有考虑包装,这就是我需要的。谢谢,我会在允许时添加赏金。
【解决方案2】:

我希望这能解决问题:

http://jsfiddle.net/CnjZR/1/

<div id="container">
<div id="wrap">
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
</div>

CSS:

#container {
width: 100%;
overflow: hidden;
background: red;
    text-align: center;
}
.block {
    width: 20px;
    height: 20px;
    background: blue;
    float: left;
    margin: 5px;
}

#wrap {
    background: green;
    overflow: hidden;
    display: inline-block;
}

【讨论】:

  • 使用更大的框,您可以看到右边距/填充与左边不同:jsfiddle.net/CnjZR/2
  • 基本上重点是设置一个包装div,设置为'display: inline-block',设置parent为'text-align: center'。
  • 是的,太糟糕了。在这种情况下我应该删除我的答案吗?
  • 这与纯 css 一样好,没有办法让“合理的”宽度元素始终完美契合。你能做的最好的就是使用块大小,直到它很好地适合并保持它们的大小一致。即:jsfiddle.net/CnjZR/3
【解决方案3】:

不太确定您是否在寻找类似 'flex-justify' 的东西,我在演示中添加了一个基于内联框行为和文本对齐值的转身。

edit : 点清除:text-align:center ;是吗。 http://jsfiddle.net/JhxSd/10/

关键是你不应该使用浮动,而是显示。

浮动不适合居中,也不适合垂直或水平,因为它不是站在文档的自然流中

 #container {
    width: 75%;
    border: 1px solid;
    text-align:center;
    overflow:hidden;
    padding:1em 1em 0;
    box-sizing:border-box;
    float:left;
}

#container .block {
    width: 50px;
    height: 50px;
    background-color: blue;
    display:inline-block;
    margin: 10px;
}

【讨论】:

  • 我正在使用浮动,因为我想从左侧“启动”它们。例如,当宽度设置为 500 像素时,我在两边都有框。因此,证明文本对这种情况不起作用。
  • 奥基,jsfiddle.net/JhxSd/4 。 (我仍然明白你想要有足够内容的行到达每一边。如果没有,请删除文本对齐,浮动在这里是不必要的 :)
  • 也许,我遗漏了一些东西,但这不是我需要实现的目标:jsfiddle.net/JhxSd/9 左右边距不一样。
  • 似乎您的问题与那个类似。 stackoverflow.com/questions/16891138/… 你需要在每行的末尾有一个明确的分隔符来换行,否则 text-align justify 会有所帮助,将元素之间的空间调整为内联框。与浮动不兼容。我真的不明白你想要或不想要什么。
  • 我想要一些与 myjsFiddle 完全相同的东西,但不使用 JS。您提供的链接不一样 - 在那里,用户想要切断容器中的额外空间。我想将盒子放在容器的中心。抱歉,不清楚!
【解决方案4】:

我想,你几乎已经完成的一切。

#container {
    width: 75%;
    border: 1px solid;
    float: left;
}
#container .block {
    width: 50px;
    height: 50px;    
    background-color: blue;
    float: left;
    margin: 10px;
    overflow: hidden;
}

http://jsfiddle.net/JhxSd/3/

【讨论】:

  • 这与@GCyrillus'a 的答案有何不同?
【解决方案5】:

试试这个:

#container {
    width: 75%;
    border: 1px solid;
    float: left;
    overflow: hidden;
    text-align: center;
}
#container .block {
    display: inline-block;
    width: 50px;
    height: 50px;    
    background-color: blue;
    margin: 10px;
}

如果您真的需要所有内容左对齐,那么我认为您只使用 CSS 就不走运了。

【讨论】:

    【解决方案6】:

    您可以将text-align:justify 用于容器,并将display:inline-block 用于div.block。但你需要在最后添加一些占位符标签。像这样:

    HTML

    <div class="wrapper">
      <div class="block">1</div>
      <div class="block">2</div>
      <div class="block">3</div>
      <div class="block">4</div>
      <div class="block">5</div>
      <div class="block">6</div>
      <div class="block">7</div>
      <div class="block">8</div>
      <div class="block">9</div>
      <div class="block">10</div>
      <div class="block">11</div>
      <div class="block">12</div>
      <div class="block">13</div>
      <div class="block">14</div>
      <div class="block">15</div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
        <div class="placeholder"></div>
    </div>
    

    CSS

    .wrapper {
      width: 75%;
      border: 1px solid;
      font-size: 0.1px;
      text-align: justify;
    }
    .wrapper:after {
      content:"";
      display:inline-block;
      width: 100%;
    }
    
    .wrapper div{  
        font-size: 16px;
        display:inline-block;
        *display: inline;
        zoom:1;
        color: #fff;
        background-color:blue; 
        width: 50px; 
        height: 50px; 
        margin: 10px; 
    }
    .wrapper .placeholder {
      width: 50px;
      height: 0px;
      background:none;
    }
    

    请查看demo。详细教程请点击here

    【讨论】:

    • 块之间的边距并不总是相同。
    • 你可以使用flexbox模块。
    • 来自 CSS3?是否可以使用灵活的不会显示在容器外部,但在内部:jsfiddle.net/JhxSd/70
    • 你可以看demo,我改了你的demo:codepen.io/airen/pen/fqECc
    • 抱歉,盒子不是从左侧开始的,有时我们已经证明了这一点,就像@GCyrillus 的第一个回答一样。
    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多