微信小程序自定义sheet-action,实现底部弹出动画

效果

小程序自定义sheet-action.gif

小程序自定义底部弹出modal框组件,仿照小程序sheet-action的效果,封装成组件直接在其他业务页面公用。

  1. 底部弹出动画使用的是小程序的animation,弹出动画可以根据自行需求去替换。
  2. modal顶部有一条短的横线,向下滑动可以触发隐藏modal
  3. 点击阴影部分可以触发隐藏modal

使用方法

  1. 在业务页面引入组件
// pages/index/index.json
{
  "usingComponents": {
    "product-cart": "../../components/product-cart/index"
  }
}
// pages/index/index.js
Page({
  data: {
    show: false // true:显示  false:隐藏
  },
showModal(){
  this.setData({
       show:true
    })
  },
)}
  1. show参数是boolean值
// pages/index/wswl
<view>
  <button bindtap="showModal">点击</button>
 <product-cart show="{{show}}"></product-cart>
</view>

组件源码

// pages/index/components/buy/index.js
let pageY = 0;
Component({
  options: {
    styleIsolation: 'isolated'
  },
  /**
   * 组件的属性列表
   */
  properties: {
    show: {
      type: Boolean,
      value: false
    }
  },
  /**
   * 组件的初始数据
   */
  data: {
    list: [{
        name: '快递',
        selected: 1,
      },
      {
        name: '自提',
        selected: 0
      }
    ],
    animate: {},
    hideModal: false, //模态框的状态  false-隐藏  true-显示
  },
  /**
   * 数据监听
   */
  observers: {
    'show': function(val) {
      if (val) {
        this.showModal()
      } else {
        this.hideModal()
      }
    }
  },
  /**
   * 组件的方法列表
   */
  methods: {
    // 显示遮罩层
    showModal() {
      this.setData({
        hideModal: true
      })
      const animation = wx.createAnimation({
        duration: 500,
        timingFunction: 'ease',
      })
      // 先显示背景再执行动画,translateY(0)偏移量为0代表显示默认高度
      setTimeout(() => {
        animation.translateY(0).step()
        this.setData({
          animate: animation.export()
        })
      }, 50)
    },
    // 隐藏遮罩层
    hideModal() {
      const animation = wx.createAnimation({
        duration: 500,
        timingFunction: 'ease',
      })
      // 设置为100vh可以确保滚动到底部,可以按照自己的内容高度设置,能够滑到底部即可
      animation.translateY('100vh').step()
      this.setData({
        animate: animation.export(),
      })
      // 先执行动画,再隐藏组件
      setTimeout(() => {
        this.setData({
          hideModal: false
        })
      }, 300)
    },
    // 移动
    touchMove(e) {
      const clientY = e.changedTouches[0].clientY
      if (clientY - pageY > 0 && clientY - pageY > 50) {
        this.hideModal()
      }
    },
    // 触摸开始
    touchStart(e) {
      pageY = e.changedTouches[0].clientY;
    },
    // 选择类型
    changeItem(e) {
      const {
        index
      } = e.currentTarget.dataset
      this.data.list.forEach((e, i) => {
        if (i == index) {
          e.selected = 1
        } else {
          e.selected = 0
        }
      })
      this.setData({
        list: this.data.list
      })
    },
    // 确认
    confirm() {
      this.hideModal()
    },
  }
})
<!--pages/index/components/buy/index.wxml-->
<view class="box" hidden="{{!hideModal}}">
  <view class="empty-box" bindtap="hideModal" id="empty-box"></view>
  <scroll-view scroll-y style="max-height:80vh;">
    <view class="content" style="transform:translateY({{translateY}}px);" animation="{{animate}}">
      <!-- boll -->
      <view class="header" bindtouchstart="touchStart" bindtouchmove="touchMove">
        <view></view>
      </view>

      <!-- 快递类型 -->
      <view>
        <view class="item" wx:for="{{list}}" wx:key="index" bindtap="changeItem" data-index="{{index}}">
          <view class="item-name">{{item.name}}</view>
          <view>
            <view class="item-no-selected" wx:if="{{item.selected==0}}"></view>
            <image class="item-selected" wx:if="{{item.selected==1}}" src="/assets/images/choose.png"></image>
          </view>
        </view>
      </view>

      <!-- 按钮 -->
      <view class="button" bindtap="confirm">
        <view>确认</view>
      </view>

    </view>
  </scroll-view>
</view>
/* pages/index/components/buy/index.wxss */

.flex {
  display: flex;
  align-items: center;
}

.box {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1000;
  width: 100vw;
  height: 100vh;
  background: rgba(0, 0, 0, 0.5);
  display: flex;
  flex-direction: column;
}

.empty-box {
  flex: 1;
  background-color: transparent;
}

/* 内容视图 */

.content {
  width: 100vw;
  background: rgba(255, 255, 255, 1);
  opacity: 1;
  border-radius: 20px 20px 0px 0px;
  z-index: 1001;
}

/* 头部 */

.header {
  position: relative;
  height: 80rpx;
  width: 100vw;
}

.header > view {
  position: absolute;
  top: 26rpx;
  left: calc(50vw - 30rpx);
  width: 60rpx;
  height: 10rpx;
  background: rgba(161, 166, 175, 1);
  opacity: 0.6;
  border-radius: 6rpx;
}

/* 快递 */

.item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: calc(100vw - 80rpx);
  padding: 0 40rpx;
  height: 100rpx;
  background: rgba(255, 255, 255, 1);
  opacity: 1;
}

.item-no-selected {
  width: 36rpx;
  height: 36rpx;
  background: rgba(255, 255, 255, 1);
  border: 2rpx solid rgba(112, 112, 112, 1);
  border-radius: 50%;
  opacity: 0.5;
}

.item-selected {
  width: 40rpx;
  height: 40rpx;
}

/* 按钮 */

.button {
  width: 100vw;
  padding: 80rpx 40rpx 20rpx 40rpx;
}

.button >view {
  width: calc(100% - 80rpx);
  height: 98rpx;
  border-radius: 50rpx;
  line-height: 98rpx;
  text-align: center;
  font-size: 32rpx;
  font-family: PingFang SC;
  font-weight: bold;
  color: rgba(255, 255, 255, 1);
  background: rgba(237, 58, 74, 1);
  opacity: 1;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容