button 使用 flex 布局的兼容性问题

button 使用 flex 布局的兼容性问题

在低版本的手机系统中,咱们发现 button 不可以做为 flex 容器,即便在 CSS 中指定了 display: flex 且 autoprefixer 也已经转换成兼容属性,也仍是不起做用。具体表如今其内容并不能使用 flex 布局对齐,好比说居中。css

这里的背景是,咱们常常须要展现一些按钮,用户可点击执行特定的操做。若是只是简单把 div 写成按钮的样子,里面直接写文本的话,会产生至少两个问题: 1. 语义和无障碍都不够友好; 2. 低版本手机文本节点不能对齐。html

<div class="btn">
    我是一个按钮
</div>
.btn {
    display: flex;
    align-items: center;
    justify-content: center;

    color: #fff;
}

为了解决第一个问题,咱们直接使用标准的 button 标签便可。不考虑使用 a 标签缘由是既要处理默认的点击行为,也要为了 a11y 指定 WAI-ARIA 的 role="button" ,按钮数量多了以后写起来就比较烦人。而对于第二个问题,咱们通常可把按钮的内容(这里只有一个文本节点)包裹在 span 里。前端

<button class="btn">
    <span>我是一个按钮</span>
</button>
.btn {
    display: flex;
    align-items: center;
    justify-content: center;
    
    & > span {
        color: #fff;
    }
}

但上面这种方案,通过测试发如今低版本系统上仍是有问题,文本并无被居中!这个时候咱们能够选择把 span 设为 width: 100% 并设置文本居中属性 text-align: center ,但这种方法至关于放弃了 flex 布局,转而使用了传统的对齐方案。并且既然水平方向的 flex 排版不起做用,咱们也不能指望垂直方向的也能正常工做。git

通过搜索,咱们发现 ionic-team/ionic#5310 提供了一种方案,原来的 button 仍是保持 block 的显示布局不变,将 flex 布局的属性设置在里面的 span 元素上。经测试,这种方案在咱们须要兼容的机型( and 4.4.4+ / iOS 8.4+ )上都能正常工做。github

.btn {
    display: inline-block;
    
    & > span {
        width: 100%;
        height: 100%;
        display: flex;
        flex-flow: row nowrap;
        align-items: center;
        justify-content: center;
    }
}

该方案一直被 ionic 项目沿用至今,我目前看到的代码位于 button.scss#L43 #L241 。反查资料可知这是 flex box 在早期浏览器实现的 bug ,并早已有人给出了 workaround ,详见 Flexbug #9 - Some HTML elements can't be flex containersc#

2020 年了,但愿你们都能往小康冲刺,都能换上更好更新的手机,也但愿 Web 前端可以尽早摆脱对较低版本浏览器内核的兼容吧。浏览器

相关文章
相关标签/搜索