如何让 Firefox 和 IE 在 flexbox 布局中正确呈现写作模式?

Posted

技术标签:

【中文标题】如何让 Firefox 和 IE 在 flexbox 布局中正确呈现写作模式?【英文标题】:How can I get Firefox & IE to render writing-mode properly in a flexbox layout? 【发布时间】:2019-12-24 11:08:43 【问题描述】:

我在 Flex 框中使用 writing-mode: vertical-lr。该布局在 Chrome 76 中正常工作,但在 Firefox 68 和 IE11 中完全错误。

要求说明:对于特定场景,我需要%垂直边距wrto容器(即父元素)高度而不是宽度(这是浏览器的实际行为)。我正在使用的技巧是,为容器设置writing-mode: vertical-lr,以便子级的% 垂直边距(例如:margin-top: 10% 将根据容器高度而不是宽度计算。我为孩子们申请了writing-mode: horizontal-tb,让他们看起来很正常。

演示代码: (在 Firefox 或 IE 11 中运行以下代码,或查看下面的屏幕截图)

* 
  margin: 0; padding: 0; border: 0; box-sizing: border-box;



.container-vert  
  background-color: lightcyan;
  writing-mode: tb-lr;
  writing-mode: vertical-lr;
  
  display: flex;
  flex-flow: row nowrap;


.container-vert  > * 
  writing-mode: lr-tb;
  writing-mode: horizontal-tb;
  display: inline-block;
  vertical-align: bottom;
  
  opacity: .8;



.c11 
  background-color: lightcoral;


.c12 
  background-color: lightgreen;



.outer1 
  background-color: red;

.outer2 
  background-color: gold;


.parent 
  display: flex;
  border: 1px dashed;
  background-color: lightblue;
  padding: 10px;
  flex-flow: row nowrap;
  margin-bottom: 10px;
  writing-mode: tb-lr;
  writing-mode: vertical-lr;

.child 
  border: 1px solid;
  padding: 10px;
  min-width: 100px;
  writing-mode: lr-tb;
  writing-mode: horizontal-tb;
<p class="outer1">Before first example</p>
<div class="container-vert"> 
  <div class="c1 c11">Child1-1 element 
    <p>next line</p>
    <p>next line</p>
    <p>next line</p>
    <p>next line</p>
  </div>
  <div class="c1 c12">Child1-2 element
    <p>2nd's next line</p>
  </div>
</div>
<p class="outer1">After first example</p>

<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>

<p class="outer2">Before second example</p>
<div class="parent">
  <div class="child">A</div>
  <div class="child">B</div>
  <div class="child">C</div>
  <div class="child">D</div>
  <div class="child">E</div>
</div>
<p class="outer2">After second example</p>

是否有任何已知的修复方法可以让 Firefox 和 IE 正确呈现?

Chrome 76.0.3809.100:


火狐 68.0.2:


IE 11 和 Edge 44.18362.267.0:

【问题讨论】:

请在问题本身中包含minimal reproducible example,而不是仅链接到可以并且最终会改变/死亡的场外位置。 @TylerH 添加了可运行代码 sn-p。 历史记录,Codepen 链接:codepen.io/manikantag/pen/jONrjBK 【参考方案1】:

您可能会以一种过于复杂的方式来做您想做的事情。如果您想根据高度获得垂直边距,您可以简单地将一个空的 divheight: X%;" 放在一起模拟边距。请记住,要使百分比正常工作,层次结构中的所有尺寸标注也应该以百分比为单位(Chrome 有时可能会在不是正常行为时添加额外的规则来标注“良好”的尺寸,所以我自己不会将我的样式基于 Chrome仅)。

* 
  margin: 0; padding: 0; border: 0; box-sizing: border-box;


.margin 
  height: 10%;
  background-color: yellow;


.container 
  height: 40%;
<html style="height:100%">
  <body style="height:100%">
    <div class="margin"></div>
    <div class="container" style="background-color: red;">BOO</div>
    <div class="margin"></div>
    <div class="container" style="background-color: blue;">BOO</div>
  </body>
</html>

另一种不需要额外 div 的解决方案。 注意:这可能不是一个更简单的解决方案,因为此处的边距高度(::before)是.container div 的百分比(50% 的 20% 为 10%),因此容器height 必须在其自身高度中包含边距。

* 
  margin: 0; padding: 0; border: 0; box-sizing: border-box;


.margin::before 
  content: "";
  display: block;
  height: 20%;
  background-color: yellow;


.container 
  height: 50%;
<html style="height:100%">
  <body style="height:100%">
    <div class="margin container" style="background-color: red;">BOO</div>
    <div class="margin container" style="background-color: blue;">BOO</div>
  </body>
</html>

【讨论】:

我已经尝试过间隔元件解决方案。但是在制作动画时遇到了负上边距的问题。此外,伪元素在 Flex 中使用时不会将元素推开,并且在 JS 中无法访问它们。在仅尝试了这两种解决方案之后,我正在摆弄writing-mode。感谢任何方式【参考方案2】:

您可以尝试使用以下代码(不使用写作模式,只使用 Flexbox 布局):

<style>
    * 
        margin: 0;
        padding: 0;
        border: 0;
        -webkit-box-sizing: border-box;
        box-sizing: border-box;
    


    .container-vert 
        background-color: lightcyan;
        display: -webkit-box;
        display: -ms-flexbox;
        display: flex;
        -webkit-box-orient: horizontal;
        -webkit-box-direction: normal;
        -ms-flex-flow: row nowrap;
        flex-flow: row nowrap;
        flex-direction: column;
        width: 125px;
        max-width: 125px;
    
    .c11 
        background-color: lightcoral;
    

    .c12 
        background-color: lightgreen;
    


    .outer1 
        background-color: red;
    

    .outer2 
        background-color: gold;
    


    .parent 
        display: -webkit-box;
        display: -moz-box;
        display: -ms-flexbox;
        display: -webkit-flex;
        display: flex;
        border: 1px dashed;
        background-color: lightblue;
        padding: 10px;
        flex-flow: row nowrap;
        margin-bottom: 10px;
        width: 125px;
        max-width:125px;
    

    .row 
        width: auto;
        border: 1px solid blue;
    

    .child 
        background-color: lightblue;
        border: 1px solid;
        padding: 10px;
        /*   margin: 10px; */
        min-width: 100px;
    
</style> 

<p class="outer1">Before first example</p>
<div class="container-vert">
    <div class="c1 c11">
        Child1-1 element
        <p>next line</p>
        <p>next line</p>
        <p>next line</p>
        <p>next line</p>
    </div>
    <div class="c1 c12">
        Child1-2 element
        <p>2nd's next line</p>
    </div>
</div>
<p class="outer1">After first example</p><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
<p class="outer2">Before second example</p>
<div class="parent">
    <div class="row">
        <div class="child">A</div>
        <div class="child">B</div>
        <div class="child">C</div>
        <div class="child">D</div>
        <div class="child">E</div>
    </div>
</div>
<p class="outer2">After second example</p>

在IE浏览器中的结果如下:

【讨论】:

虽然答案修复了 IE 上的显示(顺便说一下在 Firefox 上),但它禁用了 OP 选择 flexwriting-mode 的最初原因,即具有 % top 和底部边距基于容器的高度而不是其宽度。在您的解决方案中,这些边距基于宽度。 @Kaddath 没错。谢谢你的评论。我想添加相同的。

以上是关于如何让 Firefox 和 IE 在 flexbox 布局中正确呈现写作模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 HTML 5 输入 type="date" 在 Firefox 和/或 IE 10 中工作

如何让 Firefox 中的 javascript 也能在 IE 中运行

如何让firefox和chrome支持css自定义鼠标样式?IE中用“cursor:url()”属性可以实现,FF、Chrome怎么弄?

表格中的图像:如何使 Firefox 的行为与 IE 相同

无法让跨域 getJSON 调用在 Internet Explorer 上运行,在 Firefox 上运行良好,在 IE 和 Firefox 的单个域上运行

让 Polymer 3.0 元素向后兼容 IE11 和 Firefox 56?