微信官方文档地址:

https://developers.weixin.qq.com/ebook?action=get_post_info&token=935589521&volumn=1&lang=zh_CN&book=miniprogram&docid=00080e799303986b0086e605f5680a

4.2 基本的布局方法——Flex布局

如果之前你接触过网页开发中的flexbox布局,基本上你可以略过这节。但有一点需要注意的是,你的小程序要求兼容到iOS8以下版本,需要开启样式自动补全。开启样式自动补全,在“项目”—“项目设置”—勾选“上传代码时样式自动补全”。

​ 图4-2 开发者工具开启样式自动补全

在小程序开发中,我们需要考虑各种尺寸终端设备上的适配。在传统网页开发,我们用的是盒模型,通过display:inline | block | inline-block、 position、float来实现布局,缺乏灵活性且有些适配效果难以实现。比如像下面这种常见的信息列表,要求内容高度不确定下保持垂直居中:

​ 图4-3 常见的信息列表排版方式

这种情况下,我们更建议用flex布局。

在开始介绍flex之前,为了表述方便,我们约定以下术语:采用flex布局的元素,简称为“容器”,在代码示例中以container表示容器的类名。容器内的元素简称为“项目”,在代码示例中以item表示项目的类名。

​ 图4-4 container容器和item项目

4.2.1 基本概念

flex的概念最早是在2009年被提出,目的是提供一种更灵活的布局模型,使容器能通过改变里面项目的高宽、顺序,来对可用空间实现最佳的填充,方便适配不同大小的内容区域。

在不固定高度信息的例子中,我们只需要在容器中设置以下两个属性即可实现内容不确定下的垂直居中。

.container{display: flex;flex-direction: column;justify-content: center;}

flex不单是一个属性,它包含了一套新的属性集。属性集包括用于设置容器,和用于设置项目两部分。

设置容器的属性有:

display:flex;flex-direction:row(默认值) | row-reverse | column |column-reverseflex-wrap:nowrap(默认值) | wrap | wrap-reversejustify-content:flex-start(默认值) | flex-end | center |space-between | space-around | space-evenlyalign-items:stretch(默认值) | center  | flex-end | baseline | flex-startalign-content:stretch(默认值) | flex-start | center |flex-end | space-between | space-around | space-evenly

设置项目的属性有:

order:0(默认值) | <integer>flex-shrink:1(默认值) | <number>flex-grow:0(默认值) | <number>flex-basis:auto(默认值) | <length>flex:none | auto | @flex-grow @flex-shrink @flex-basisalign-self:auto(默认值) | flex-start | flex-end |center | baseline| stretch

在开始介绍各个属性之前,我们需要先明确一个坐标轴。默认的情况下,水平方向的是主轴(main axis),垂直方向的是交叉轴(cross axis)。

​ 图4-5 默认情况下的主轴与交叉轴

项目是在主轴上排列,排满后在交叉轴方向换行。需要注意的是,交叉轴垂直于主轴,它的方向取决于主轴方向。

​ 图4-6 项目是在主轴上排列,排满后在交叉轴方向换行

接下来的例子如无特殊声明,我们都以默认情况下的坐标轴为例。

4.2.2 容器属性

设置容器,用于统一管理容器内项目布局,也就是管理项目的排列方式和对齐方式。

flex-direction 属性

通过设置坐标轴,来设置项目排列方向。

.container{flex-direction: row(默认值) | row-reverse | column | column-reverse
}

row(默认值):主轴横向,方向为从左指向右。项目沿主轴排列,从左到右排列。

row-reverse:row的反方向。主轴横向,方向为从右指向左。项目沿主轴排列,从右到左排列。

column:主轴纵向,方向从上指向下。项目沿主轴排列,从上到下排列。

column-reverse:column的反方向。主轴纵向,方向从下指向上。项目沿主轴排列,从下到上排列。

​ 图4-7 flex-direction

flex-wrap属性

设置是否允许项目多行排列,以及多行排列时换行的方向。

.container{flex-wrap: nowrap(默认值) | wrap | wrap-reverse
}

nowrap(默认值):不换行。如果单行内容过多,则溢出容器。
wrap:容器单行容不下所有项目时,换行排列。
wrap-reverse:容器单行容不下所有项目时,换行排列。换行方向为wrap时的反方向。

