2017年如何在移动端优雅的使用flex

本文讲的是2017年如何在移动端优雅的使用flex,做过移动端的同学都知道移动端布局太难了,终端太多了,传统的布局方式已经力不从心,各种新的布局方式被发明

在flex之前,传统布局有流式布局(就是默认的方式),绝对定位布局,弹性布局(em),和浮动布局,其中浮动布局并不是为布局而设计的,使用起来略显繁琐

2009年,对前端来说是不平凡的一年,html5定稿,es5.1发布,flex应运而生,天生响应式,生而为布局,使用及其简单

但是理想很丰满,现实很骨感,flex三改其规范,浏览器实现不一,各种神坑,本文将总结2017年移动端使用flex的最佳实践和经验

兼容性

2017年9月份,现在来看下flex的兼容性,可以发现绝大部分都是绿色

上图中红色箭头代表我们应该兼容的浏览器情况,在国内,UC和QQ浏览器的份额不容忽视,上图中的 1 2 3 其实代表flex的三版语法,flex有09年版语法,11年版语法和标准语法;右上角带黄色小方块的代表需要添加-webkit-前缀

将上图总结一下,移动端需要的兼容情况如下:

再来看一下百度给出的移动设备的统计情况,分别是安卓和ios,可以发现现在需要兼容安卓4.1+,IOS7+,这里百度给出的数据,当然你应该根据自己产品的统计情况来确定兼容情况

总结一下本文各处的最佳实践,兼容性目标是安卓4.1+,IOS7+,UC和qq浏览器

属性对照

通过上面的目标和caniuse,很容易得出我们需要写09和标准两版语法,只有在两版语法中都存在属性才能使用,下面给出两版语法的对照关系,注意这不是语法指南,语法指南请看结尾处的推荐资料

容器的属性

容器属性包括:

  • display
  • flex-direction
  • flex-wrap
  • flex-flow
  • justify-content
  • align-items
  • align-content

项目的属性

项目属性包括:

  • order
  • flex-grow
  • flex-shrink
  • flex-basis
  • flex
  • align-self

采坑经验

一般来说只要09版语法有对应功能,就可以使用了,但是移动端还有一些坑,导致某些属性不能用

justify-content: space-around 不能用,旧版语法没有,但是可以用space-between+容器的padding模拟

flex-wrap: wrap 不能用,对应的旧版语法 box-lines: mutiple 大部分浏览器不支持,也就是说不能折行

uc span行内元素作为子项时 display 必须设置为block,最好直接使用块级元素

实战

说了这么多下面给一份标准的写法,一个flex属性应该这么写

webkit前缀09版 webkit前缀标准版 标准版 

举个例子,display: flex要这么写

display: -webkit-box;  display: -webkit-flex;  display: flex;  

一定有同学说这也太麻烦了,有没有啥简单的办法呢?还真有,共有三种办法,感谢前辈

第一种,编辑器插件,有一个叫做autoprefix插件,sublime就可以安装,你只需写标准属性,然后按一下快捷键就能够自动填充前缀属性。这种方法用起来最简单,但这种方法后面会不太好维护,比如有一天不需要09版语法了怎么破???一个一个去改吧,o(╯□╰)o

第二种,预处理器mixin,如果你用过less或者sass的话,一定知道mixin,下面已less 2.x为例,sass大同小异

.display-flex(@display: flex) {     & when (@display=flex) {         display: -webkit-box;     }     & when (@display=inline-flex) {         display: -webkit-inline-box;     }     display: e("-webkit-@{display}");     display: @display; }  .flex-direction(@direction) {     & when (@direction=row) {         -webkit-box-orient: horizontal;         -webkit-box-direction: normal;     }     & when (@direction=row-reverse) {         -webkit-box-orient: horizontal;         -webkit-box-direction: reverse;     }     & when (@direction=column) {         -webkit-box-orient: vertical;         -webkit-box-direction: normal;     }     & when (@direction=column-reverse) {         -webkit-box-orient: vertical;         -webkit-box-direction: reverse;     }     -webkit-flex-direction: @direction;     flex-direction: @direction; }  .flex-wrap(@wrap) {     & when (@wrap=nowrap) {         -webkit-box-lines: single;     }     & when (@wrap=wrap) {         -webkit-box-lines: multiple;     }     -webkit-flex-wrap: @wrap;     flex-wrap: @wrap; }  .justify-content(@justify-content) {     & when (@justify-content=flex-start) {         -webkit-box-pack: start;     }     & when (@justify-content=flex-end) {         -webkit-box-pack: end;     }     & when (@justify-content=center) {         -webkit-box-pack: center;     }     & when (@justify-content=space-between) {         -webkit-box-pack: justify;     }     -webkit-justify-content: @justify-content;     justify-content: @justify-content; }  .align-items(@align-items) {     & when (@align-items=flex-start) {         -webkit-box-align: start;     }     & when (@align-items=flex-end) {         -webkit-box-align: end;     }     & when (@align-items=center) {         -webkit-box-align: center;     }     & when (@align-items=baseline) {         -webkit-box-align: baseline;     }     & when (@align-items=stretch) {         -webkit-box-align: stretch;     }     -webkit-align-items: @align-items;     align-items: @align-items; }  .order(@order) {     -webkit-box-ordinal-group: @order;     -webkit-order: @order;     order: @order; }  .flex(@flex) {     -webkit-box-flex: @flex;     -webkit-flex: @flex;     flex: @flex; } 

