微信小程序开发实战-第二周
第二周
2. flex弹性布局
作图工具https://www.processon.com/
2.1 了解弹性布局
Flex 是 Flexible Box 的缩写,意为"弹性布局",可以轻松的控制元素排列、对齐和顺序的控制。
现在的终端类型非常多,使用弹性盒模型可以让元素在不同尺寸终端控制尺寸。
主轴,交叉轴
justify-content
主轴的对齐方式
align-items
交叉轴的对齐方式
声明定义
容器盒子里面包含着容器元素,使用 display:flex
或 display:inline-flex
声明为弹性盒子。
声明块级弹性盒子
display:flex
声明内联级弹性盒子
display:inline-flex
flex-direction
用于控制盒子元素排列的方向。
值 | 描述 |
---|---|
row | 从左到右水平排列元素(默认值) |
row-reverse | 从右向左排列元素 |
column | 从上到下垂直排列元素 |
column-reverse | 从下到上垂直排列元素 |
flex-wrap
flex-wrap 属性规定flex容器是单行或者多行,同时横轴的方向决定了新行堆叠的方向。
选项 | 说明 |
---|---|
nowrap | 元素不拆行或不拆列(默认值) |
wrap | 容器元素在必要的时候拆行或拆列。 |
wrap-reverse | 容器元素在必要的时候拆行或拆列,但是以相反的顺序 |
行元素换行
水平排列反向换行
垂直元素换行
垂直元素反向换行
flex-flow
flex-flow
是 flex-direction
与 flex-wrap
的组合简写模式。
justify-content
用于控制元素在主轴上的排列方式,再次强调是主轴的排列方式。
选项 | 说明 |
---|---|
flex-start | 元素紧靠主轴起点 |
flex-end | 元素紧靠主轴终点 |
center | 元素从弹性容器中心开始 |
space-between | 第一个元素靠起点,最后一个元素靠终点,余下元素平均分配空间 |
space-around | 每个元素两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍 |
space-evenly | 元素间距离平均分配 |
水平排列元素,并使用 justify-content: flex-end
对齐到主轴终点
使用 space-evenly
平均分配容器元素
align-items
用于控制容器元素在交叉轴上的排列方式。
选项 | 说明 |
---|---|
stretch | 元素被拉伸以适应容器(默认值) |
center | 元素位于容器的中心 |
flex-start | 元素位于容器的交叉轴开头 |
flex-end | 元素位于容器的交叉轴结尾 |
拉伸适应交叉轴
如果设置了 width | height | min-height | min-width | max-width | max-height
,将影响stretch
的结果,因为 stretch
优先级你于宽高设置。
对齐到交叉轴的顶部
对齐到交叉轴底部
对齐到交叉轴中心
纵向排列时交叉轴排列
align-content
只适用于多行显示的弹性容器,它的作用是当flex容器在交叉轴上有多余的空间时,对元素的对齐处理。
选项 | 说明 |
---|---|
stretch | 将空间平均分配给元素 |
flex-start | 元素紧靠主轴起点 |
flex-end | 元素紧靠主轴终点 |
center | 元素从弹性容器中心开始 |
space-between | 第一个元素靠起点,最后一个元素靠终点,余下元素平均分配空间 |
space-around | 每个元素两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍 |
space-evenly | 元素间距离平均分配 |
水平排列在交叉轴中居中排列
align-self
用于控制单个元素在交叉轴上的排列方式,align-items
用于控制容器中所有元素的排列,而 align-self
用于控制一个弹性元素的交叉轴排列。
选项 | 说明 |
---|---|
stretch | 将空间平均分配给元素 |
flex-start | 元素紧靠主轴起点 |
flex-end | 元素紧靠主轴终点 |
center | 元素从弹性容器中心开始 |
flex-grow
用于将弹性盒子的可用空间,分配给弹性元素。可以使用整数或小数声明。
例如为三个DIV 弹性元素设置了1、3、6 ,即宽度分成10等份,第三个元素所占宽度为(宽度/(1+3+6)) X 6
。
如果弹性元素设置了宽度,将把(弹性盒子-弹性元素宽度和)后按照 flex-grow
进行分配 。
flex-shrink
与 flex-grow
相反 flex-shrink
是在弹性盒子装不下元素时定义的缩小值。
例如在600宽的弹性盒子中放了 1000 宽的弹性元素。并为最后两个元素设置了缩放,最后一个元素的缩放比例为 500 -( ( (1000-600) / (100X1+400x3+500X6) ) x 3 ) X 500 = 220.9,计算公式说明如下:
缩小比例 = 不足的空间 / (元素 1 宽度 x 缩小比例) + (元素 2 宽度 x 缩小比例) ...
最终尺寸 = 元素三宽度 - (缩小比例 x 元素 3 的宽度) X 元素宽度
flex-basis
flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。
可以是长度单位,也可以是百分比。flex-basis
的优先级高于width、height
属性。
优先级
flex-basis 优先级大于 width、height。
flex
flex是flex-grow、flex-shrink 、flex-basis缩写组合。
建议使用 flex 面不要单独使用 flex-grow / flew-shrink / flex-basis 。
下例定义平均分配剩余空间,并不进行尺寸缩小,基础尺寸为200px。
order
用于控制弹性元素的位置,默认为 order:0
数值越小越在前面,可以负数或整数。
下面是通过J动态改变order属性产生移动效果,因为本章节是讲CSS所以JS功能没有完善,只是体验一下order。
3.项目开发阶段
组件开发
新建components
目录用于存放所有组件
VsCode
中推荐使用wxapp-helper
和wechat-snippet
插件,快速开发
like
组件
新建一个组件like
点赞小红心组件
在页面的JSON
文件中配置使用的组件
接收一个JSON
对象
引用组件
引用v-like
组件,使用绝对路径
"usingComponents": {
"v-like": "/components/like/index"}
使用组件
<v-like />
在like
目录下新建images
,用于存储组件所用的图片
小程序中像素单位px
和rpx
,
iPhone6
下为二倍换算关系
新建app.wxss
文件,定义全局样式
- 组件只能继承部分全局样式
- 页面可以继承全局样式
- 组件最好不要留有空隙
组件代码
<view class="container">
<image src="images/like.png" />
<text>
9
</text>
</view>
.container {
display: inline-flex;
flex-direction: row;
padding: 10rpx;
}
.container image {
width: 32rpx;
height: 28rpx;
}
.container text {
font-size: 24rpx;
color: #bbbbbb;
line-height: 24rpx;
position: relative;
bottom: 30rpx;
left: 6rpx;
}
组件事件与事件处理-状态切换
bind:tap="onLike"
定义点击
在index.js
中的methods
中定义处理函数
数据来源的三种方式
- 直接写在
WXML
中 JS
中获取- 从服务器获取
数据绑定
数据定义在data
中
三元表达式
like?count1:count2
使用三元表达式来实现点赞与不点赞的效果
组件的封装性开放性及粒度
开放数据,开发数据
properties
组件的属性列表
like: {
type: Boolean,
value: false,
observer: function () {
}
}
// components/like/index.js
Component({
/** * 组件的属性列表 */
properties: {
like: {
type: Boolean,
value: false,
observer: function () {
}
},
count: {
type: Number
}
},
/** * 组件的初始数据 */
data: {
// 点赞数据绑定
count: 99,
like: false
},
/** * 组件的方法列表 */
methods: {
onLike: function (event) {
let like = this.properties.like
let count = this.properties.count
count = like?count-1:count+1
this.setData({
count: count,
like: !like
})
}
}
})