从移动端webAPP谈起:flex弹性布局

之前的业务以移动端web app为主,页面结构基本上差不多,大概的思路是,横向流动布局,自动铺满宽度,纵向不做限定,由页面元素自上向下堆砌,然后在容器设置滚动就好了。其中,横向布局我花了点时间研究。

例如一个很常见顶栏组件,分左(按钮)中(标题)右(按钮)三个部分:




在不知道flex布局之前,我的方法是:中间铺满父元素,左右按钮做绝对定位,这样能够保持两边按钮组的定位,中间内容铺满,应付这种布局虽说不够严谨,但也能接受。

但是在处理下面这种表单的时候,这个布局就没用了:




首先,这个组件有着明确的边界区分,不能再像上面一样模糊边界,另外,左右两个元素宽度是不确定的,也就是说左边是“刚性的”,宽度由内容决定,而右边是“弹性的”,占据除了左边元素宽度以外的父元素的宽度,整个过程需要是自动的,无需手动改写结构和样式。这样的话,传统的定位和百分比就很难做到,为了适应这种布局,W3C推出了新的CSS属性:flex。

flex布局分两个部分,父元素设定子元素的布局规则,子元素决定自己的布局规则:


父元素:

display : flex//声明该父元素为弹性布局
flex-direction : row | row-reverse | column | column-reverse//控制子元素排列方向:从左到右(默认),从右到左,从上到下,从下到上
flex-wrap : nowrap | wrap | wrap-reverse//控制子元素换行情况:不换行(默认),换行(下一行在下方),换行(下一行在上方)
flex-flow : flex-direction||flex-wrap//direction和wrap的简写属性
justify-content : flex-start | flex-end | center | space-between | space-around//控制子元素的对齐方式(以从左到右为例):左对齐(默认),右对齐,居中,两端对齐,项目间间隔相等
align-items : flex-start | flex-end | center | baseline | stretch//控制交叉方向上(水平->垂直)的对齐方式,其中stretch为默认值,子元素将占满交叉方向的全部高度/宽度
align-content : flex-start | flex-end | center | space-between | space-around | stretch//当出现换行的时候,这个属性控制多行之间的对齐方式(与justify-content相似)


子元素:

order : number//控制排位顺序,数字越小越靠前(可以是负数)
flex-grow : number//控制放大比例
flex-shrink : number//控制缩小比例,与shrink类似
flex-basis : length|auto//控制元素弹性处理前的原大小,可设置为CSS的length属性,默认为auto
flex : flex-grow || flex-shrink || flex-basis//简写属性,默认为0 1 auto
align-self : auto | flex-start | flex-end | center | baseline | stretch//这个属性可以使当前子元素脱离父元素的对齐规则,单独设定自己的对齐规则


举个例子来说:

.wrap{display:flex;display:-webkit-flex;}
.div1{flex-grow:1;}
.div2{flex-grow:1;}
.div3{flex-grow:2;}
.div4{width:100px;}

首先父元素wrap设置display:flex,使其子元素进行弹性布局,其中子元素变为类似inline-block的状态,块级元素的默认with:100%会失效,float,clear,vertical-align也会失效。在上面这个水平(默认)布局当中,存在三个带grow属性的div,和一个固定宽度的div,这种情况,浏览器会先算出父元素宽度,然后减去固定宽度100px,再根据grow比例去分配剩下的宽度,总grow的和是1+1+2=4,则div1的宽度占据剩余宽度的1/4,div3占据1/2,如此类推(当grow属性设为0的时候,元素的宽度不会发生改变,当作固定宽度处理)。如果子元素中只有一个元素拥有grow属性且不为0,则该元素将占据剩余的所有宽度,说到这里,之前说到的表单布局问题就迎刃而解了:

.wrap{display:flex;display:-webkit-flex;}
.left{width:auto;}
.right{flex-grow:1;}
这个时候,左边的标题宽度将会根据标题的实际内容而改变,而右边的内容将会占据除了标题以外的所有宽度,实现弹性布局。

