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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/390300.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-ui简单入门1.0.0

第一篇&#xff1a;table标签速用 总结&#xff1a;建楼前&#xff0c;先打地基<el-table></el-table>&#xff0c;打完地基看高度&#xff0c;一层楼4米&#xff0c;80米20个<el-table-column></el-table-column>&#xff0c;每次楼的名字是label 第…

HDFS常用命令

HDFS常用命令 1.HDFS命令介绍1.1基本语法格式1.2常用命令 1.HDFS命令介绍 HDFS 提供了一组命令行工具&#xff0c;用于管理和操作 HDFS 文件系统。 1.1基本语法格式 hdfs dfs -<命令> [选项] <参数>1.2常用命令 1.显示<path>指定的文件的详细信息。 had…

webpack打包发布~

1、安装webpack&#xff08;局部安装webpack&#xff09;。 npm i webpack webpack-cli -D 2、安装成功之后&#xff0c;你会在package.json文件中看到这个。 3、新建webpack.config.js文件&#xff0c;里面写配置编译模式&#xff0c;入口出口等&#xff08;这里演示的是单入…

C语言——求阶乘的两种方法

第一种方法使用了递归思想 #include <stdio.h> int fun(int N) {if (N 0){return 1;}else{return (fun(N - 1) * N);} } int main() {int N 0;scanf_s("%d", &N);printf("%d",fun(N)); } 第二种方法用的for循环 #include <stdio.h> i…

《计算机网络》(第8版)第1章 概述 复习笔记

第 1 章 概述 一、计算机网络在信息时代中的作用 计算机网络的两个重要功能&#xff1a; 1 &#xff0e;连通性 指互联网上的用户之间是相互连通的。 2 &#xff0e;共享&#xff08;资源共享&#xff09; 资源共享可以是信息共享、软件共享&#xff0c;也可以是硬件共享。此…

RHCSA第一次作业

目录 1、创建以上目录和文件结构&#xff0c;并将/yasuo目录拷贝4份到/目录下 2、查看系统合法shell 3、查看系统发行版版本 4、查看系统内核版本 5、临时修改主机名 6、为/yasuo/ssh_config文件创建软链接/ssh_config.link到/mulu下 7、创建目录/mulu ,重命名并移动/ss…

计算机网络学习:TCP握手挥手强制连接中断

之前系统学习过TCP协议&#xff0c;但很多地方并不是特别清晰&#xff0c;今天结合抓包情况&#xff0c;再拾一下拾一下>.< 首先看一下TCP数据包的标志位&#xff1a; SYN&#xff1a;简写为S&#xff0c;同步标志位&#xff0c;用于建立会话连接&#xff0c;同步序列号…

Vue3 + cropper 实现裁剪头像的功能(裁剪效果可实时预览、预览图可下载、预览图可上传到SpringBoot后端、附完整的示例代码和源代码)

文章目录 0. 前言1. 裁剪效果&#xff08;可实时预览&#xff09;2. 安装 cropper3. 引入 Vue Cropper3.1 局部引入&#xff08;推荐使用&#xff09;3.2 全局引入 4. 在代码中使用4.1 template部分4.2 script部分 5. 注意事项6. SpringBoot 后端接收图片6.1 UserController.ja…

2024年8月AI内容生成技术的现状与未来:从文生文到跨模态交互的全景分析

2024年8月AI内容生成技术的现状与未来&#xff1a;从文生文到跨模态交互的全景分析 大家好&#xff0c;我是猫头虎&#xff01;&#x1f680; 随着AI在内容生成领域的爆发式发展&#xff0c;从2022年末开始&#xff0c;AI生成技术已经走过了文生文&#xff08;AIGC&#xff09…

空气净化器对去除宠物毛有效吗?小型猫毛空气净化器使用感受

作为一个养猫多年的猫奴&#xff0c;家里有两只可爱的小猫咪&#xff1a;小白和小花。虽然相处起来很开心&#xff0c;但也给生活带来了一些小麻烦。谁懂啊&#xff0c;我真的受够了&#xff0c;每天都在粘毛。猫窝的猫毛一周不清理就要堆成山&#xff0c;空气中也全是浮毛&…

使用 Kibana 和 Vega 构建高级可视化

作者&#xff1a;来自 Carly Richmond 为了解释在 Kibana 中构建 Vega 可视化的基础知识&#xff0c;我将使用此 GitHub 存储库中的 2 个示例。具体来说&#xff0c;我将介绍&#xff1a; 使用 Elasticsearch 聚合进行数据采购轴和标记事件和信号&#xff08;例如工具提示和更…

计算机基本理论与程序运行原理概述

目录 计算机的基本表示方法 计算机的组成 程序运行的原理 指令执行的流水线 编译原理 个人理解 面试题总结 计算机的基本表示方法 计算机系统使用高、低电平来表示逻辑1和0。数据在计算机中的存储、传输和处理均以二进制形式进行。数据通过总线作为电信号进行传输&…

决策树总结

决策树是什么&#xff1f;决策树(decision tree)是一种基本的分类与回归方法。举个通俗易懂的例子&#xff0c;如下图所示的流程图就是一个决策树&#xff0c;长方形代表判断模块(decision block)&#xff0c;椭圆形成代表终止模块(terminating block)&#xff0c;表示已经得出…

用于仅摄像头闭环驾驶的视觉语言模型

CarLLaVA: Vision language models for camera-only closed-loop driving 用于仅摄像头闭环驾驶的视觉语言模型 Abstract In this technical report, we present CarLLaVA, a Vision Language Model (VLM) for autonomous driving, developed for the CARLA Autonomous Driv…

kafka从浅入深

一、什么是kafka&#xff1f; kafka本质上是一个消息队列MQ&#xff08;Message Queue&#xff09;&#xff0c;用做数据流转。 1.使用消息队列的好处&#xff1f; 1.1、解耦&#xff1a;允许独立扩展或修改队列两头的处理过程&#xff1b; 1.2、可恢复性&#xff1a;即使一个…

中文网址导航模版HaoWa1.3.1/模版网站wordpress导航主题

HaoWa v1.3.1由挖主题开发的一款网址导航类主题。 HaoWA主题除主体导航列表外&#xff0c;对主题所需的小模块都进行了开放式的HTML编辑器形式的功能配置&#xff0c;同时预留出默认的代码结构&#xff0c;方便大家在现有的代码结构上进行功能调整。 同时加入了字体图标Font …

鸿蒙系统学习指南

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f421;&#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼 &#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前…

【全国大学生电子设计竞赛】2022年F题

&#x1f970;&#x1f970;全国大学生电子设计大赛学习资料专栏已开启&#xff0c;限时免费&#xff0c;速速收藏~

深入理解同城代驾系统源码:技术架构与实现细节

今天&#xff0c;小编将深入讲解同城代驾系统的技术架构与实现细节。 一、同城代驾系统的基本功能模块 一个完整的同城代驾系统通常包括以下核心功能模块&#xff1a; 1.用户端应用 2.司机端应用 3.后台管理系统 4.消息推送与通知 二、技术架构设计 同城代驾系统的技术架…

《Transformer Scale Gate for Semantic Segmentation》CVPR2023

摘要 论文提出了一种名为Transformer Scale Gate&#xff08;TSG&#xff09;的模块&#xff0c;用于优化在语义分割任务中多尺度上下文信息的编码。现有的基于Transformer的分割模型在组合不同尺度的特征时没有进行选择&#xff0c;这可能导致次优尺度的特征降低分割的准确性…