button 使用 flex 布局的兼容性问题
button 使用 flex 布局的兼容性问题
在低版本的手机系统中,我们发现 button
不能够作为 flex 容器,即使在 CSS 中指定了 display: flex
且 autoprefixer 也已经转换成兼容属性,也还是不起作用。具体表现在其内容并不能使用 flex 布局对齐,比如说居中。
这里的背景是,我们经常需要展示一些按钮,用户可点击执行特定的操作。如果只是简单把 div
写成按钮的样子,里面直接写文本的话,会产生至少两个问题: 1. 语义和无障碍都不够友好; 2. 低版本手机文本节点不能对齐。
<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 排版不起作用,我们也不能期望垂直方向的也能正常工作。
经过搜索,我们发现 ionic-team/ionic#5310 提供了一种方案,原来的 button
还是保持 block 的显示布局不变,将 flex 布局的属性设置在里面的 span
元素上。经测试,这种方案在我们需要兼容的机型( and 4.4.4+ / iOS 8.4+ )上都能正常工作。
.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 containers 。
2020 年了,希望大家都能往小康冲刺,都能换上更好更新的手机,也希望 Web 前端能够尽早摆脱对较低版本浏览器内核的兼容吧。
button 使用 flex 布局的兼容性问题的更多相关文章
- 一个典型的flex布局,兼容性比较好
html 代码: <body class="flex-wrap col-flex"> <header class="midCenter flex-wra ...
- flex布局简单兼容性写法
/* 定义 */ .flex-def { display: -webkit-box; /* 老版本语法: Safari, iOS, Android browser, older WebKit brow ...
- flex布局应用于踩坑
一.预告 本文不是一篇入门的文章所有请符合以下条件的战斗人员绕道: 1.初学前端,对前端的传统布局还不是很熟悉的人 2.后端人员对前端不打算深入学习的同学 二.开篇 flex布局原本是好几个月前就一直 ...
- flex布局应用与踩坑
一.预告 本文不是一篇入门的文章所有请符合以下条件的战斗人员绕道: 1.初学前端,对前端的传统布局还不是很熟悉的人 2.后端人员对前端不打算深入学习的同学 二.开篇 flex布局原本是好几个月前就一直 ...
- flex布局详解
1.背景介绍 传统的布局解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C ...
- 小程序 当button遇上Flex布局
当需要将button按行排列,当超过一行时,可以换行,从左到右排列,想实现如下效果(实现的比较粗糙,能说明问题就行,呵~~~): 使用Flex布局,在设置主轴方向上对齐方式,使用justify-con ...
- display:flex和display:box布局浏览器兼容性分析
display:flex和display:box都可用于弹性布局,不同的是display:box是2009年的命名,已经过时,用的时候需要加上前缀:display:flex是2012年之后的命名.在实 ...
- 关于flex布局中的兼容性问题
这几天在做项目中用到了flex布局,但是在测试的过程中发现他的兼容性实在是太差了,仅仅用到水平和垂直居中的样式,没想到兼容性代码就写了好几行. display:flex; display:-webki ...
- 当小程序的flex布局遇到button时,justify-content不起作用的原因及解决方案
当小程序的flex布局遇到button时 发现justify-content不起作用,无论怎么设置都是space-around的效果. 经过排查,发现原因是小程序button中的默认样式中的margi ...
随机推荐
- uni-app设置 video开始播放进入全屏状态
有一video标签 <video id="myVideo" :src="videoUrl"></video> 获取 video 上下文 ...
- ASCII代码表
>>ASCII代码表<<
- python selenium处理JS只读(12306)
12306为例 js = "document.getElementById('train_date').removeAttribute('readonly');" driver.e ...
- 割点(tarjan)
对于根来说,如果它有超过1棵子树,那么它是一个割点 对于非叶结点来说,如果它的某一个儿子没有回边能到达高于它的点,那么它是一个割点 叶节点不是割点 //洛谷3388 #include<algor ...
- Mockito 使用
1. 算术测试类 package com.smart.test.mockito; public interface Calculator { public int add(int a, int b); ...
- C# 如何写出一个不能被其他程序集继承的抽象类
我需要限定某个抽象类只能在我程序集类实现,而不支持其他程序集实现,也就是我需要一个不能被继承的抽象类 在 C# 里面有抽象类和接口,这两个都是期望被继承才能被使用,而抽象类是可以做到只能在自己程序集和 ...
- js简单实现promise
function myPromise(fn){ let status='pending',successCallback=[],failedCallback=[],data=null,reason=n ...
- Vsual Studio 2010可用的sqlite驱动程序(实体数据模型使用)
背景 昨天一个旧的项目(.net framework 4 + EF4 +sqlite + edmx db first),数据库结构有变更,要更新实体edmx模型 先是到官网下载最新的驱动,结果不能更新 ...
- css3条件判断_@supports的用法 以及 Window.CSS.supports()的使用
为了判断浏览器是否支持css3的一些新属性样式,当不兼容该样式的时候,我们可以更优雅的降级处理.这就需要使用到css3的条件判断功能:在css中支持@supports标记.或者在js中使用CSS.su ...
- 赋值、关系、逻辑运算、if、switch case
cout << boolalpha将打印输出0转为false,1转为true 逻辑运算符: &&(与) 且 两个条件为真时结果为真 ||(或) 或 两个 ...