同样flex布局也可以用来优化上面的顶栏布局。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Flex 和 Flash Builder 开发手机应用程序 目录 第 1 章: 入门 手机应用程序入门 手机、桌面和浏览器应用程序开发的差异 第 2 章: 开发环境 在 Flash Builder 中创建 Android 应用程序 在 Flash Builder 中创建 iOS 应用程序 创建 ActionScript 手机项目 设置手机项目首选参数 连接 Google Android 设备 连接 Apple iOS 设备 第 3 章: 用户界面和布局 手机应用程序的布局 在手机应用程序中处理用户输入 定义手机应用程序和启动屏幕 定义手机应用程序中的视图 定义手机应用程序中的选项卡 定义手机应用程序中的导航控件、标题控件和操作控件 在手机应用程序中使用滚动条 定义手机应用程序中的菜单 为手机应用程序中耗时的活动显示忙碌指示符 定义手机应用程序中的过渡效果 第 4 章: 应用程序设计和工作流 在手机应用程序中启用持久化机制 在一个手机应用程序中支持多个屏幕大小和 DPI 值 第 5 章: 文本 在手机应用程序中使用文本 手机应用程序中用户与文本的交互 在手机应用程序中支持屏幕键盘 在手机应用程序中嵌入字体 在手机控件中使用 HTML 文本 第 6 章: 外观设计 手机外观设计的基础知识 为手机应用程序创建外观 应用自定义手机外观 第 7 章: 运行和调试手机应用程序 管理启动配置 在桌面上运行和调试手机应用程序 在设备上运行和调试手机应用程序 第 8 章: 打包并导出手机应用程序 导出用于发行的 Android APK 包 导出用于发行的 Apple iOS 包 第 9 章: 部署 在移动设备上部署应用程序 在命令行上开发和部署手机应用程序
### 回答1: 当你尝试卸载一个文件系统时,如果该文件系统上还有进程在使用文件或目录,那么就会出现"device is busy"的错误信息。为了解决这个问题,你需要找到哪个进程在使用该文件系统,然后停止这些进程。可以使用以下命令来查找哪些进程在使用该文件系统: ``` sudo lsof /data/webapp/tools ``` 该命令会列出所有正在使用`/data/webapp/tools`的进程及其PID。然后,你可以使用`kill`命令停止这些进程。例如: ``` sudo kill -9 PID ``` 其中,`PID`是你想要停止的进程的ID。一旦没有任何进程在使用该文件系统,你就可以成功卸载它了。 ### 回答2: 当我们取消挂载NFS文件系统时,如果该文件系统当前被使用,系统会显示"umount.nfs4: /data/webapp/tools: device is busy"的错误信息。这意味着有进程或服务正在使用该文件系统,因此无法取消挂载。 为了成功取消挂载NFS文件系统,我们需要找到正在使用的进程,并停止它们。有几种方法可以实现这一点。 首先,我们可以使用"lsof"命令查找正在使用挂载点的进程。在终端中运行以下命令: lsof /data/webapp/tools 该命令会列出使用该挂载点的所有进程和服务。我们可以根据输出的信息确定哪些进程需要被停止。 其次,我们可以使用"fuser"命令来查找并结束使用挂载点的进程。在终端中运行以下命令: fuser -km /data/webapp/tools 该命令会结束使用该挂载点的所有进程。 一旦没有进程或服务在使用该文件系统,我们就可以成功取消挂载。在终端中运行以下命令: umount /data/webapp/tools 这样,我们就能够取消挂载NFS文件系统,并且不再出现"device is busy"的错误信息。 请注意,在取消挂载之前,请确保没有正在使用该文件系统的重要进程或服务。手动结束这些进程可能会导致系统不稳定或数据丢失。 ### 回答3: 当我们尝试使用命令`umount`取消挂载NFS目录时,有时候会遇到`umount.nfs4: /data/webapp/tools: device is busy`的错误消息。这个错误通常表示我们正在尝试取消挂载的设备或目录仍然处于活动状态。 有几种常见的原因导致此错误发生。首先,该目录可能仍然被其他进程使用,例如当前工作目录位于被挂载的目录下,或者有文件正在被读取或写入。 解决这个问题的一种简单方法是通过查找并终止占用该目录或设备的进程来解决。我们可以使用命令`lsof | grep /data/webapp/tools`来查找正在使用目录的进程。然后,可以使用`kill`命令终止这些进程。当进程终止后,我们可以再次尝试使用`umount`命令取消挂载。 如果这种方法不起作用,可能是因为该设备仍然处于某些打开的文件或进程的依赖下。在这种情况下,我们可以尝试强制取消挂载,使用`umount -f /data/webapp/tools`命令。但是需要注意的是,这可能会导致数据损失或其他问题,因此在使用强制取消挂载之前应该谨慎考虑。 除此之外,也有一些其他方法可以解决该错误,例如使用`fuser`命令或重启计算机等。但是,这些方法可能会带来其他问题或不适合所有情况,因此在采取行动之前最好先了解更多相关信息并谨慎操作。 总结起来,当遇到`umount.nfs4: /data/webapp/tools: device is busy`的错误时,我们可以通过查找并终止占用该设备或目录的进程来解决问题,或者尝试使用强制取消挂载的方法。但是在处理此问题时应谨慎行事,以免引起其他问题或数据丢失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值