最近在遇到的一些问题以及一些解决思路。
第一次写文章请多包涵。
起因:
小程序的<picker>
组件是类似html中的一个单项选择器。我们要实现一个长得像picker组件的多项选择器。
思路
picker组件是底部弹出的一个菜单,有一个背景由浅慢慢变深的一个过程。翻了翻网上的方法都是用的小程序自带的动画效果做的,但是基本都没看到做背景的渐变效果,所以还是要自己解决一下问题。查看小程序开发文档看到有wx.createAnimation()
这个创建动画的api。背景的渐变效果考虑使用css的transition。多选这个功能考虑修改checkbox的默认样式来解决。
过程
首先要实现一个底部弹出的效果。 页面:
<!-- 一个触发底部弹框的元素 -->
<botton bindtap="showModel">show</botton>
<!-- 渐深的背景层 -->
<view class='{{bg}}' style="visibility:{{backgroundVisible ? 'visible':'hidden'}}"></view>
<!-- 底部弹出层 -->
<view class="element-wrapper" animation="{{animation}}" style="visibility:{{show ? 'visible':'hidden'}}">
<view class="element">
<view class='picker_header'>
<text class="left-bt" catchtap="hidden" >取消</text>
<text class="right-bt" catchtap="hidden">确定</text>
</view>
{内容}
</view>
</view>
复制代码
js:
var action = '';
var moveY = 200;
var animation = animation = wx.createAnimation({
transformOrigin: "50% 50%",
duration: 400,
timingFunction: "ease",
delay: 0
})
animation.translateY(moveY + 'vh').step();
Page({
data: {
show: false,
backgroundVisible: false,
animation: animation,
bg: 'background',
},
onLoad: function(options) {},
onReady: function() {},
//移动按钮点击事件
showModel: function(e) {
moveY = 0;
action = 'show';
animationEvents(this, moveY, action);
},
//隐藏弹窗浮层
hidden(e) {
moveY = 200;
action = 'hide';
animationEvents(this, moveY, action);
}
})
//动画事件 底部的弹出,背景层通过切换不同的class,添加一个transition的效果,使之有一个渐变的感觉。
function animationEvents(that, moveY, action) {
that.animation = wx.createAnimation({
transformOrigin: "50% 50%",
duration: 400,
timingFunction: "ease",
delay: 0
})
that.animation.translateY(moveY + 'vh').step()
if (action == 'show') {
that.setData({
animation: that.animation.export(),
show: true,
backgroundVisible: true,
bg: 'bg',
disableScroll: 'disableScroll'
});
} else if (action == 'hide') {
that.setData({
animation: that.animation.export(),
show: false,
backgroundVisible: false,
bg: 'background',
disableScroll: ''
});
}
}
复制代码
样式部分:
.element-wrapper {
display: flex;
position: fixed;
left: 0;
top: 0;
height: 100%;
width: 100%;
overflow: hidden;
}
.background {
background-color: rgba(0, 0, 0, 0);
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
}
.bg {
background-color: rgba(0, 0, 0, 0.4);
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
transition-property: background-color;
transition-timing-function: ease;
transition-duration: 1s;
transition-delay: 0;
}
.element {
position: fixed;
width: 100%;
height: 45vh;
bottom: 0;
background-color: rgba(255, 255, 255, 1);
}
.element text {
color: #999;
display: inline-flex;
position: fixed;
margin-top: 20rpx;
height: 50rpx;
text-align: center;
line-height: 50rpx;
font-size: 34rpx;
}
.element .left-bt {
left: 5%;
font-size: 34rpx;
color: #888;
line-height: 34rpx;
}
.element .right-bt {
right: 5%;
font-size: 34rpx;
color: #888;
text-align: right;
line-height: 34rpx;
}
.element .line {
display: block;
position: fixed;
height: 1px;
width: 100%;
margin-top: 89rpx;
background-color: #eee;
}
复制代码
效果
小程序picker的效果
其他:
点击后面的灰色隐藏菜单,可以在弹出层的上面加一块透明的东西撑起上面剩余的部分,如果只在这里加背景灰色,取消后面的背景渐变层,会导致弹出层的效果是灰+白的一块东西从底部升起。打不到想要的效果。 弹出层下面用scroll-view会导致穿透。可以给根节点加个样式解决问题。
top: 0px;
left: 0px;
width: 100%;
height: 100%;
overflow: hidden;
position: fixed;
复制代码
下面的复选可以用checkbox来实现,小程序的checkbox可以修改默认的样式 默认样式checkbox .wx-checkbox-input
选中的样式checkbox .wx-checkbox-input.wx-checkbox-input-checked
对勾的样式checkbox .wx-checkbox-input.wx-checkbox-input-checked::before
最后
刚开始接触小程序,还在学习中,css部分也写的有些乱,如果有不足的地方欢迎指出,感谢阅读。