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

news/2024/9/22 16:33:43/

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>


http://www.ppmy.cn/news/1504135.html

相关文章

7月29日前端学习笔记

今日内容: setInterval setTimeout js基本语法 js是脚本语言&#xff0c;使用<script></script>标签&#xff0c;写在</body>的上面&#xff1b;弱类型语言 变量可以指向任意的量。 定义函数 function easymethod(){}//常规设置 var Methodfunction(…

探索有赞小程序:揭秘其强大的组件库功能!

有赞小程序组件库是针对有赞小程序开发者提供的一套组件&#xff0c;它提供了丰富的功能和样式&#xff0c;方便开发者快速搭建和定制各种有赞小程序页面。下面将从四个方面对有赞小程序组件库的功能做详细的阐述。 1、UI组件 可实时在线编辑的设计工具——即时设计https://a…

C++篇:C++入门基础(1)

C前言&#xff1a; C 的发展历史可以追溯到1979年&#xff0c;当时C语言以其效率和灵活性成为广泛使用的系统编程语言&#xff0c;但它也有一些限制&#xff0c;例如缺乏直接支持面向对象编程&#xff08;OOP&#xff09;的特性。 之后Bjarne Stroustrup(也就是C之父)是C的创始…

现代体育运动的特征与21世纪发展取向:融合、创新与可持续的赛道

现代体育运动的特征与21世纪发展取向&#xff1a;融合、创新与可持续的赛道 引言 在21世纪的曙光中&#xff0c;体育运动作为人类文化的重要组成部分&#xff0c;正以前所未有的速度演变和发展。它不仅承载着强身健体、竞技比拼的传统功能&#xff0c;更在全球化、数字化的浪…

Nvidia黄仁勋对话Meta扎克伯格:AI和下一代计算平台的未来 | SIGGRAPH 2024对谈回顾

在今年的SIGGRAPH图形大会上&#xff0c;Nvidia创始人兼CEO黄仁勋与Meta创始人马克扎克伯格进行了一场长达60分钟的对谈。这场对话不仅讨论了AI的未来发展和Meta的开源哲学&#xff0c;还发布了不少新产品&#xff0c;并深入探讨了下一代计算平台的可能性。 引言 人工智能的发…

【过题记录】 8.2 hddx

飞行棋 关于这一题 我在考场上手莫了n2和n3的情况 发现一点规律&#xff0c;大力猜想蒙了一个结论 结果蒙对了… 关于正确做法&#xff0c;发现零号点和其他几个点是不一样的。 因为对于0而言&#xff0c;他没有赠送的情况(只要摇到n就直接胜利) 因此0和其他点要分开讨论 对于…

图像处理案例03

HOGSVM数字识别 1 . 步骤2 . 代码 1 . 步骤 读入数据&#xff0c;把数据划分为训练集和测试集用hog提取特征用SVM训练数据测试、评价模型保存模型加载模型&#xff0c;应用模型 2 . 代码 import os import cv2 import sklearn import numpy as np from skimage.feature impo…

【数据结构】——链式二叉树

目录 一、链式二叉树的定义结构 二、链式二叉树的遍历 2.1前序遍历 2.2中序遍历 2.3后序遍历 2.4层序遍历 三、链式二叉树的基本功能函数 3.1结点个数 3.2叶子结点个数 3.3二叉树第k层结点个数 3.4查找值为x的结点 3.5二叉树的销毁 四、基础OJ 4.1二叉树遍历 4.2…