​ 图4-8 flex-wrap

justify-content 属性

设置项目在主轴方向上对齐方式,以及分配项目之间及其周围多余的空间。

.container{justify-content: flex-start(默认值) | flex-end | center | space-between | space-around| space-evenly}

flex-start(默认值):项目对齐主轴起点,项目间不留空隙。

center:项目在主轴上居中排列,项目间不留空隙。主轴上第一个项目离主轴起点距离等于最后一个项目离主轴终点距离。

flex-end:项目对齐主轴终点,项目间不留空隙。
space-between:项目间间距相等,第一个项目离主轴起点和最后一个项目离主轴终点距离为0。
space-around:与space-between相似。不同点为,第一个项目离主轴起点和最后一个项目离主轴终点距离为中间项目间间距的一半。

space-evenly:项目间间距、第一个项目离主轴起点和最后一个项目离主轴终点距离等于项目间间距。

​ 图4-9 justify-content

align-items 属性

设置项目在行中的对齐方式。

.container{align-items:stretch(默认值) | flex-start | center | flex-end | baseline}

stretch(默认值):项目拉伸至填满行高。
flex-start:项目顶部与行起点对齐。
center:项目在行中居中对齐。
flex-end:项目底部与行终点对齐。
baseline:项目与行的基线对齐。

​ 图4-10 align-items

align-content 属性

多行排列时,设置行在交叉轴方向上的对齐方式,以及分配行之间及其周围多余的空间。

.container{align-content: stretch(默认值) | flex-start | center | flex-end | space-between |space-around | space-evenly}

stretch(默认值):当未设置项目尺寸,将各行中的项目拉伸至填满交叉轴。当设置了项目尺寸,项目尺寸不变,项目行拉伸至填满交叉轴。

flex-start:首行在交叉轴起点开始排列,行间不留间距。

center:行在交叉轴中点排列,行间不留间距,首行离交叉轴起点和尾行离交叉轴终点距离相等。

flex-end:尾行在交叉轴终点开始排列,行间不留间距。
space-between:行与行间距相等,首行离交叉轴起点和尾行离交叉轴终点距离为0。
space-around:行与行间距相等,首行离交叉轴起点和尾行离交叉轴终点距离为行与行间间距的一半。

space-evenly:行间间距、以及首行离交叉轴起点和尾行离交叉轴终点距离相等。

​ 图4-11 align-content

4.2.3 项目属性

设置项目,用于设置项目的尺寸、位置,以及对项目的对齐方式做特殊设置。

order 属性

设置项目沿主轴方向上的排列顺序,数值越小,排列越靠前。属性值为整数。

.item{order: 0(默认值) | <integer>}

​ 图4-12 order

flex-shrink 属性

当项目在主轴方向上溢出时,通过设置项目收缩因子来压缩项目适应容器。属性值为项目的收缩因子,属性值取非负数。

