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

JavaScript和vue实现左右两栏,中间拖动按钮可以拖动左右两边的宽度

JavaScript实现:

<!DOCTYPE html>
<html lang="en">
<head><title>拖动效果</title><style>
body, html {margin: 0;padding: 0;height: 100%;font-family: Arial, sans-serif;
}.container {display: flex;height: 100vh;position: relative;
}.left-column, .right-column {flex-grow: 1;padding: 20px;box-sizing: border-box;
}.left-column {background-color: #f0f0f0;
}.right-column {background-color: #e0e0e0;
}.divider {position: absolute;top: 0;bottom: 0;width: 10px;cursor: ew-resize;background-color: #ccc;z-index: 1;left: calc(33.333% - 5px); /* 初始位置设为 33.333% 宽度减去一半的分割线宽度 */
}.handle {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 20px;height: 20px;background-color: #666;border-radius: 50%;cursor: ew-resize;
}</style>
</head>
<body><div class="container"><div class="left-column"><h2>Left Column</h2><p>This is the left column.</p></div><div class="divider" id="divider"><span class="handle"></span></div><div class="right-column"><h2>Right Column</h2><p>This is the right column.</p></div></div><script>
// scripts.jsdocument.addEventListener('DOMContentLoaded', function() {const divider = document.getElementById('divider');let isDragging = false;let initialX = 0;let initialWidth = 0;const container = document.querySelector('.container');// 设置初始位置const initialLeftPosition = container.offsetWidth * (1/3) - divider.offsetWidth / 2;divider.style.left = `${initialLeftPosition}px`;document.querySelector('.left-column').style.width = `${initialLeftPosition + divider.offsetWidth}px`;document.querySelector('.right-column').style.width = `${container.offsetWidth - (initialLeftPosition + divider.offsetWidth)}px`;// 监听鼠标按下事件divider.addEventListener('mousedown', function(e) {isDragging = true;initialX = e.clientX;initialWidth = divider.offsetLeft;document.addEventListener('mousemove', drag);document.addEventListener('mouseup', stopDragging);});// 监听鼠标移动事件function drag(e) {if (!isDragging) return;const delta = e.clientX - initialX;const newLeftPosition = initialWidth + delta;const maxWidth = container.offsetWidth - divider.offsetWidth;const minWidth = 150; // 设定最小宽度const maxWidthLeft = maxWidth / 2; // 左侧最大宽度为一半的容器宽度const maxWidthRight = maxWidth / 2; // 右侧最大宽度为一半的容器宽度if (newLeftPosition >= minWidth && newLeftPosition <= maxWidthLeft) {divider.style.left = `${newLeftPosition}px`;document.querySelector('.left-column').style.width = `${newLeftPosition + divider.offsetWidth}px`;document.querySelector('.right-column').style.width = `${maxWidth - newLeftPosition}px`;}}// 监听鼠标抬起事件function stopDragging() {isDragging = false;document.removeEventListener('mousemove', drag);document.removeEventListener('mouseup', stopDragging);}
});</script>
</body>
</html>

