VUE组件中的 Drawer 抽屉实现代码


Posted in Javascript onAugust 06, 2019

因为项目中用的是 element-ui 框架,而这个框架并没有抽屉组件,所以自己实现一个,具体代码如下:

drawer.vue

<template>
 <div class="drawer">
  <div :class="maskClass" @click="closeByMask"></div>
  <div :class="mainClass" :style="mainStyle" class="main">
   <div class="drawer-head">
    <span>{{ title }}</span>
    <span class="close-btn" v-show="closable" @click="closeByButton">X</span>
   </div>
   <div class="drawer-body">
    <slot/>
   </div>
  </div>
 </div>
</template>
<script>
export default {
 props: {
  // 是否打开
  display: {
   type: Boolean
  },
  // 标题
  title: {
   type: String,
   default: '标题'
  },
  // 是否显示关闭按钮
  closable: {
   type: Boolean,
   default: true
  },
  // 是否显示遮罩
  mask: {
   type: Boolean,
   default: true
  },
  // 是否点击遮罩关闭
  maskClosable: {
   type: Boolean,
   default: true
  },
  // 宽度
  width: {
   type: String,
   default: '400px'
  },
  // 是否在父级元素中打开
  inner: {
   type: Boolean,
   default: false
  }
 },
 computed: {
  maskClass: function () {
   return {
    'mask-show': (this.mask && this.display),
    'mask-hide': !(this.mask && this.display),
    'inner': this.inner
   }
  },
  mainClass: function () {
   return {
    'main-show': this.display,
    'main-hide': !this.display,
    'inner': this.inner
   }
  },
  mainStyle: function () {
   return {
    width: this.width,
    right: this.display ? '0' : `-${this.width}`,
    borderLeft: this.mask ? 'none' : '1px solid #eee'
   }
  }
 },
 mounted () {
  if (this.inner) {
   let box = this.$el.parentNode
   box.style.position = 'relative'
  }
 },
 methods: {
  closeByMask () {
   this.maskClosable && this.$emit('update:display', false)
  },
  closeByButton () {
   this.$emit('update:display', false)
  }
 }
}
</script>
<style lang="scss" scoped>
.drawer {
 /* 遮罩 */
 .mask-show {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10;
  background-color: rgba(0,0,0,.5);
  opacity: 1;
  transition: opacity .5s;
 }
 .mask-hide {
  opacity: 0;
  transition: opacity .5s;
 }
 /* 滑块 */
 .main {
  position: fixed;
  z-index: 10;
  top: 0;
  height: 100%;
  background: #fff;
  transition: all 0.5s;
 }
 .main-show {
  opacity: 1;
 }
 .main-hide {
  opacity: 0;
 }
 /* 某个元素内部显示 */
 .inner {
  position: absolute;
 }
 /* 其他样式 */
 .drawer-head {
  display: flex;
  justify-content: space-between;
  height: 45px;
  line-height: 45px;
  padding: 0 15px;
  font-size: 14px;
  font-weight: bold;
  border-bottom: 1px solid #eee;
  .close-btn {
   display: inline-block;
   cursor: pointer;
   height: 100%;
   padding-left: 20px;
  }
 }
 .drawer-body {
  font-size: 14px;
  padding: 15px;
 }
}
</style>

组件具体使用如下:

<template>
  <div class="box">
    <el-button type="primary" @click="display = true">打开抽屉</el-button>
    <drawer title="我是一个抽屉组件" :display.sync="display" :inner="true" :width="drawerWidth" :mask="false">
      1. Hello, world!
      2. Do you like it?
    </drawer>
  </div>
</template>
<script>
import drawer from '@/components/drawer/drawer'
export default {
  components: { drawer },
  data () {
    return {
      display: false,
      drawerWidth: '500px'
    }    
  }
}
</script>

总结

以上所述是小编给大家介绍的VUE组件中的 Drawer 抽屉实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
一段利用WSH获取登录时间的jscript代码
May 11 Javascript
jQuery 获取URL参数的插件
Mar 04 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
Mar 01 Javascript
JQuery验证工具类搜集整理
Jan 16 Javascript
js改变文章字体大小的实例代码
Nov 27 Javascript
javascript 中that的含义示例介绍
May 14 Javascript
JS 实现列表与多选框选择附预览动画
Oct 29 Javascript
Jquery弹出层插件ThickBox的使用方法
Dec 09 Javascript
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
Dec 31 Javascript
Angularjs添加排序查询功能的实例代码
Oct 24 Javascript
微信小程序实现添加手机联系人功能示例
Nov 30 Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 Javascript
浅入深出Vue之自动化路由
Aug 06 #Javascript
解决vue单页面修改样式无法覆盖问题
Aug 05 #Javascript
微信小程序3种位置API的使用方法详解
Aug 05 #Javascript
微信小程序 高德地图路线规划实现过程详解
Aug 05 #Javascript
详解将微信小程序接口Promise化并使用async函数
Aug 05 #Javascript
使用apifm-wxapi模块中的问题及解决方法
Aug 05 #Javascript
使用apifm-wxapi快速开发小程序过程详解
Aug 05 #Javascript
You might like
为查询结果建立向后/向前按钮
2006/10/09 PHP
用PHP和ACCESS写聊天室(五)
2006/10/09 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
调用innerHTML之后onclick失效问题的解决方法
2014/01/28 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
用jquery仿做发微博功能示例
2014/04/18 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
移动端使用localResizeIMG4压缩图片
2017/04/22 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
2019/09/10 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
python网络编程之TCP通信实例和socketserver框架使用例子
2014/04/25 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
python中pika模块问题的深入探究
2018/10/13 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
python多线程抽象编程模型详解
2019/03/20 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
装修五一活动策划案
2014/01/23 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
人与自然观后感
2015/06/16 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
vue3获取当前路由地址
2022/02/18 Vue.js