element-ui的侧边栏的右侧添加一个展开关闭按钮

本文介绍如何在官方文档未提供的基础上,创建一个带有折叠功能的侧边栏组件。通过HTML、CSS和JavaScript,实现菜单的展开与关闭,以及控制按钮的样式变化。

在官方文档中没有找到这个按钮,所以自己搞一个

侧边栏组件

效果

在这里插入图片描述

html

<template>
  <div class=" aside">
    <el-menu :default-openeds="['1']"
             class="el-menu-vertical-demo"
             :collapse="isCollapse">
      <el-submenu index="1">
        <template slot="title">
          <i class="el-icon-message"></i>
          <span slot="title">导航一</span>
        </template>
      </el-submenu>
      <el-submenu index="2">
        <template slot="title">
          <i class="el-icon-menu"></i>
          <span slot="title">导航二</span>
        </template>
      </el-submenu>
      <el-submenu index="3">
        <template slot="title">
          <i class="el-icon-setting"></i>
          <span slot="title">导航三</span>
        </template>
      </el-submenu>
    </el-menu>
    <div  class="aside-control-button" @click.once="asideControlToClose">
      <i class="el-icon-caret-left" ></i>
    </div>
  </div>
</template>

<script >
import Pubsub from 'pubsub-js'
import $ from 'jquery'
export default {
  name: 'aside',
  data() {
    return {
      isCollapse: false
    };
  },
  methods:{
    getTable(){
      //key - value
      Pubsub.publishSync("mainName",'Table');
    },
    getTestTable(){
      Pubsub.publish("TestTable",'TestTable')
    },
    asideControlToClose(){
        //设置isCollapse
        console.log('close')

        //图标换个方向
      $('.aside-control-button .el-icon-caret-left').
      removeClass('el-icon-caret-left').
      addClass('el-icon-caret-right')
        //清除asideControlToClose换 asideControlToOpen
        $('.aside-control-button').one("click",(this.asideControlToOpen))
      this.isCollapse=true
    },
    asideControlToOpen(){
      //和他兄弟反着来
      this.isCollapse=false

      let temp= $('.aside-control-button .el-icon-caret-right');
      temp.removeClass('el-icon-caret-right')
      temp.addClass('el-icon-caret-left')

      $('.aside-control-button').one("click",(this.asideControlToClose))
    }
  },
  mounted() {

  }

}

</script>

<style scoped>
@import 'publicAside.css';

</style>

css

.aside-control-button{
  position: absolute;
  width: 25px;
  height: 80px;
  background-color: rgba(232, 232, 232, 0.53);
  right: -25px;
  top:45%;
  /*perspective:对元素进行透视操作*/
  /*rotateX:以y轴(横轴)进行旋转(前后仰俯)
  画个梯形出来*/
  transform:perspective(2em) rotateY(20deg);
  text-align: center;
  line-height: 80px;
  color: #909399;
  z-index: 1145;
}
.aside-control-button:hover{
  background-color: #ecf5ff;
}
.aside{
  position: relative;
}8
.el-menu-vertical-demo{
  min-height: calc(88.3vh);
}
.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
}