在使用的只要一行就行了

.container {     .display-flex;     .flex-direction(row);     .justify-content(center); } 

上面的代码less编译完的结果如下

.container {     display: -webkit-box;     display: -webkit-flex;     display: flex;     -webkit-box-orient: horizontal;     -webkit-box-direction: normal;     -webkit-flex-direction: row;     flex-direction: row;     -webkit-box-pack: center;     -webkit-justify-content: center;     justify-content: center; } 

有同学说这么麻烦,我不想写啊?其实应该有人已经写好了,比如compass,可以参考一下

这种方式的前提就是已经使用了css预处理器,可维护性比第一种方法更好;但是以我的经验来说,其实大部分项目的mixin未必是有人维护的,比如可能有一天不需要前缀版本了,但是并一定会有人去更新的

第三种,css后处理器,其实自从postcss出来之后,自动加前缀的活就该交给postcss来做了,有了这个插件我们只需要配置要兼容的浏览器版本就可以了,加前缀的事情后处理器自动帮你解决,最近babel也出了一个类似的babel-env

fis中可以使用fis-postprocessor-autoprefixer这个插件,我在之前的文章《经验无线步骤页改版总结》中有介绍

webpack中可以使用postcss-loader这个loader

终于可以和浏览器前缀愉快的玩耍了^_^

普及一个小科普知识,css后面的实验室性不会再以加前缀的方式进行了,而是会通过浏览器的设置方式来显示开启实验属性,因为前缀的方式不够优雅。。。这锅主要还是怪前端开发者,因为我们啊,只写webkit前缀,都不写标准属性,o(╯□╰)o

总结

希望本文能够帮助你更好的使用flex,少踩一些坑,现在在移动端已经可以任性的使用flex了,但pc端还不行,ie8。。。如果没有兼容性问题,那就快来使用这一好用的布局方式吧

本文作者:颜海镜

来源:51CTO

原文标题:2017年如何在移动端优雅的使用flex

时间: 2024-10-05 18:34:11

2017年如何在移动端优雅的使用flex的相关文章

网络安全需求端市场广 产业发展谋求开放与协作

8月17日,WIND网络安全指数收涨1.31%,这已经是该板块连续第四天上涨.此前经历大幅调整的网络安全板块出现回暖迹象,WIND网络安全指数近一个月累计上涨了12.22%.随着6月1日<网络安全法>的全面实施以及"WannaCry"勒索病毒席卷全球,一系列事件让网络安全产业站上资本风口.随着数字经济的发展,网络安全发展提速的重要性凸显,产业发展谋求开放与协作的诉求变得愈发强烈. 需求端市场广 数字经济已经上升为国家战略,并成为拉动我国经济增长的引擎,以及产业转型升级的突破

移动端商旅预订将达在线预定总量的25%

摘要: 商旅管理公司CWT(Carlson Wagonlit Travel)近期有研究称,未来三年移动端的预订市场将会有急速的增长.到2017年时,移动端的商旅预订量将占到在线预订总量的25%. CWT还做了一个对比来说 商旅管理公司CWT(Carlson Wagonlit Travel)近期有研究称,未来三年移动端的预订市场将会有急速的增长.到2017年时,移动端的商旅预订量将占到在线预订总量的25%. CWT还做了一个对比来说明这个增长的剧烈程度--未来三年移动端预订工具可以实现的活跃程度,