.item{flex-shrink: 1(默认值) | <number>}.item1{width: 120px;flex-shrink: 2; }.item2{width: 150px;flex-shrink: 3; }.item3{// 项目3未设置flex-shrink,默认flex-shrink值为1width: 180px;}

为了加深理解,我们举个例子:

一个宽度为400px的容器,里面的三个项目width分别为120px,150px,180px。分别对这项目1和项目2设置flex-shrink值为2和3。

.container{display: flex;width: 400px; // 容器宽度为400px}

在这个例子中,项目溢出 400 - (120 + 150 + 180) = -50px。计算压缩量时总权重为各个项目的宽度乘以flex-shrink的总和,这个例子压缩总权重为120 2 + 150 3+ 180 * 1 = 870。各个项目压缩空间大小为总溢出空间乘以项目宽度乘以flex-shrink除以总权重:

item1的最终宽度为:120 - 50 120 2 / 870 ≈ 106px

item2的最终宽度为:150 - 50 150 3 / 870 ≈ 124px

item3的最终宽度为:180 - 50 180 1 / 870 ≈ 169px

其中计算时候值如果为小数,则向下取整。

​ 图4-13 flex-shrink

需要注意一点,当项目的压缩因子相加小于1时,参与计算的溢出空间不等于完整的溢出空间。在上面例子的基础上,我们改变各个项目的flex-shrink。

.container{display: flex;width: 400px; // 容器宽度为400px}.item1{width: 120px;flex-shrink: 0.1; }.item2{width: 150px;flex-shrink: 0.2; }.item3{width: 180px;flex-shrink: 0.3;}

总权重为:120 0.1 + 150 0.2 + 180 0.3 = 96。参与计算的溢出空间不再是50px,而是50 (0.1 + 0.2 + 0.3) / 1 =30:

item1的最终宽度为:120 - 30 120 0.1 / 96 ≈ 116px

item2的最终宽度为:150 - 30 150 0.2 / 96 ≈ 140px

item3的最终宽度为:180 - 30 180 0.3 / 96≈ 163px

flex-grow 属性

当项目在主轴方向上还有剩余空间时,通过设置项目扩张因子进行剩余空间的分配。属性值为项目的扩张因子,属性值取非负数。

.item{flex-grow: 0(默认值) | <number>}

为了加深理解,我们举个例子:

一个宽度为400px的容器,里面的三个项目width分别为80px,120px,140px。分别对这项目1和项目2设置flex-grow值为3和1。

.container{display: flex;width: 400px; // 容器宽度为400px}.item1{width: 80px;flex-grow: 3; }.item2{width: 120px;flex-grow: 1; }.item3{// 项目3未设置flex-grow,默认flex-grow值为0width: 140px;}

在这个例子中,容器的剩余空间为 400 - (80 + 120 + 140) = 60px。剩余空间按 60 / (3 + 1 + 0) = 15px进行分配:

item1的最终宽度为:80+ (15 * 3) = 125px

item2的最终宽度为:120 + (15 * 1) = 135px

item3的最终宽度为:140 + (15 * 0) =140px

​ 图4-14 flex-grow

需要注意一点,当项目的扩张因子相加小于1时,剩余空间按除以1进行分配。在上面例子的基础上,我们改变各个项目的flex-grow。

.container{display: flex;width: 400px; // 容器宽度为400px}.item1{width: 50px;flex-grow: 0.1; }.item2{width: 80px;flex-grow: 0.3; }.item3{width: 110px;flex-grow: 0.2;}

在这个例子中,容器的剩余空间为 400 - (50 + 80 + 110) = 160px。由于项目的flex-grow相加0.1 + 0.3 + 0.2 = 0.6小于1,剩余空间按 160 / 1 = 160px划分。例子中的项目宽度分别为:

item1的最终宽度为:50 + (160 * 0.1) = 66px

item2的最终宽度为:80 + (160 * 0.3) = 128px

item3的最终宽度为:110 + (160 * 0.2) = 142px

flex-basis 属性

当容器设置flex-direction为row或row-reverse时,flex-basis和width同时存在,flex-basis优先级高于width,也就是此时flex-basis代替项目的width属性。

当容器设置flex-direction为column或column-reverse时,flex-basis和height同时存在,flex-basis优先级高于height,也就是此时flex-basis代替项目的height属性。

需要注意的是,当flex-basis和width(或height),其中一个属性值为auto时,非auto的优先级更高。

.item{flex-basis: auto(默认值) | <number>px}

​ 图4-15 flex-basis

flex 属性

是flex-grow,flex-shrink,flex-basis的简写方式。值设置为none,等价于00 auto。值设置为auto,等价于1 1 auto。

.item{flex: none | auto | @flex-grow @flex-shrink@flex-basis}

align-self 属性

设置项目在行中交叉轴方向上的对齐方式,用于覆盖容器的align-items,这么做可以对项目的对齐方式做特殊处理。默认属性值为auto,继承容器的align-items值,当容器没有设置align-items时,属性值为stretch。

.item{align-self: auto(默认值) | flex-start | center | flex-end | baseline |stretch}

​ 图4-16 align-self

微信小程序布局干货——来自微信官方相关推荐

  1. 微信小程序布局技巧(三)

    微信小程序布局技巧(三) 前言 小程序适配 物理像素 小程序中的px px和rpx转换 应用 尾巴 前言 本文是微信小程序(本文后面统称小程序)布局技巧系列最后一篇文章,主要说明小程序的屏幕适配问题. ...

  2. 微信小程序自定义模态框,官方版本与自定义可扩展版本

    微信小程序自定义模态框,官方版本与自定义可扩展版本 提示:文章最后有源码,可自取 文章主要通过模仿官方的模态框进行自定义模态框的设计,我将会先讲述原理,然后给出源码,最后指出一些需要注意的地方 提示: ...

  3. python开发微信小程序-Python 开发者的微信小程序开发实践

    导读 在知乎上,有人提问"如何使用 Python 开发微信小程序". 其实微信小程序作为一个前端的机制,Python 并不能插上边.只不过可以作为后端接口为微信小程序提供数据服务而 ...

  4. 基于微信小程序开发的仿微信demo

    (本文参考自github/liujians,地址:https://github.com/liujians/weApp) 作者声明: 基于微信小程序开发的仿微信demo  整合了ionic的样式库和we ...

  5. 微信小程序全选,微信小程序checkbox,微信小程序购物车

    微信小程序,这里实现微信小程序checkbox,有需要此功能的朋友可以参考下. 摘要: 加减商品数量,汇总价格,全选与全不选 设计思路: 一.从网络上传入以下Json数据格式的数组  1.标题titl ...

  6. 微信小程序装修解决方案ppt_微信小程序开发教程.ppt

    微信小程序开发教程.ppt 从开发CMS系统学起 从入门到精通的微信小程序开发教程 学微信小程序开发 从实践中学习是开发者最好最快的学习方法.本教程将和大家从零开始 一步一步搭建微信小程序CMS系统, ...

  7. 微信小程序 python 自动化测试_微信小程序的自动化测试框架

    微信小程序的自动化测试框架 微信发布了小程序的自动化测试框架Minium,提供了多种运行验证方式,其特点: 支持一套脚本,iOS & Android & 模拟器,三端运行 提供丰富的页 ...

  8. 微信小程序---- 获取手机号(微信最新更新)

    微信小程序---- 获取手机号(微信最新更新) 前言:需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphone ...

  9. 视频教程-微信小程序项目-豆瓣评分-微信开发

    微信小程序项目-豆瓣评分 北京八维研修学院技术工程师,5年大型项目实战开发经验,3年授课经验. 孟宪杰 ¥68.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP订 ...

最新文章

  1. 操作系统知识点:全面
  2. HttpURLConnection 请求
  3. 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
  4. 红帽虚拟化RHEV-架构简介
  5. mysql读写分离_Mysql数据库09MySQL读写分离
  6. 【Qt】QModbusRtuSerialMaster类
  7. 人工智能秘史(四):憧憬人机共生的“DARPA梦想家”
  8. JS !(非运算)详解
  9. 计算点在哪些四边形内
  10. H3C交换机定时重启配置方法
  11. JavaScript实现DoublyLinkedList双链表的算法(附完整源码)
  12. 2022年上半年5月网络工程师试题及答案
  13. “select count (1)”是什么意思?
  14. 【数学解析几何】C_几种常见的函数曲线——(典型曲线图)
  15. 深度剖析为何选取相关性系数评价因子
  16. 计算机蓝屏无法启动代码50,教您电脑蓝屏代码 0x00000050 如何快速修复
  17. 语言模型及RNN模型
  18. 搜狗输入法For Linux
  19. 当Godot游戏引擎遇上物联网,可以开出怎样的花
  20. pandas将dataframe的所有数据列的名称转化为大写形式(all column labels in dataframe to uppercase)

热门文章

  1. 【经验】展会结束后跟进客户最佳方案
  2. im即时通讯开发之后台应用保活、消息推送的噩梦
  3. 深度学习入门(三)——神经元激活值的计算方法
  4. (一)ProxmoxVE 初识
  5. search - indexOf区别
  6. [每天读一点英文:那些给我勇气的句子]The Daffodil Principle
  7. postgres install + postgis install(二)
  8. 靶场练习Exploiting cross-site scripting to steal cookies
  9. 每日一练--世纪难题
  10. 在一家公司待久了没有目标,没有动力,我该怎么办?