【问题标题】:Prevent floated divs from wrapping to new line防止浮动 div 换行到新行
【发布时间】:2012-03-29 03:41:45
【问题描述】:

我已经在 SO 上看到过几次这样的问题,并且给出了相同的答案,这在我的 Chrome 或 Firefox 中不起作用。

我想让一组左浮动的 div 跑出来,水平方向是一个带有水平滚动条的父 div。

我可以在这里展示我想用这个糟糕的内联 css 做什么:http://jsfiddle.net/ajkochanowicz/tSpLx/3/

但是,从 SO* 上给出的答案来看,这应该可行,但对我来说却不行。 http://jsfiddle.net/ajkochanowicz/tSpLx/2/

有没有办法在不为每个项目定义绝对定位的情况下做到这一点?

*例如Prevent floated divs from wrapping to next line

【问题讨论】:

    标签: html css css-float


    【解决方案1】:

    这个问题已经问了很久了,但仍然在搜索引擎结果中显示得很高。因此,我觉得添加新答案仍然有用。现在也可以通过使用 flexbox(现在有不错的浏览器支持)来实现所需的结果,而无需为父级设置固定宽度。

    使用示例中的类名(现在有点偏离,因为元素实际上不再浮动):

    .float-wrap {
      display: flex;
      flex-wrap: nowrap;
    }
    
    .left-floater {
      flex: 0 0 100px;
    }
    
    .outer {
      overflow-x: auto
    }
    

    【讨论】:

      【解决方案2】:

      这应该是你所需要的。

          .float-wrap {
            /* 816 = <number of floats> * (<float width> + 2 * <float border width>) */
            width: 816px;
            border: 1px solid;
            /* causes .float-wrap's height to match its child divs */
            overflow: auto;
          }
          .left-floater {
            width: 100px;
            height: 100px;
            border: 1px solid;
            float: left;
          }
          .outer {
            overflow-x: scroll;
          }
      <div class="outer">
        <div class="float-wrap">
          <div class="left-floater">
            One
          </div>
          <div class="left-floater">
            Two
          </div>
          <div class="left-floater">
            Three
          </div>
          <div class="left-floater">
            I should be to the <s>left</s> right of "Three"
          </div>
          <div class="left-floater">
            I float.
          </div>
          <div class="left-floater">
            I float.
          </div>
          <div class="left-floater">
            I float.
          </div>
          <div class="left-floater">
            I float.
          </div>
        </div>
      </div>

      .float-wrap 为divs 保留空间。因为它将始终保持至少足够的空间以将它们并排放置,所以它们永远不需要包装。 .outer 提供滚动条,并根据窗口宽度调整大小。

      【讨论】:

      • 出色的工作,亚伦。以下是供读者阅读的 JSFiddle 链接:jsfiddle.net/ajkochanowicz/wkqQU
      • 是否可以自动计算.float-wrap 选择器中的width: 属性?还是必须硬编码?
      • @feralin 在标准 CSS 中,它必须是硬编码的。如果你使用 LESS 或 Sass,你可以使用变量来获得类似width: @floatsPerRow * (@floatWidth + 2 * @floatBorderWidth)
      • 如果行中的浮点数可以随时间变化,那么 javascript 是计算所需宽度的方法吗?
      • 嘿伙计们,这是完美的,但我的元素数量取决于用户将添加多少项目,因此我无法为 .float-wrap 元素设置特定宽度。有任何想法吗?谢谢。
      【解决方案3】:

      在绝对定位的元素周围使用第二个包装器。然后你可以浮动单个项目。

      <style type="text/css">
          #outter {
              position: relative;
              width: 500px;
              height: 200px;
              overflow: scroll;
          }
          #inner {
              position: absolute;
              top: 0;
              left: 0;
              width: 1000px;
              height: 200px;
          }
          #inner .item {
              float: left;
              display: inline;
          }    
      </style>
      
      <div id="outter">
          <div id="inner">
              <div class="item">Item #1</div>
              <div class="item">Item #2</div>
              <div class="item">Item #3</div>
          </div>
      </div>
      

      您必须根据其中的项目数量调整#inner 的宽度。如果您知道项目数或在页面加载后使用 javascript,这可以在加载时完成。

      【讨论】:

      • 对不起。刚刚修复了CSS。 #inner .left 应该是#inner .item。
      • 谢谢,@Kory。我清理了它并为浮动 div 添加了宽度和高度值,但它仍然做同样的事情:jsfiddle.net/ajkochanowicz/7Feaj
      • 刚刚做了一个修改,如果你创建另一个子 div 并给出宽度/高度值(但不是“float:left”),它就会起作用:jsfiddle.net/ajkochanowicz/7Feaj/1
      • 嗯,但现在您必须为 .outer 的宽度指定一个 px 值。让它 100% 打破它。
      • 您希望这是一个流体宽度的容器吗?无论哪种方式,您都需要动态更新 #inner 容器的宽度以适应其子容器的确切大小。这有意义吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多