vue移动端UI框架实现QQ侧边菜单组件

2020-06-16 06:14:03易采站长站整理

最近面试发现很多前端程序员都从来没有写过插件的经验,基本上都是网上百度。所以打算写一系列文章,手把手的教一些没有写过组件的兄弟们如何去写插件。本系列文章都基于VUE,核心内容都一样,会了之后大家可以快速的改写成react、angular或者是小程序等组件。这篇文章是第一篇,写的是一个类似QQ的侧边菜单组件。

效果展示

先让大家看个效果展示,知道咱们要做的东西是个怎么样的样子,图片有点模糊,大家先将就点:

开始制作

DOM结构

整体结构中应该存在两个容器:1. 菜单容器 2. 主页面容器;因此当前DOM结构如下:


<template>
<div class="r-slide-menu">
<div class="r-slide-menu-wrap"></div>
<div class="r-slide-menu-content"></div>
</div>
</template>

为了使得菜单内容和主题内容能够定制,我们再给两个容器中加入两个slot插槽:默认插槽中放置主体内容、菜单放置到menu插槽内:


<template>
<div class="r-slide-menu">
<div class="r-slide-menu-wrap">
<slot name="menu"></slot>
</div>
<div class="r-slide-menu-content">
<slot></slot>
</div>
</div>
</template>

css样式

我项目中使用了scss,


<style lang="scss">
@mixin one-screen {
position: absolute;
left:0;
top:0;
width:100%;
height:100%;
overflow: hidden;
}

.r-slide-menu{
@include one-screen;
&-wrap, &-content{
@include one-screen;
}
&-transition{
-webkit-transition: transform .3s;
transition: transform .3s;
}
}
</style>

此时我们就得到了两个绝对定位的容器

javascript

现在开始正式的代码编写了,首先我们理清下交互逻辑:

手指左右滑动的时候主体容器和菜单容器都跟着手指运动运动
当手指移动的距离超过菜单容器宽度的时候页面不能继续向右滑动
当手指向左移动使得菜单和页面的移动距离归零的时候页面不能继续向左移动
当手指释放离开屏幕的时候,页面滑动如果超过一定的距离(整个菜单宽度的比例)则打开整个菜单,如果小于一定距离则关闭菜单

所以现在咱们需要在使用组件的时候能够入参定制菜单宽度以及触发菜单收起关闭的临界值和菜单宽度的比例,同时需要给主体容器添加touch事件,最后我们给菜单容器和主体容器添加各自添加一个控制他们运动的style,通过控制这个style来控制容器的移动