element-ui 抽屉组件(el-drawer ) 二次封装 增加resize拖曳改变宽度大小
<template> <div :id="`drawer_container_${id}`"> <el-drawer :id="id+'_drawer'" :wrapperClosable="false" @close="onClose" v-if="isShowDraw" :visible.sync="isShowDraw" :direction="direction" :size="sizePercentLabel"> <template slot="title"> <slot name="title"></slot> </template> <div v-if="isIframe && isShowIframeModal" class="iframe-model"></div> <slot></slot> </el-drawer> </div> </template> <script> export default { name: 'Drawer', data() { return { isShowDraw: this.isShow, sizePercentDraw: this.sizePercent, drawerElement: null, isEffectiveEdge: false, isMouseDown: false, isShowIframeModal: false } }, computed: { sizePercentLabel() { return this.sizePercentDraw * 100 + '%' } }, props: { id: { type: String, default: 'my' }, sizePercent: { type: Number, default: .6 }, isShow: { type: Boolean, default: false }, direction: { type: String, default: 'rtl' }, minSizePercent: { type: Number, default: .4 }, maxSizePercent: { type: Number, default: .99 }, isIframe: { //内容里如果包含iframe 需要单独处理resize type: Boolean, default: false }, moveEdge: { type: Number, default: 10 }, }, watch: { isShow(value) { this.isShowDraw = value value ? this.bindEvents() : this.unbindEvents() } }, beforeDestroy() { this.unbindEvents() }, methods: { onClose() { this.isShowDraw = false this.$emit('update:isShow', false); }, bindEvents() { const containerElement = document.getElementById(`drawer_container_${this.id}`) if (containerElement) { containerElement.addEventListener('mousemove', this.onMouseMove) containerElement.addEventListener('mousedown', this.onMouseDown) containerElement.addEventListener('mouseup', this.onMouseUp) } }, unbindEvents() { const containerElement = document.getElementById(`drawer_container_${this.id}`) if (containerElement) { containerElement.removeEventListener('mousemove', this.onMouseMove) containerElement.removeEventListener('mousedown', this.onMouseDown) containerElement.removeEventListener('mouseup', this.onMouseUp) } }, isMoveToEdge(clientX) { this.drawerElement = document.getElementById(this.id + '_drawer') const { width } = this.drawerElement.getBoundingClientRect() //实际遮罩范围宽度 const modalWidth = width * (1 - this.sizePercentDraw) //3像素是边缘范围 return clientX <= modalWidth + this.moveEdge && clientX >= modalWidth - this.moveEdge }, onMouseMove({ clientX }) { if (this.isMouseDown) { //动态改变宽度 const { width } = this.drawerElement.getBoundingClientRect() if (clientX < width) { const tempSizePercent = (width - clientX) / width if (tempSizePercent >= this.minSizePercent && tempSizePercent <= this.maxSizePercent) { this.sizePercentDraw = tempSizePercent.toFixed(2) } } } //处理鼠标移到到边缘 if (this.isMoveToEdge(clientX) || this.isMouseDown) { this.isEffectiveEdge = true this.drawerElement.style.cursor = 'e-resize' } else { this.isEffectiveEdge = false this.drawerElement.style.cursor = 'default' } }, onMouseDown() { //处理鼠标移到到边缘 然后按下 if (this.isEffectiveEdge) { this.isMouseDown = true } //处理iframe 遮罩层 this.isShowIframeModal = true }, onMouseUp() { this.isMouseDown = false this.isShowIframeModal = false } } } </script> <style lang="scss" scoped> .iframe-model { width: 100%; height: 100%; position: absolute; z-index: 3000; filter: alpha(opacity=0); opacity: 0; background: transparent; } </style>
倒过来看 please~~~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2015-09-23 折腾一两天,终于学会使用grunt压缩合并混淆JS脚本,小激动,特意记录一下+spm一点意外收获