微信小程序之侧边栏滑动实现过程解析(附完整源码)


Posted in Javascript onAugust 23, 2019

一、效果图

讲什么都不如直接上效果图好,所以我们先来看下实现效果如何。

通过滑动屏幕,或者点击左上角的图标按钮,都能实现侧边栏的划出效果。

微信小程序之侧边栏滑动实现过程解析(附完整源码)

微信小程序之侧边栏滑动实现过程解析(附完整源码)

二、原理解析

1.先实现侧边栏的内容,让侧边栏的内容居左,然后将侧边栏的内容置于屏幕的最底部。

2.接着实现主页的内容,并且让主页的内容默认是覆盖在侧边栏的内容上面。

3.然后,实现手指滑动屏幕的时候,主页的内容,向左滑动一定的宽度,让侧边栏的内容显示出来,而滑动的效果是通过 css 的 transition 来实现的。

三、源码

由于实现过程的时,我对代码作了比较详细的注释,所有这里就不废话,直接上代码。

slide.wxml

<view class="page">
  <!-- 侧边栏内容 -->
  <view class="page-slidebar">
    <view class="page-content">
      <view class="wc">
        <text>首页</text>
      </view>
      <view class="wc">
        <text>导航一</text>
      </view>
      <view class="wc">
        <text>导航二</text>
      </view>
      <view class="wc">
        <text>导航三</text>
      </view>
    </view>
  </view>
  
  <!-- 主页内容 --> 
  <!-- (open ? 'c-state' : '')三元运算符: -->
  <!-- 1.默认情况下 open 为 false -->
  <!-- 2.当点击左上角图标的时候或者屏幕向左滑动,open 变化 true -->
  <!-- 3.当 open 为 true 时,会加上类名为 c-state 和 cover 的 css 样式 --> 
  <!-- bindtouchstart、 bindtouchmove、bindtouchend -->
  <!-- 当手指触摸屏幕并滑动时,所触发的三个函数 -->
  <view bindtouchmove="tap_drag" bindtouchend="tap_end" bindtouchstart="tap_start" class="page-top {{open ? ['c-state','cover'] : ''}} ">
    <image bindtap="tap_ch" src="../../images/btn.png"></image>
    <view class='content'> 
      <text>为了帮助开发者简单和高效地开发和调试微信小程序,我们在原有的公众号网页调试工具的基础上,推出了全新的 微信开发者工具,集成了公众号网页调试和小程序调试两种开发模式。 
使用公众号网页调试,开发者可以调试微信网页授权和微信JS-SDK 详情
使用小程序调试,开发者可以完成小程序的 API 和页面的开发调试、代码查看和编辑、小程序预览和发布等功能。
为了更好的开发体验,我们从视觉、交互、性能等方面对开发者工具进行升级,推出了 1.0.0 版本。</text>
      <button>按钮</button>
    </view>
  </view>
</view>

slide.wcss

/* 全局样式 */
page, .page {
  height: 100%;
  font-family: 'PingFang SC',
         'Helvetica Neue',
         Helvetica,
         'Droid Sans Fallback',
         'Microsoft Yachei',
         sans-serif;
} 
/* 侧边栏样式 */
.page-slidebar {
  height: 100%;
  width: 750rpx;
  position: fixed;
  background-color:white;
  z-index: 0;
}
 
/* 控制侧边栏的内容距离顶部的距离 */
.page-content {
  padding-top: 60rpx;
}
 
/* 侧边栏内容的 css 样式 */
.wc {
  color:black;
  padding: 30rpx 0 30rpx 150rpx;
  border-bottom: 1px solid #eee; 
}
 
/* 当屏幕向左滑动,出现侧边栏的时候,主页的动画样式 */
/* scale:取值范围 0~1 ,表示屏幕大小是原来的百分之几,可以自己修改成 0.8 试下*/
/* translate(60%,0%) 表示向左滑动的时候,侧边栏占用平时的宽度为 60%  */
.c-state {
  transform: rotate(0deg) scale(1) translate(60%, 0%);
  -webkit-transform: rotate(0deg) scale(1) translate(60%, 0%);
}
 
