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


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自定义功能函数实现动态添加网址参数修改网址参数值
Aug 02 Javascript
jQuery实现页面滚动时动态加载内容的方法
Mar 20 Javascript
javascript常见数据验证插件大全
Aug 03 Javascript
浅谈js中字符和数组一些基本算法题
Aug 15 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
微信小程序Getuserinfo解决方案图解
Aug 24 Javascript
浅谈js中的bind
Mar 18 Javascript
一文搞懂ES6中的Map和Set
May 20 Javascript
用Vue.js方法创建模板并使用多个模板合成
Jun 28 Javascript
js实现左右轮播图
Jan 09 Javascript
JS跨浏览器解析XML应用过程详解
Oct 16 Javascript
Vue OpenLayer 为地图绘制风场效果
Apr 24 Vue.js
微信小程序之下拉列表实现方法解析(附完整源码)
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 mkdir()定义和用法
2009/01/14 PHP
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
PHP SOCKET编程详解
2015/05/22 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
2016/07/09 PHP
PHP的反射机制实例详解
2017/03/29 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
jquery last-child 列表最后一项的样式
2010/01/22 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
django之导入并执行自定义的函数模块图解
2020/04/01 Python
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
JAVA代码查错题
2014/10/10 面试题
个人应聘自我评价分享
2013/11/18 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
大学开学感言
2015/08/01 职场文书