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


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 相关文章推荐
jQuery 中DOM 操作详解
Jan 13 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
Nov 25 Javascript
js仿百度登录页实现拖动窗口效果
Mar 11 Javascript
Javascript点击按钮随机改变数字与其颜色
Sep 01 Javascript
AngularJS过滤器filter用法实例分析
Nov 04 Javascript
JS实现的简单标签点击切换功能示例
Sep 21 Javascript
图片加载完成再执行事件的实例
Nov 16 Javascript
Layer弹出层动态获取数据的方法
Aug 20 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
ES6入门教程之let、const的使用方法
Apr 13 Javascript
vue-cli3中vue.config.js配置教程详解
May 29 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
Dec 12 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导出oracle库的php代码
2009/04/20 PHP
CURL的学习和应用(附多线程实现)
2013/06/03 PHP
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
深入浅析Python中的yield关键字
2018/01/24 Python
python 字符串只保留汉字的方法
2018/11/16 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
爱岗敬业演讲稿范文
2014/01/14 职场文书
同事吵架检讨书
2014/02/05 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS