当前位置: 首页 > news >正文

vue2实现可拖拽菜单栏,及根据菜单内容自动扩展宽度

在这里插入图片描述

分为两个功能
基本的html:

<el-scrollbar
      id="leftmenu"
      v-resize="MuneResize"
      wrap-class="scrollbar-wrapper"
    >
      <el-menu
        :default-active="activeMenu"
        :collapse="isCollapse"
        :background-color="variables.menuBg"
        :text-color="variables.menuText"
        :unique-opened="false"
        :active-text-color="variables.menuActiveText"
        :collapse-transition="false"
        mode="vertical"
      >
        <sidebar-item
          v-for="route in routes"
          :key="route.path"
          :item="route"
          :base-path="route.path"
        />
      </el-menu>
    </el-scrollbar>
    <!-- 给个可以拖拽的标识 -->
    <div id="drap-meuline" />

可拖拽菜单

拖拽的块儿为
<div id="drap-meuline" />
可以自行调整宽度和样式

mounted() {
    // 获取dom,对左菜单进行拖拽
    var drapLine = document.getElementById("drap-meuline");
    // 获取右侧内容Dom
    var mainContainer = document.getElementsByClassName("main-container")[0];
    // 获取左侧菜单Dom
    var menuleft = document.getElementById("leftmenu");
    // 获取左侧菜单Dom父元素,为了动态设置宽度
    var sidebarWidth = document.getElementsByClassName("sidebar-container")[0];

    // 是否需要本地保存
    // const history_width = localStorage.getItem("sliderWidth");
    // if (history_width) {
    //   sidebarWidth.style.width = history_width;
    //   mainContainer.style.marginLeft = history_width;
    // }
    drapLine.onmousedown = function (e) {
      // 设置最大/最小宽度
      var max_width = 600;
      var min_width = 210;
      let mouse_x = 0; // 记录鼠标相对left盒子x轴位置
      e.preventDefault(); // 阻止默认事件
      const _e = e || window.event;
      mouse_x = _e.clientX - menuleft.offsetWidth;
      document.onmousemove = function (e_) {
        console.log(min_width, max_width);
        const _e_ = e_ || window.event;
        let left_width = _e_.clientX - mouse_x;
        left_width = left_width < min_width ? min_width : left_width;
        left_width = left_width > max_width ? max_width : left_width;
        sidebarWidth.style.width = left_width + "px";
        mainContainer.style.marginLeft = left_width + "px";
      };
      document.onmouseup = function (e) {
        document.onmousemove = null;
        document.onmouseup = null;
        // 本地保存
        // localStorage.setItem("sliderWidth", menuleft.style.width);
      };
    };
  },

//拖拽宽度的改变
methods:{
 // 动态获取左侧菜单的宽度
   MuneResize(data) {
     // 拿到左侧菜单父元素
     const leftDom = document.getElementById(`${data.targetId}`);
     // 拿到右侧内容父元素
     const mainContainer =
       document.getElementsByClassName("main-container")[0];
       mainContainer.style.marginLeft = leftDom.clientWidth + "px";
    },
}

根据菜单内容自动撑开宽度

// 自定义指令 获取当前菜单的宽度
  directives: {
    resize: {
      // 指令的名称
      bind(el, binding) {
        // el为绑定的元素,binding为绑定给指令的对象
        let _width = "";
        function isReize() {
          const style = document.defaultView.getComputedStyle(el);
          if (_width !== style.width) {
            binding.value({ width: style.width, targetId: el.id });
            _width = style.width;
          }
        }
        el.__vueSetInterval__ = setInterval(isReize, 300);
      },
      unbind(el) {
        clearInterval(el.__vueSetInterval__);
      },
    },
  },
...其他methods

样式:

#app .sidebar-container {
  display: flex;
}
#drap-meuline {
  background: transparent;
  width: 4px;
  cursor: e-resize; //设置鼠标悬浮上去显示可拖拽样式
}

相关文章:

  • 论文阅读:2023-arxiv Can AI-Generated Text be Reliably Detected?
  • Ubuntu22.04虚拟机里安装Yolov8流程
  • 使用redis客户端中对于json数据格式的存储和读取
  • 在LORA训练中,LORA模型的矩阵的行列是多少
  • 【ARM中R0寄存器】
  • 基于k3s部署Nginx、MySQL、Golang和Redis的详细教程
  • 文件解析漏洞
  • 协程池是调用端并发请求的缓释胶囊
  • 每日定投40刀BTC(9)20250312 - 20250315
  • 剑指 Offer II 078. 合并排序链表
  • 一对一交友App源码开发新趋势:精准匹配与多元盈利模式解析
  • 微服务即时通信系统---(八)用户管理子服务
  • 目标检测任务,如何区分两个相近似的目标
  • 3.17日Man2Marine
  • 卓越的用户体验需要智能内容
  • 【css酷炫效果】纯CSS实现气泡上升动画
  • C语言及内核开发中的回调机制与设计模式分析
  • 【NLP】 12. 解决不同长度文本问题,RNN, LSTM,双重RNN,双向递归神经网络
  • 【css酷炫效果】纯CSS实现立体纸张折叠动效
  • 《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下)
  • 游客曝九寨沟打网约车被出租车围堵,景区回应:当地无合规网约车
  • 五月院线片单:就看五一档表现了
  • 成都警方:在地铁公共区域用改装设备偷拍女乘客,男子被行拘
  • 总有黑眼圈是因为“虚”吗?怎么睡才能改善?
  • 王星昊再胜连笑,夺得中国围棋天元赛冠军
  • 上海出台灵活就业人员公积金新政:不限户籍、提取自由,6月起施行