asp.net使用socket链接c++服务端

问题描述 最近刚入门asp.net,最近使用socket链接c++服务端我最近做一个asp.net的web站点,要求链接到c++服务端进行通信这个服务端原本是负责flex开发的im通信的publicfunctionConnectServer():void{try{if(!connected){socket.connect(ip,port);}}catch(e:Error){}}在线急等 解决方案 解决方案二:能力有限,友情帮你顶C#里的winfrom编程的"网络编程"方面有说到这些(不

浪潮存储持续发力中高端市场,100%+年比增长

10月17日,浪潮在京举办"智享无限,高端领航"-- 2017年浪潮存储高端业务战略暨智能全闪G2-F新品上市研讨会.依托智慧计算,浪潮存储聚焦场景化,不断探索企业数字化.智能化转型中数据存储的需求变化,推进存储高端技术创新和高端市场布局,2017年上半年在存储中高端市场实现三位数增长. 浪潮存储高端路线聚焦在智能存储平台.软件定义存储和全固态存储三大存储主流领域,基于企业业务场景,联合ISV做了大量技术和商业模式方面的创新,成为可信赖的数据存储专家."自2015年发力高端以

新秩序下 网络安全进入新形式

飞速发展的互联网行业背后,互联网安全问题正在成为隐患.本周二,以"安全新秩序连接新机遇"为主题的第三届中国互联网安全领袖峰会(Cyber Security Summit 2017,简称"CSS2017")在京召开. 作为全球规模最大的互联网产业安全交流盛会,CSS2017 汇聚了全球安全产业中的领袖级人物,包括"世界头号黑客"凯文·米特尼克(Kevin Mitnick).Visa副董事长兼首席风险官艾睿琪(Ellen Richey).IBM Se

第三届中国互联网安全领袖峰会:聚焦新秩序下网络安全之道

以"安全新秩序 连接新机遇"为主题的第三届中国互联网安全领袖峰会(Cyber Security Summit 2017,简称"CSS2017")在京召开.来自全球的顶尖安全专家就金融安全.大数据与云安全.人工智能与安全伦理 .安全法治治理.智能硬件与物联网安全等多个议题探讨全新环境和形势下网络安全的新秩序构建.安全连接数字经济的新发展机遇.本届峰会聚集了超过500家机构和企业的5000余位代表参会.中央网信办网络安全协调局副局长高林在开场致辞中表示:"网络

我国网民规模已达7.51亿 但网络安全值得警惕

近日,中央网信办移动网络管理局局长方楠表示,截至2017年6月底,我国网民规模已达7.51亿,其中手机网民规模达7.24亿,占96.3%. 方楠指出,当前,我国已全面进入移动互联网时代,据中国互联网络信息中心2017年7月发布的<第40次中国互联网络发展状况统计报告>显示,截至2017年6月底,我国网民规模已达7.51亿,其中手机网民规模达7.24亿,占96.3%,较去年年底增加2830万人.与此同时,移动互联网以其泛在.连接.智能.普惠等突出优势,在便民服务方面推动了消费模式共享化.终端设备

登上 DEFCON 的最年轻黑客单好奇 |宅客故事

   1995年生的单好奇是 360 独角兽实验室的一名黑客,也是今年 2016 SyScan360 胸卡破解大赛初赛题的出题人.据说,当天有无数人败在了这10道题下,怒火冲向了出题人.对了,他还在2015年登上黑客盛会 DEFCON 的演讲台,成为这个大会二十多年历史上"最年轻的白帽子". 2016年11月30日,单好奇发了一条朋友圈:好喜欢,女朋友,设计的私宅(现在多说好话以后应该有折扣吧).后来,单好奇在雷锋网(公众号:雷锋网)编辑的逼问下,承认这条朋友圈是为了"讨好学

开源大数据周刊-第51期

阿里云E-Mapreduce动态 E-MapReduce张北可用区上线服务. E-MapReduce调度功能强化,支持分钟.小时.天.周.月,多种时间维度的调度. 资讯 Hadoop没有消亡,它是大数据的未来 有人认为 Hadoop 正在失败,但硅谷数据管理公司 Hortonworks 的总经理 Vamsi K. Chemitiganti 并不这么看,为了反驳此前一篇文章<为什么 Hadoop 正在消亡?(Why Hadoop is Failing)>的观点,他在自己的博客上写了一篇论述自己看