使用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: 0;
    left: 0;
    bottom: 0;
    right: 0;
    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: 0;
}

原文地址:https://www.cnblogs.com/liyinSakura/p/10985136.html

时间: 2024-10-20 21:41:07

使用movable-view制作可拖拽的微信小程序弹出层效果。的相关文章

「速成应用」一键生成微信小程序平台 可视化制作开发无需代码

经历了频繁的更新迭代,小程序已经构建起了趋于完善的生态,与此同时,以「速成应用」为代表的小程序第三方开发平台也在推动着小程序市场的发展.为了更好地助力企业打造微信内电商生态闭环,实现线上线下引流,「速成应用」于近日进行了全功能的更新,通过对各类功能组件的优化,帮助企业实现商业模式的转型升级与营销突破. 「速成应用」根据商家反馈的问题,重点对小程序模块中的电商.外卖等功能进行优化升级,旨在帮助企业解决门店经营与小程序线上营销两大难题.在这次升级过程中同样也对辅助功能进行了优化.升级完成后,全线功能

微信小程序免费制作一键生成平台是什么原理?速成应用代理需要多少钱

微信10亿活跃用户,10亿的流量等待瓜分.想想现在人们用哪个应用最多?当然是微信,而微信小程序就是依托微信而存在的,先天优势就在那里,怎么可能不火?作为想要创业以及苦于一直没有机会发现好商机的你,为什么要错过速成应用微信小程序加盟代理这个项目? 小程序是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下即可打开应用.也体现了"用完即走"的理念,用户不用关心是否安装太多应用的问题.应用将无处不在,随时可用,但又无需安装卸载.全面开放

第五章 “我要点爆”微信小程序云开发实例之从云端获取数据制作首页

下面我们来实现从云端获取数据,完成首页世界页面index的制作,首页分为4个数据列表导航页面,页面具体内容如下: 推荐:为用户推荐最新的点爆信息,它包含文本点爆内容和语音点爆内容. 文爆:筛选出文字点爆内容,只显示文字点爆内容. 音爆:筛选出语音点爆内容,只显示语音点爆内容. 爆榜:将点爆内容取出前20名进入排行. [实现页面内数据列表的滚动和导航切换后,每个导航下数据列表都在顶部] 由于我们使用的头部导航栏是通过数据绑定在同一页面进行切换,所以当一个页面内数据列表向下滚动后,切换导航后页面的s

iphone弹出窗口效果的制作(Core animation, CALayer)

效果类似人人网微薄客户端的弹出效果 static CGFloat kTransitionDuration = 0.3; - (void)initView { UIWindow *window = [UIApplication sharedApplication].keyWindow; if (!window) { window = [[UIApplication sharedApplication].windows objectAtIndex:0]; } _backgroundView = [[

微信小程序制作教程

从零开始学做微信小程序,看这些就够了! 随着正式开放公测,微信小程序再次万众瞩目,越来越多的企业和个人涌入到小程序开发的大军中.小程序究竟是什么?适合做小程序的产品有哪些?做小程序需要提前准备什么?如何零基础学做小程序?此文,微容微信小程序制作提供大家了解和学习. 菜鸟秒变大神,不会代码也能轻松生成小程序 微信小程序(weixinxiaochengxu),简称小程序,是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或搜一下即可打开应用. 微容,让微信小程序

js制作带有遮罩弹出层实现登录小窗口

要实现的效果如下 点击“登录”按钮后,弹出登录小窗口,并且有遮罩层(这个名词还是百度知道的,以前只知道效果,却不知道名字) 在没有点击“登录”按钮之前登录小窗口不显示,点击“登录”按钮后小窗口显示,并且遮罩层笼罩整个页面,使整个页面的其他元素暂时失去行为. 遮罩层的实现:相对于body绝对定位,宽度和高度都和body相同,并且有一定的透明度,使得下面的元素能够被看到.原先的元素的z-index为0,遮罩层的z-index在弹出登录小窗口和原先元素的之间. 说的不是很清楚,还是看代码吧! <!DO

制作一个有模态的弹出层

参考慕课网课程<分享:阿当大话西游之WEB组件> 定制不同的皮肤可通过对元素添加或减少class类来实现. 首先,模态是指如下图部分的灰色背景部分:(灰色部分不可点击) 然后,要记住,模态要加在当前页面的上面,以及当前操作框(通常是一个弹出层)的下面 所谓上面,下面是指: 如果模态(通常是一个div)的定位是fixed(固定定位)的,那么它将不占据文档空间, 所以,将其height和width设置为100%,另外,设置left:0;top:0.即为铺满整个屏幕. 然后,在html中,处于此di

jquery制作弹出层带遮罩效果,点击阴影部分层消失

jquery制作弹出层带遮罩效果,点击阴影部分层消失. 整体还是比较简单的. HTML代码很简单 1 <a href="#" class="big-link" data-reveal-id="myModal" data-animation="fade">jquery点我弹出</a> 2 <div id="myModal" class="reveal-modal&quo

{{view 视图层}}微信小程序

微信小程序 view 视图层//自学 1.数据绑定 数据绑定 WXML中的动态数据均来自对应Page的data. 简单绑定 数据绑定使用"Mustache"语法(双大括号)将变量包起来,可以作用于: 内容 <view> {{ message }} </view> Page({ data: { message: 'Hello MINA!' } }) 组件属性(需要在双引号之内) <view id="item-{{id}}"> <