<think> 我们被要求使用Element UI实现一个从右边弹出的弹窗。根据引用[2]中的信息,我们可以通过设置`placement`属性为`left-start`来实现从左边弹出,那么类似地,我们可以尝试设置`placement`为`right-start`来实现从右边弹出。但是,引用[2]中只提到了`left-start`,并没有直接提到`right-start`,但根据Element UI的Dropdown组件的placement属性,它支持12个方向的弹出,其中包括`right`和`right-start`等。 然而,需要注意的是,用户的问题是关于“弹窗”,而引用[2]中讨论的是Dropdown(下拉菜单)。在Element UI中,弹窗通常指的是Dialog组件。但是,引用[1]、[3]、[4]、[5]都是关于弹窗(Dialog或类似组件)的。 但是,我们注意到用户要求的是“从右边弹出的弹窗”,这个效果在Element UI的Dialog组件中默认并不支持,因为Dialog是居中显示的。如果我们想要一个右侧滑入的弹窗,可能需要自定义。 不过,引用[2]中通过设置Dropdown的placement为`left-start`实现了从左侧弹出下拉菜单,这给了我们一个思路:如果用户想要的是一个类似侧边栏的弹窗,我们可以使用Drawer(抽屉)组件。Element UI提供了Drawer组件,它可以从四个方向(上、下、左、右)滑入,非常适合侧边弹窗的效果。 因此,解决方案有两种: 1. 使用Drawer组件,并设置`direction`为`rtl`(从右到左,即从右边弹出)或者`direction`为`rtl`表示从右侧弹出,实际上Drawer的`direction`属性可以设置为`rtl`或`ltr`,但它控制的是文字方向,而弹出方向由`placement`属性控制?实际上,在Element UIDrawer组件中,使用`direction`属性来控制弹出方向,其值可以是`rtl`(从右往左)或`ltr`(从左往右,默认)?但根据文档,Drawer组件有一个`direction`属性,可选值为`rtl`/`ltr`/`ttb`/`btt`,分别表示从右向左、从左向右、从上向下、从下向上。所以,要右侧弹出,应该设置`direction`为`rtl`(从右向左)? 但是,请注意,在Element UI中,Drawer组件的`direction`属性实际控制的是打开的方向,其值可以是`rtl`(从右向左)、`ltr`(从左向右)、`ttb`(从上向下)、`btt`(从下向上)。所以,设置`direction="rtl"`就可以从右侧弹出。 2. 如果用户坚持使用Dialog,那么可以通过自定义样式,将Dialog定位到右侧,并设置动画效果。但是这种方法比较麻烦,而且Element UI的Dialog并没有提供内置的方向属性。 因此,推荐使用Drawer组件来实现从右侧弹出的弹窗。 下面给出使用Drawer组件的示例代码: ```html <template> <div> <el-button @click="drawer = true" type="primary">打开弹窗</el-button> <el-drawer title="标题" :visible.sync="drawer" direction="rtl" size="50%"> <!-- 设置direction为rtl表示从右侧弹出,size可以设置宽度或高度 --> <span>内容区域</span> </el-drawer> </div> </template> <script> export default { data() { return { drawer: false }; } }; </script> ``` 这样,当点击按钮时,抽屉(弹窗)就会从右侧滑入。 如果用户确实需要的是Dialog,那么我们可以通过自定义样式来实现: ```html <template> <div> <el-button @click="dialogVisible = true">打开Dialog</el-button> <el-dialog title="提示" :visible.sync="dialogVisible" custom-class="right-dialog" :show-close="false" width="30%"> <span>内容</span> <span slot="footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="dialogVisible = false">确 定</el-button> </span> </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false }; } }; </script> <style> /* 自定义样式将Dialog定位到右侧 */ .right-dialog { position: fixed; right: 0; top: 0; bottom: 0; margin: 0 !important; height: 100% !important; /* 添加过渡动画 */ animation: right-dialog-fade-in .3s; } /* 定义进入动画 */ @keyframes right-dialog-fade-in { 0% { transform: translateX(100%); } 100% { transform: translateX(0); } } /* 如果需要覆盖遮罩层,可以调整遮罩层样式 */ </style> ``` 但是,使用自定义Dialog的方式需要处理很多细节,比如遮罩层、关闭逻辑等,而且可能不如Drawer组件稳定。因此,除非有特殊需求,否则建议使用Drawer组件。 综上所述,使用Element UI实现从右边弹出的弹窗的最简单方法是使用Drawer组件并设置`direction="rtl"`。 相关问题: 1. 如何使用Element UIDrawer组件? 2. 如何自定义Element UI Dialog的弹出位置? 3. Element UIDrawer和Dialog的主要区别是什么? </think> 根据您的需求,使用 Element UI 实现从右侧弹出的弹窗,推荐以下两种方法: ### 方法一:使用 Drawer 组件(推荐) Element UIDrawer(抽屉)组件原生支持从右侧滑入的效果: ```html <template> <el-button @click="drawer = true">打开右侧弹窗</el-button> <el-drawer title="标题" :visible.sync="drawer" direction="rtl" <!-- 关键属性:控制从右侧弹出 --> size="30%"> <!-- 控制宽度 --> <span>内容区域</span> </el-drawer> </template> <script> export default { data() { return { drawer: false } } } </script> ``` **特点**: 1. `direction="rtl"` 实现从右向左滑入效果 2. 支持手势滑动关闭 3. 原生动画效果流畅 4. 可通过 `size` 属性控制宽度[^2] ### 方法二:自定义 Dialog 样式 通过 CSS 覆盖实现 Dialog 右侧定位: ```html <template> <el-button @click="dialogVisible = true">打开弹窗</el-button> <el-dialog title="提示" :visible.sync="dialogVisible" custom-class="right-dialog"> <span>内容区域</span> </el-dialog> </template> <style> /* 关键样式 */ .right-dialog { position: fixed; right: 0; top: 0; bottom: 0; margin: 0 !important; height: 100vh !important; animation: slide-in 0.3s; } @keyframes slide-in { from { transform: translateX(100%); } to { transform: translateX(0); } } </style> ``` ### 注意事项 1. **关闭问题**:使用自定义 Dialog 时需注意[引用3]提到的意外关闭问题,建议添加 `:close-on-click-modal="false"` 属性 2. **移动端适配**:Drawer 组件在移动设备上有更好的体验 3. **动画优化**:Drawer 组件内置动画更流畅,自定义 Dialog 需注意动画性能
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值