flex-box 中的行换行未在 Safari 中换行

Posted

技术标签:

【中文标题】flex-box 中的行换行未在 Safari 中换行【英文标题】:Row Wrap in flex-box not wrapping in Safari 【发布时间】:2014-10-11 04:51:30 【问题描述】:

一个 flex 容器有四个孩子,每个孩子的 flex-basis 为 25% 和一个最小宽度。 flex-flow 设置为换行。 Safari 以外的浏览器按预期处理此问题:如果达到最小宽度,它将下一个项目包装到下一行。在 Safari 中它会溢出容器。

在此处查看演示: http://codepen.io/lbilharz/pen/aJbkI

h1 Why this ain't wrappin' in mobile-safari?
  .flex
    for i in ['one','two','three','four']
      .item
        h2=i

手写笔

.flex
  display flex
  flex-wrap wrap
  flex-direction row
  padding 1em
  background lightyellow
  .item
    flex 1 0 25%
    padding 1em
    box-sizing border-box
    min-width 15em

有什么想法吗?

【问题讨论】:

好像是Webkit-Bug,见bugs.webkit.org/show_bug.cgi?id=136041 找到解决方法了吗? 【参考方案1】:

某些浏览器并不完全支持所有 CSS3 元素。试试这个:

  display:-webkit-box;
  display:-webkit-flex;
  display:-webkit-flexbox;
  display:-moz-flex;
  display:-moz-box;
  display:-ms-flexbox;
  display:flex;

【讨论】:

感谢您的回复,但是如果您看一下codepen,您会看到供应商前缀是自动添加的。【参考方案2】:

根据comment on bugs.webkit.org,看来解决方案很简单!

如果你的风格是

div.flex 
    display: -webkit-flex;
    display: flex;
    -webkit-flex-wrap: wrap;
    flex-wrap: wrap;
    -webkit-flex-direction: row;
    flex-direction: row;

div.flex .item 
    min-width: 15em;
    -webkit-flex: 1;
    flex: 1;

您只需要为您的flex 声明添加更多明确性。其实我觉得只有一行需要改成这样

div.flex 
    display: -webkit-flex;
    display: flex;
    -webkit-flex-wrap: wrap;
    flex-wrap: wrap;
    -webkit-flex-direction: row;
    flex-direction: row;

div.flex .item 
    min-width: 15em;
    -webkit-flex: 1 1 15em; /* this */
    flex: 1;
 

【讨论】:

感谢您的评论,它帮助我进一步了解了 flex-basis。你也可以省略 min-width 并写成-webkit-flex: 1 0 15em; flex: 1 0 15em;【参考方案3】:

我在我的弹性项目上使用了max-width,所以我可以通过在flex 属性中显式设置max-width 来解决这个问题:

.wrapper 
  display: flex;
  flex-flow: row wrap;

li 
  width: 100%;
  max-width: 500px;
  flex: 1 1 500px;

【讨论】:

【参考方案4】:

这是一个 Safari ios 错误。所以修复/解决方法是将 flex-basis 设置为显式宽度,而不是子元素的 auto。

【讨论】:

【参考方案5】:

请注意,并非所有前缀的工作方式都相同,因此每个前缀都存在已知问题,您需要手动添加一些供应商前缀。不要盲目信任前缀或自动化软件,除非你检查过它在你的项目中百分百有效。

详细的flex bug请参考:

https://caniuse.com/#feat=flexbox

https://github.com/philipwalton/flexbugs

正如 Joseph Hansen 所指出的,在 flex 声明中包含 width 属性作为第三个参数是 flex 的理想解决方法,它应该可以解决将 flex 与某些声明合并所产生的大部分问题。

但这并不能解决 safari 甚至其他浏览器上的所有问题;有时取决于孩子或其他财产;在下面的示例中,即使所有三个元素都应该保持相同的宽度 ON SAFARI,您也会看到中间的框比平时增长得更多。 如果你使用 chrome,它看起来会很漂亮。

这不是弹性问题,而是显示解释器问题。简单地删除 display: inline-table 将解决 safari 的问题,但是,如果有更多的子元素,它会使所有卡片的高度增加,因此我们需要修复由于切换到另一个显示属性而产生的其他行为。

.flexrow 
  display: -webkit-flex;
  display: flex;
  flex-flow: row wrap;
  flex-direction: row;
  -webkit-flex-wrap: wrap;
  flex-wrap: wrap;
  margin: 0px -15px;

.card-container 
  display: inline-table;

div.card-container 
  -webkit-flex: 0 1 calc(33.3333% - 30px);
  flex: 0 1 calc(33.3333% - 30px);
  margin: 15px;

.card-container 
  background:green;
<div class="flexrow">
  <div class="card-container">
      <div class="card">
        <p class="title">
          test test test
        </p>
      </div>
    </div>

    <div class="card-container">
      <div class="card">
        <p class="title">
          test testtesttest test test test
        </p>
      </div>
    </div>

    <div class="card-container">
      <div class="card">
        <p class="title">
          test test
        </p>
      </div>
    </div>
</div>

这只是一个例子,但我建议检查每个与 flexbox 有边界的属性(即显示、位置等)。

这里是工作示例:

.flexrow 
  display: -webkit-flex;
  display: flex;
  flex-flow: row wrap;
  flex-direction: row;
  -webkit-flex-wrap: wrap;
  flex-wrap: wrap;
  margin: 0px -15px;

.card-container 
  // display: inline-table;

div.card-container 
  -webkit-flex: 0 1 calc(33.3333% - 30px);
  flex: 0 1 calc(33.3333% - 30px);
  margin: 15px;

.card-container 
  background:green;
<div class="flexrow">
  <div class="card-container">
      <div class="card">
        <p class="title">
          test test test
        </p>
      </div>
    </div>

    <div class="card-container">
      <div class="card">
        <p class="title">
          test testtesttest test test test
        </p>
      </div>
    </div>

    <div class="card-container">
      <div class="card">
        <p class="title">
          test test
        </p>
      </div>
    </div>
</div>

【讨论】:

【参考方案6】:

在您显示的项目中,根据您的要求尝试添加此 width: max-content;width: min-content;

【讨论】:

以上是关于flex-box 中的行换行未在 Safari 中换行的主要内容,如果未能解决你的问题,请参考以下文章

列表视图中的行未显示

表行未在 UISplitViewController 中保持选中状态

行未在数据网格 C# 中删除

c语言中 将数组列换行 行换列

UItableview行未在swift4中显示mapkit

将每 n 个换行符替换为文件中的制表符