/* 主页样式 */
.page-top {
  height: 100%;
  position: fixed;
  width: 750rpx;
  background-color:white;
  z-index: 0;
  transition: All 0.4s ease;
  -webkit-transition: All 0.4s ease;
}
/* 左上角图标的样式 */
.page-top image {
  position: absolute;
  width: 68rpx;
  height: 68rpx;
  left: 20rpx;
  top: 20rpx;
}
 
/* 遮盖层样式 */
.cover{
  width: 100%;
  height: 100%;
  background-color:gray;
  opacity: 0.5;
  z-index: 9000;
}
 
.content{
  margin-top: 100rpx; 
}

slide.js

Page({ 
  data: {
    open: false,
    // mark 是指原点x轴坐标
    mark: 0,
    // newmark 是指移动的最新点的x轴坐标 
    newmark: 0,
    istoright: true
  }, 
  // 点击左上角小图标事件
  tap_ch: function(e) {
    if (this.data.open) {
      this.setData({
        open: false
      });
    } else {
      this.setData({
        open: true
      });
    }
  },
 
  tap_start: function(e) {
    // touchstart事件
    // 把手指触摸屏幕的那一个点的 x 轴坐标赋值给 mark 和 newmark
    this.data.mark = this.data.newmark = e.touches[0].pageX;
  },
 
  tap_drag: function(e) {
    // touchmove事件
    this.data.newmark = e.touches[0].pageX;
    
    // 手指从左向右移动
    if (this.data.mark < this.data.newmark) {
      this.istoright = true;
    }
    
    // 手指从右向左移动
    if (this.data.mark > this.data.newmark) {
      this.istoright = false;
    }
    this.data.mark = this.data.newmark;
  },
 
  tap_end: function(e) {
    // touchend事件
    this.data.mark = 0;
    this.data.newmark = 0;
    // 通过改变 opne 的值,让主页加上滑动的样式
    if (this.istoright) {
      this.setData({
        open: true
      });
    } else {
      this.setData({
        open: false
      });
    }
  }
})

四、项目下载

git 在线下载:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
动态样式类封装JS代码
Sep 02 Javascript
Javascript 日期处理之时区问题
Oct 08 Javascript
jQuery学习笔记之Helloworld
Dec 22 Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 Javascript
JS加jquery简单实现标签元素的显示或隐藏
Sep 23 Javascript
JavaScript实现广告的关闭与显示效果实例
Jul 02 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
使用伪命名空间封装保护独自创建的对象方法
Aug 04 Javascript
JS实现页面跳转参数不丢失的方法
Nov 28 Javascript
ionic实现下拉刷新载入数据功能
May 11 Javascript
Vue.js中数据绑定的语法教程
Jun 02 Javascript
Vue3.x源码调试的实现方法
Oct 13 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
Aug 23 #Javascript
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
Aug 23 #Javascript
微信小程序 授权登录详解(附完整源码)
Aug 23 #Javascript
vue使用微信JS-SDK实现分享功能
Aug 23 #Javascript
VUE实现移动端列表筛选功能
Aug 23 #Javascript
简述ES6新增关键字let与var的区别
Aug 23 #Javascript
微信小程序后台持续定位功能使用详解
Aug 23 #Javascript
You might like
php 操作excel文件的方法小结
2009/12/31 PHP
一个简单php扩展介绍与开发教程
2010/08/19 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
浅谈javascript实现八大排序
2015/04/27 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
Javascript删除数组里的某个元素
2019/02/28 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
Python切片知识解析
2016/03/06 Python
Python实现多属性排序的方法
2018/12/05 Python
python实现网页自动签到功能
2019/01/21 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
荷兰手表网站:Watch2Day
2018/07/02 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
医学专业应届生的自我评价
2014/02/28 职场文书
春节联欢会主持词
2014/03/24 职场文书
个人委托书范本汇总
2014/10/01 职场文书
行政处罚听证告知书
2015/07/01 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL