【前言】
小程序按照应用场景将组件分为以下几个常用类型
首先新建视图文件夹,编写测试视图容器组件代码,文件结构:
为了方便查看调试代码,接下来新建个组件相关的tabBar,用来测试相关组件效果
<view class="list-area">
<block wx:for="{{list}}" wx:key="name">
<view class="list-item" bindtap="{{item.tap}}">
<text>{{item.name}}</text>
<view class="list-item-btn">
<image src="/static/tabs/right.png"></image>
</view>
</view>
</block>
</view>
.list-item{
width: 100%;
height: 100rpx;
border-bottom: 2rpx solid rgba(0, 0, 0, 0.1);
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
padding: 0 20rpx;
color: #666;
}
.list-item-btn image{
display: block;
width: 40rpx;
height: 40rpx;
}
data: {
list:[
{ name: '视图容器组件', tap: 'viewFn' },
{ name: '基础内容组件', tap: 'basicFn' },
{ name: '表单组件', tap: 'formFn' },
{ name: '导航组件', tap: 'navigateFn' },
{ name: '媒体组件', tap: 'mediaFn' },
{ name: '地图组件', tap: 'mapFn' },
{ name: '画布组件', tap: 'canvasFn' }
]
},
View组件:是小程序里面的基本组件,它相当于HTML里面的div标签,它拥有几个很棒的属性,可以用来简化我们的小程序开发。
参数:
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
hover-class | string | none | 否 | 指定按下去的样式类。当 hover-class=“none” 时,没有点击态效果 |
hover-stop-propagation | boolean | false | 否 | 指定是否阻止本节点的祖先节点出现点击态 |
hover-start-time | number | 50 | 否 | 按住后多久出现点击态,单位毫秒 |
hover-stay-time | number | 600 | 否 | 手指松开后点击态保留时间,单位毫秒 |
①swiper滑块容器组件默认样式
swiper{
display: block;
height: 150px;
}
②swiper-item默认宽高100%
③image图片默认样式
image{
width: 320px;
height: 240px;
display: inline-block;
overflow: hidden;
}
接下来调整下样式
swiper{
width: 100%;
height: 400rpx;
}
swiper swiper-item{
width: 100%;
height: 360rpx;
}
swiper swiper-item image{
width: 100%;
height: 100%;
display: block;
}
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
indicator-dots | boolean | false | 否 | 是否显示面板指示点 |
indicator-color | color | rgba(0, 0, 0, .3) | 否 | 指示点颜色 |
indicator-active-color | color | #000000 | 否 | 当前选中的指示点颜色 |
滑块swiper-item组件一般都是通过循环得出,所以这里做下调整
<swiper indicator-dots="{{dotsStatus}}"
indicator-color="{{dotsColor}}"
indicator-active-color="{{dotsActiveColor}}"
class="banner-area">
<block wx:for="{{bannerList}}" wx:key="imgSrc">
<swiper-item class="banner-area">
<image src="{{item.imgSrc}}"></image>
</swiper-item>
</block>
</swiper>
/**
* 页面的初始数据
*/
data: {
bannerList:[
{ imgSrc: 'https://up.enterdesk.com/edpic/a0/6c/56/a06c563866a72c23c6d5e65dbf9f0ecc.jpg' },
{ imgSrc: 'https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/00/0A/ChMkJlZqeICIbp_iAAWDtBLmwSoAAGByAFxWdUABYPM819.jpg' },
{ imgSrc: 'https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/00/0A/ChMkJ1ZqeHmIEPu6AAc_ov0pLUsAAGBxwHyDMUABz-6707.jpg' }
],
dotsStatus:true,/**开启指示点 */
dotsColor:'rgba(0,0,0,0.2)',/**指示点颜色 */
dotsActiveColor: '#000000'/**激活点颜色 */
},
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
autoplay | boolean | false | 否 | 是否自动切换 |
interval | number | 5000 | 否 | 自动切换时间间隔 |
duration | number | 500 | 否 | 滑动动画时长 |
circular | boolean | false | 否 | 是否采用衔接滑动 |
vertical | boolean | false | 否 | 滑动方向是否为纵向 |
current | number | 0 | 否 | 当前所在滑块的 index() |
自动切换与方向:接下来依次测试下
<swiper indicator-dots="{{dotsStatus}}"
indicator-color="{{dotsColor}}"
indicator-active-color="{{dotsActiveColor}}"
class="banner-area"
autoplay="{{autoplayValue}}"
interval="{{intervalValue}}"
duration="{{durationValue}}"
circular="{{circularValue}}"
vertical="{{verticalValue}}"
current="{{currentValue}}">
<block wx:for="{{bannerList}}" wx:key="imgSrc">
<swiper-item class="banner-area">
<image src="{{item.imgSrc}}"></image>
</swiper-item>
</block>
</swiper>
data: {
bannerList:[
{ imgSrc: 'https://up.enterdesk.com/edpic/a0/6c/56/a06c563866a72c23c6d5e65dbf9f0ecc.jpg' },
{ imgSrc: 'https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/00/0A/ChMkJlZqeICIbp_iAAWDtBLmwSoAAGByAFxWdUABYPM819.jpg' },
{ imgSrc: 'https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/00/0A/ChMkJ1ZqeHmIEPu6AAc_ov0pLUsAAGBxwHyDMUABz-6707.jpg' }
],
dotsStatus:true,/**开启指示点 */
dotsColor:'rgba(0,0,0,0.2)',/**指示点颜色 */
dotsActiveColor: '#000000',/**激活点颜色 */
autoplayValue:true,/**开启自动播放 */
intervalValue: '3000',/**自动切换时间间隔 */
durationValue: '600',/**滑动动画时长 */
circularValue: true,/**是否采用衔接滑动 */
verticalValue: false,/**滑动方向是否为纵向 */
currentValue: '0'/**当前所在滑块的index */
},
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
previous-margin | string | “0px” | 否 | 前边距,可用于露出前一项的一小部分,接受 px 和 rpx 值 |
next-margin | string | “0px” | 否 | 后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值 |
display-multiple-items | number | 1 | 否 | 同时显示的滑块数量 |
bindchange | function | 否 | current 改变时会触发 change 事件 |
布局样式
previous-margin | string | “0px” | 否 | 前边距,可用于露出前一项的一小部分,接受 px 和 rpx 值 |
---|---|---|---|---|
next-margin | string | “0px” | 否 | 后边距,可用于露出后一项的一小部分,接受 px 和 rpx 值 |
<swiper previous-margin="{{previousMargin}}" next-margin="{{nextMargin}}">
<!-- 轮播内容 -->
</swiper>
data{
previousMargin:'60rpx',/**前边距 */
nextMargin:'60rpx'/**后边距 */
},
bindchange | function | 否 | current 改变时会触发 change 事件 |
---|
bindchange="changeSwiper"
/**切换触发 */
changeSwiper(event){
console.log(event.detail);
},
current:当前滑块组件索引;
source:切换的原因/操作
仅可放置在swiper组件中,宽高自动设置为100%
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
item-id | string | 无 | 否 | 该 swiper-item 的标识符 |
设置完item-id即滑块组件swiper-item 的标识符后,bindchange事件触发时,便可获取该滑块组件标识符currentItemId
从 1.4.0 开始,change事件增加 source字段,表示导致变更的原因,可能值如下:
微信小程序swiper实现滑动放大缩小效果
篇幅问题,详情参见下节小编文章
滑块视图容器swiper属性
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
easing-function | string | “default” | 否 | 指定 swiper 切换缓动动画类型 |
easing-function 的合法值
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
bindtransition | function | 无 | 否 | swiper-item 的位置发生改变时会触发 transition 事件,event.detail = {dx: dx, dy: dy} |
bindanimationfinish | function | 无 | 否 | 动画结束时会触发 animationfinish 事件,event.detail 同上 |
/**swiper-item的位置发生改变时会触发transition事件 */
bindtransitionFn(event){
console.log(event.detail);
},
bindtransition属性设置完毕后,此时滑动轮播图,会触发该事件
bindanimationfinish
bindanimationfinish="bindanimationfinishFn"
/**动画结束时触发 */
bindanimationfinishFn(option){
console.log(option)
},
小结:
类似于swiper-item和swiper关系。movable-view移动视图必须在 movable-area 移动区域组件中,并且必须是直接子节点,否则不能移动
movable-view为可移动视图,在页面中可以拖拽滑动。
<view>scroll-view可移动视图区域</view>
<movable-area class="moveArea">
<movable-view direction="all" class="moveViewl"></movable-view>
</movable-area>
/* 可移动容器 */
.moveArea{
width: 100%;
height: 300rpx;
background-color: rgba(0, 0, 0, 0.1);
}
/* 可移动区域 */
.moveArea .moveViewl{
width: 50rpx;
height: 50rpx;
background-color: rgba(0, 0, 0, 0.3);
}
注意:类似于swiper-item和swiper关系。movable-view移动视图必须在 movable-area 移动区域组件中,并且必须是直接子节点,否则不能移动
movable-view参数
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
direction | string | none | 否 | movable-view的移动方向,属性值有all、vertical、horizontal、none |
inertia | boolean | false | 否 | movable-view是否带有惯性 |
out-of-bounds | boolean | false | 否 | 超过可移动区域后,movable-view是否还可以移动 |
friction | number | 2 | 否 | 摩擦系数,用于控制惯性滑动的动画,值越大摩擦力越大,滑动越快停止;必须大于0,否则会被设置成默认值 |
disabled | boolean | false | 否 | 是否禁用 |
scale | boolean | false | 否 | 是否支持双指缩放,默认缩放手势生效区域是在movable-view内 |
scale-min | number | 0.5 | 否 | 定义缩放倍数最小值 |
scale-max | number | 10 | 否 | 定义缩放倍数最大值 |
scale-value | number | 1 | 否 | 定义缩放倍数,取值范围为 0.5 - 10 |
direction
direction为可移动方向:all所有方向、vertical竖直方向、horizontal水平方向、none不移动
inertia
inertia惯性设置为true时,松开手指后,移动视图movable-view仍然会滑行一段距离。
out-of-bounds
out-of-bounds(极限/限制范围)设为true时,超出仍可移动
friction
friction摩擦系数越大(高速路),惯性滑动距离越短;friction摩擦系数越小(滑冰场),惯性滑动距离越远;
disabled
官方文档:disabled为true时禁用移动视图
问题:disabled="false"
时,与设置为true一样。
注意:与hover-stop-propagation属性类似,只要添加了该属性,不管设置为true还是false,都会禁用生效。
scale
问题:movable-view设置scale为true后,发现无法缩放
原因:可移动视图movable-view太小,缩放手势生效区域小,重设视图大小即可
/* 可移动区域 */
.moveArea .moveViewl{
width: 200rpx;
height: 200rpx;
background-color: rgba(0, 0, 0, 0.3);
}
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
scale-area | Boolean | false | 否 | 当里面的movable-view设置为支持双指缩放时,设置此值可将缩放手势生效区域修改为整个movable-area |
给可移动视图区域movable-area设置scale-area为true时,此时便将缩放手势生效区域修改为整个movable-area
movable-view参数
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
scale-min | number | 0.5 | 否 | 定义缩放倍数最小值 |
scale-max | number | 10 | 否 | 定义缩放倍数最大值 |
scale-value | number | 1 | 否 | 定义缩放倍数,取值范围为 0.5 - 10 |
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
x | number | 无 | 否 | 定义x轴方向的偏移,如果x的值不在可移动范围内,会自动移动到可移动范围;改变x的值会触发动画 |
y | number | 无 | 否 | 定义y轴方向的偏移,如果y的值不在可移动范围内,会自动移动到可移动范围;改变y的值会触发动画 |
damping | number | 20 | 否 | 阻尼系数,用于控制x或y改变时的动画和过界回弹的动画,值越大移动越快 |
x="{{xValue}}"
y="{{yValue}}"
<button bindtap="moveAreaFn">点击移动到(30rpx,30rpx)</button>
data: {
xValue:0,
yValue:0
},
moveAreaFn(){
this.setData({
xValue:30,
yValue:30
})
},
damping | number | 20 | 否 | 阻尼系数,用于控制x或y改变时的动画和过界回弹的动画,值越大移动越快 |
---|
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
bindchange | function | 无 | 否 | 拖动过程中触发的事件 |
bindscale | function | 无 | 否 | 拖动过程中触发的事件 |
bindchange参数source
值 | 作用 |
---|---|
touch | 拖动 |
touch-out-of-bounds | 超出移动范围 |
out-of-bounds | 超出移动范围后的回弹 |
friction | 惯性 |
空字符串 | setData |
bindchange 返回的 source 表示产生移动的原因
movable-view参数
bindscale | function | 无 | 否 | 缩放过程中触发的事件 |
---|
bindscale="bindscaleFn"
bindscaleFn(option){
console.log(option)
},
x:x轴方向偏移
y:y轴方向偏移
scale:倍数
小结:
①movable-view 必须设置width和height属性,不设置默认为10px
②movable-view 默认为绝对定位,top和left属性为0px
scroll-view为滚动视图,分为水平滚动和垂直滚动。
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
scroll-x | boolean | false | 否 | 允许横向滚动 |
scroll-y | boolean | false | 否 | 允许横向滚动 |
注意:滚动视图垂直滚动时,一定要设置高度,否则的话scroll-view不会
生效。滚动视图常用的地方一般都是Item项比较多的界面
scroll-y | boolean | false | 否 | 允许横向滚动 |
---|
<view>可滚动视图区域scroll-view</view>
<scroll-view scroll-y="true" class="scrollY">
<view>区域1</view>
<view>区域2</view>
<view>区域3</view>
</scroll-view>
/* 可滚动视图区域 */
.scrollY{
width: 100%;
height: 400rpx;
}
.scrollY view{
width: 200rpx;
height: 200rpx;
}
.scrollY view:nth-of-type(1){
background-color: red;
}
.scrollY view:nth-of-type(2){
background-color: blue;
}
.scrollY view:nth-of-type(3){
background-color: orange;
}
scroll-x | boolean | false | 否 | 允许横向滚动 |
---|
<scroll-view scroll-x="true" class="scrollX">
<view>区域1</view>
<view>区域2</view>
<view>区域3</view>
<view>区域4</view>
<view>区域5</view>
<view>区域6</view>
</scroll-view>
.scrollX{
width: 100%;
height: 200rpx;
white-space: nowrap;/**元素不换行 */
}
.scrollX view{
display: inline-block;/**子元素设置为行内块级 */
width: 200rpx;
height: 200rpx;
}
.scrollX view:nth-of-type(2n){
background-color: #ff5857;
}
.scrollX view:nth-of-type(2n+1){
background-color: yellowgreen;
}
注意:横向滚动①white-space:nowrap;②display:inline-block;
属性 | 类型 | 默认值 | 是否必填 | 作用 |
---|---|---|---|---|
scroll-top | number | 无 | 否 | 设置竖向滚动条位置 |
scroll-left | number | 无 | 否 | 设置竖向滚动条位置 |
注意:
应用:可滚动导航、全屏滚动