本文介绍一个简单的DrawerLayout(类似Android的DrawerLayout)布局组件的实现,基于Vue.js。介绍的内容已经制作成 vue-drawer-layout 组件。
前言
大家有兴趣先用手机扫一扫这个二维码,或者点我
然后点击页面中左上角的头像打开drawer或者向右向左拖拽,就可以看到下面gif的效果,打开自己的手机QQ,是不是很像:)
谷歌官方把这种布局叫做DrawerLayout(抽屉式导航栏)。那么我们要如何实现呢,好了正片开始!
HTML结构
页面结构很简单,一个抽屉,一个主容器,内容可以利用slot支持外部自行定制。
<div class="drawer-layout">
<!--抽屉-->
<div class="drawer-wrap">
<slot name="drawer"></slot>
</div>
<!--主容器-->
<div class="content-wrap">
<!--遮罩-->
<div class="drawer-mask"></div>
<slot name="content"></slot>
</div>
</div>
抽屉一开始是隐藏在左侧屏幕外的,故设置 left:-100% 使其整个都藏在外部
使用Touch
首先,判断浏览器是否支持 touchEvent
let isTouch = 'ontouchstart' in window;
let mouseEvents = isTouch ?
{
down: 'touchstart',
move: 'touchmove',
up: 'touchend',
over: 'touchstart',
out: 'touchend'
} :
{
down: 'mousedown',
move: 'mousemove',
up: 'mouseup',
over: 'mouseover',
out: 'mouseout'
};
绑定 touchdown 事件
document.addEventListener(mouseEvents.down, initDrag, false);
先定义一些变量,手指按下的x坐标记为 startX ,滑动中手指的位置x坐标记为 nowX ,drawer的x坐标偏移量记为 startPos
let startX, nowX, startPos;
触发 touchstart 时,记录起始位置并绑定 touchmove ,注意:如果是 mouseEvent ,通过 e.clientX 来获取当前的x坐标,如果是 touchEvent ,要通过 e.changedTouches[0].clientX 来获取x坐标
const initDrag = function (e) {
startX = e.clientX || e.changedTouches[0].clientX; //记录手指按下的位置
startPos = this.pos; //记录drawer的上次位置
document.addEventListener(mouseEvents.move, drag, false);
document.addEventListener(mouseEvents.up, removeDrag, false);
}.bind(this);
const drag = function (e) {
nowX = e.clientX || e.changedTouches[0].clientX; //滑动中手指的位置x坐标
let pos = startPos + nowX - startX;
pos = Math.min(width, pos); //不能超过滑动最大值
pos = Math.max(0, pos); //不能小于0
this.pos = pos; //设置滚动距离为拖动的距离
}.bind(this);
内容版权声明:除非注明,否则皆为本站原创文章。
