使用movable-view制作可拖拽的微信小程序弹出层效果。
仿了潮汐睡眠小程序的代码。【如果有侵权联系删除
最近做的项目有个弹出层效果,类似音乐播放器那种。按照普通的做了一般感觉交互不是很优雅,设计妹子把潮汐睡眠的弹层给我看了看,感觉做的挺好,于是乘着有空仿照了一下。
首先善用度娘反编译弄到了源码,但是打不开。然后自己研究源码发现他们用的是movable-view实现的。
于是仿照着搭出了基础框架。
新建了个组件
wxml
<!--components/playpanel/playpanel.wxml-->
<movable-area style="height:{{areaH}}px;" class="wrapper">
<movable-view bindchange="onPresent" bindtouchend="dragPanelEnd" bindtouchstart="dragPanelStart" class="sleep-panel-wrapper" damping="{{40}}" direction="vertical" friction="{{1}}" inertia="{{false}}" outOfBounds="{{false}}" style="padding-top:{{0}}px" x="{{0}}" y="{{sleepPanelPosition}}" class="panel"> <view class="" bindtap="presentPanel" hover-class="none" hover-stop-propagation="false">
背景内容
</view>
</movable-view>
</movable-area>
<scroll-view scroll-y style="height:400rpx" class="scroll-w" wx:if="{{showlist}}">
歌曲列表
<view id="green" class="scroll-view-item bc_green"></view>
<view id="red" class="scroll-view-item bc_red"></view>
<view id="yellow" class="scroll-view-item bc_yellow"></view>
<view id="blue" class="scroll-view-item bc_blue"></view>
</scroll-view>
歌曲列表提取出来是因为滚动组件和可拖拽的手势事件会互相影响,如果不需要弹出层有可滚动的区域可以无视。
js部分精简一下就是这样,abcd这些变量名应该是源码做了加密……appjs里还要定义一下初始数据
// components/playpanel/playpanel.js
let d = getApp();
Component({
/**
* 组件的属性列表
*/
properties: {
areaH:Number
}, /**
* 组件的初始数据
*/
data: {
sleepPanelPosition: d.globalData.screenHeight - (d.globalData.isFullScreen ? 24 : 0) - 80 / (375 / d.globalData.screenWidth),
topPosition: d.globalData.statusBarHeight + d.globalData.navBarHeight,
bottomPosition: d.globalData.screenHeight - (d.globalData.isFullScreen ? 24 : 0) - 80 / (375 / d.globalData.screenWidth),
presentProgress: 0,
disableAnimated: !1,
showlist:false,
}, /**
* 组件的方法列表
*/
methods: {
dragPanelEnd(e) { let changedTouches = e.changedTouches;
let pageY = changedTouches[0].pageY;
let topPosition = this.data.topPosition;
let bottomPosition = this.data.bottomPosition;
let distance = pageY - this.dragOrigin;
let speed = (bottomPosition - topPosition)/10; let h = 0;
h = this.data.sleepPanelPosition === topPosition ? distance > speed ? bottomPosition : topPosition : distance < -speed ?topPosition : bottomPosition,this.setData({
sleepPanelPosition: h,
showlist: h === topPosition
}); },
presentPanel() {
const {sleepPanelPosition: a, topPosition: b, bottomPosition: c} = this.data;
this.setData({
sleepPanelPosition: a === b ? c : b,
});
let showList = this.data.sleepPanelPosition === b
this.setData({
showlist: showList
})
},
dragPanelStart(a) {
const {changedTouches: b} = a;
if (b[0]) {
const {pageY: a} = b[0];
this.dragOrigin = a;
}
},
onPresent({detail: a}) {
const {y: b} = a, {topPosition: c, bottomPosition: d} = this.data, e = 1 - parseInt(1e3 * ((b - c) / (d - c))) / 1e3;
e !== this.data.presentProgress && this.setData({
presentProgress: e
}), this.data.disableAnimated || this.setData({
disableAnimated: !0
}), clearTimeout(this.recoverAnimation), this.recoverAnimation = setTimeout(() => {
this.setData({
disableAnimated: !1
}), this.recoverAnimation = null;
}, 100);
},
}
})
//app.js
```
onShow() {
wx.getSystemInfo({
success: a => {
const {
screenHeight: b,
screenWidth: c,
statusBarHeight: d
} = a;
this.globalData.isFullScreen = parseInt(100 * (c / b)) < parseInt(100 * (9 / 17)),
this.globalData.isBiggerScreen = 667 < b, this.globalData.statusBarHeight = d, this.globalData.navBarHeight = 44,
this.globalData.navBarFontSize = 18.5, this.globalData.btnScopeSize = 40, this.globalData.btnSize = 32,
this.globalData.screenHeight = b, this.globalData.screenWidth = c;
}
});
},
```
wxss部分,主要是.panel不要设置top值,其他好像没啥。
/* components/playpanel/playpanel.wxss */
.wrapper {
position: fixed;
top:;
left:;
bottom:;
right:;
width: 100vw;
height: 200vh;
pointer-events:none;
}
.panel {
width: 100%;
background: rgba(233, 233, 255, 0.8);
height: 100vh;
pointer-events: auto;
}
.scroll-view-item {
height: 300rpx;
}
.bc_green {
background: green;
}
.bc_red {
background: red;
}
.bc_yellow {
background: yellow;
}
.bc_blue {
background: blue;
}
.scroll-w {
position: fixed;
bottom:;
}
使用movable-view制作可拖拽的微信小程序弹出层效果。的更多相关文章
- 实现拖拽列表-微信小程序
之前在网上搜索拖拽列表的实现时,发现了有好多的方法都是基于像素位置的计算实现的,这种方法要求列表元素的大小以及列表的位置有着非常严格的要求,修改和拓展起来非常的麻烦.于是我自己动手实现了一个基于页面元 ...
- 微信小程序一键生成源码 在线制作定制功能强大的微信小程序
微信小程序发展到现在,短短的一年不到的时间(很快就要迎来微信小程序周年庆),在快迎来周年庆之际,百牛信息技术bainiu.ltd特记录一下这个发展的历程,用于将来见证小程序发展的辉煌时刻,我们还能知道 ...
- 微信小程序制作家庭记账本之一
制作的第一天,思索着制作手机端APP还是微信小程序,首先是想到制作APP但是各种收费让我不得不换一条路,所以开始制作小程序,下载了微信小程序开发工具,试着学习制作方法,但是似乎没有成效,但我坚信要一步 ...
- 【百度地图API】如何制作可拖拽的沿道路测距
原文:[百度地图API]如何制作可拖拽的沿道路测距 摘要: 地图测距,大家都会,不就map.getDistance麼.可是,这只能测任意两点的直线距离,用途不够实际啊.比如,我想测试北京天安门到北京后 ...
- 微信小程序 -- 基于 movable-view 实现拖拽排序
微信小程序 -- 基于 movable-view 实现拖拽排序 项目基于colorui样式组件 ColorUI组件库 (color-ui.com) 1.实现效果 2. 设计思路 movable-vie ...
- 微信小程序如何开发制作
微信小程序如何开发制作 微容SMO是一款微信小程序的免费在线制作工具,用户在微容平台上无需编辑代码,可通过拖拽式操作即可完成小程序的制作,真正意义上实现了小程序零代码免费制作! 消除技术门槛:无需代码 ...
- 微信小程序swiper制作内容高度不定的tab选项卡
微信小程序利用swiper制作内容高度不定的tab选项卡,不使用absolute定位,不定高度,由内容自由撑开主要思路是获取内容区的高度来给swiper动态设置值 .wxml <view cla ...
- 微信小程序在线制作 自己制作微信小程序
小程序是个什么东西?怎么自己制作微信小程序?微信小程序在线制作难吗?最近老是听这类问题,耳朵都长茧子了. 百牛信息技术bainiu.ltd整理发布于博客园 接下来作为一个技术人员的角度就为大家分析一下 ...
- 第六章 “我要点爆”微信小程序云开发实例之爆文详情页制作
爆文详情页制作 从首页中数据列表打开相应详情页面的方法: 给数据列表中每个数据项加一个点击事件,同时将当前数据项的id暂时记录在本地,然后跳转到详情页面detail goopen: function ...
随机推荐
- ps制作浮雕和投影效果
1用文字横排工具写个hope,按住ctrl+t可以调试出文字工具,上面直接用500点来改变文字的大小.2 用矩形选框工具直接可以切割图片的大小,然后双击一个图层,添加样式为浮雕....然后合并图层3 ...
- Docker搭建Portainer可视化界面
为了解决上回说到的问题,在网上找了找 找到了一个 非常有好的可视化界面管理工具. Portainer 是什么东西 (开源轻量级) Portainer是Docker的图形化管理工具,提供状态显示面板.应 ...
- Python服务端工程师就业面试指导✍✍✍
Python服务端工程师就业面试指导 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时 ...
- [eJOI2018]元素周期表
题目 \((r_1,c_1),(r_2,c_1),(r_1,c_2)\)三个格子存在就说明\((r_2,c_2)\)存在,如果我们将\(r_1,c_2,c_1,r_2\)都看成一些点的话,那么这个关系 ...
- scrapy 多个爬虫运行
from scrapy import cmdline import datetime import time import os import scrapy from scrapy.crawler i ...
- 深度探索C++对象模型之第二章:构造函数语意学之Copy constructor的构造操作
C++ Standard将copy constructor分为trivial 和nontrivial两种:只有nontrivial的实例才会被合成于程序之中.决定一个copy constructor是 ...
- 一个有关group by的错误
事例:查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资 SELECT department_name,MIN(salary),departments.manager_idFROM dep ...
- SUBTRACT
SUBTRACT 给出一个长度为n序列\(\{a_i\}\),定义一个操作,记做\(con(a,i)\),意思是用\(a_i-a_{i+1}\)替代\(a_i,a_{i+1}\),显然最后一个数字不能 ...
- Python自学:第五章 对数字列表执行简单的统计计算
>>>digits = [1,2,3,4,5,6,7,8,9,0] >>>mid(digits) 0 >>>max(digits) 9 >& ...
- leetcode-第10周双周赛-5099验证回文字符串③
题目描述: 方法:动态规划 class Solution: def isValidPalindrome(self, s: str, k: int) -> bool: def isKPalRec( ...