Vue2实现:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue 2拖动效果</title><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><style>
/* styles.css */body, html {margin: 0;padding: 0;height: 100%;font-family: Arial, sans-serif;
}.container {display: flex;height: 100vh;position: relative;
}.left-column, .right-column {flex-grow: 1;padding: 20px;box-sizing: border-box;
}.left-column {background-color: #f0f0f0;
}.right-column {background-color: #e0e0e0;
}.divider {position: absolute;top: 0;bottom: 0;width: 10px;cursor: ew-resize;background-color: #ccc;z-index: 1;left: 0; /* 调整初始位置为 0 */
}.handle {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 20px;height: 20px;background-color: #666;border-radius: 50%;cursor: ew-resize;
}</style>
</head>
<body><div id="app"><div class="container"><div class="left-column" :style="{width: leftColumnWidth + 'px'}"><h2>Left Column</h2><p>This is the left column.</p></div><div class="divider" ref="divider" @mousedown="startDragging"><span class="handle"></span></div><div class="right-column" :style="{width: rightColumnWidth + 'px'}"><h2>Right Column</h2><p>This is the right column.</p></div></div></div>
<script>new Vue({el: '#app',data: {leftColumnWidth: 300,rightColumnWidth: 0,isDragging: false,initialX: 0,initialWidth: 0,containerWidth: 0,minWidth: 150, // 最小宽度maxWidth: 0, // 最大宽度},mounted() {this.containerWidth = document.querySelector('.container').clientWidth;this.maxWidth = Math.floor(this.containerWidth / 2) - 10; // 减去分割线的宽度this.rightColumnWidth = this.containerWidth - this.leftColumnWidth - 10;document.addEventListener('mousemove', this.drag);document.addEventListener('mouseup', this.stopDragging);// 设置初始位置const divider = this.$refs.divider;divider.style.left = `${this.leftColumnWidth}px`;},methods: {startDragging(e) {this.isDragging = true;this.initialX = e.clientX;this.initialWidth = this.leftColumnWidth;},drag(e) {if (!this.isDragging) return;const delta = e.clientX - this.initialX;const newLeftWidth = this.initialWidth + delta;if (newLeftWidth >= this.minWidth && newLeftWidth <= this.maxWidth) {this.leftColumnWidth = newLeftWidth;this.rightColumnWidth = this.containerWidth - newLeftWidth - 10;// 更新 divider 的位置const divider = this.$refs.divider;divider.style.left = `${this.leftColumnWidth}px`;}},stopDragging() {this.isDragging = false;}}
});
</script>
</body>
</html>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 全排列的 Java 实现
  • Springcloud-Nacos
  • OpenStack入门体验
  • 掩码、反掩码、通配符的区别和计算方式
  • 使用s3cmd 2.x 与 Cyberduck 管理在 DigitalOcean Spaces 对象存储中的数据
  • 全网最适合入门的面向对象编程教程:30 Python的内置数据类型-object根类
  • 缓存策略自定义:Laravel应用性能优化秘籍
  • 虚拟机(CentOS7)安装jenkins
  • ubuntu安装nginx以及php的部署
  • STL—vector—模拟实现【深度理解vector】【模拟实现vector基本接口】
  • WebLogic: CVE-2020-14882/14883【getshell】
  • C语言自定义类型结构体与位段超详解
  • 如果一台Riscv FreeBSD系统没有pkg怎么办?
  • 基于深度学习的自动化模型设计
  • VS Code设置C++编译器路径
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 08.Android之View事件问题
  • Android开源项目规范总结
  • ECMAScript入门(七)--Module语法
  • Git的一些常用操作
  • JavaScript HTML DOM
  • SQLServer之创建显式事务
  • windows下mongoDB的环境配置
  • yii2中session跨域名的问题
  • 动态魔术使用DBMS_SQL
  • 盘点那些不知名却常用的 Git 操作
  • 深度解析利用ES6进行Promise封装总结
  • 学习使用ExpressJS 4.0中的新Router
  • 最简单的无缝轮播
  • 阿里云服务器购买完整流程
  • ​Redis 实现计数器和限速器的
  • #13 yum、编译安装与sed命令的使用
  • #java学习笔记(面向对象)----(未完结)
  • $.ajax中的eval及dataType
  • (6)添加vue-cookie
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (TOJ2804)Even? Odd?
  • (分布式缓存)Redis持久化
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (十三)Flask之特殊装饰器详解
  • (五)activiti-modeler 编辑器初步优化
  • (原)Matlab的svmtrain和svmclassify
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Mysql的优化设置
  • (转)关于pipe()的详细解析
  • *上位机的定义
  • .NET基础篇——反射的奥妙
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /bin/bash^M: bad interpreter: No such file or directory
  • @ComponentScan比较
  • @SuppressLint(NewApi)和@TargetApi()的区别