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

vue前端自适应布局,一步到位所有自适应

页面展示

在这里插入图片描述
在这里插入图片描述

实现内容

1,左右布局

  • 左侧固定宽带,右侧自适应剩余的宽度。
  • 中间一条分割线,可以拖拉,自适应调整左右侧的宽度。
  • 左侧的高度超长自动出现横向滚动条,左侧宽度超长,自动出现竖向滚动条。

2,上中下布局

  • 最上面的 搜索条件 div 固定占用 100 px 高度,下面的 查询条件 div 固定占用 30 px 高度,最下面的分页固定占用高度,页面剩下的高度自动分配给中间的表格内容。
  • 表格内容高度超过后自动出现竖向滚动条,宽度超出后自动出现横向滚动条。
  • 点击按钮,可以 隐藏/显示 搜索条件 div 里面的内容。
  • 当隐藏 搜索条件 div 里面的内容时,中间表格的高度为:整个页面的高度—操作按钮div的高度—分页div的高度。
  • 当搜索条件 div 里面的内容时,中间表格的高度为:整个页面的高度—搜索条件div的高度—操作按钮div的高度—分页div的高度。
    2,分辨率自适应
  • 加载即动态实时计算高度,宽度
实现代码

vue2 语法实现

<template><div class="app-container"><div class="left" :style="{ width: leftWidth + 'px' }"><div class="right-center-left">左边的内容,可以很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /></div></div><div class="divider" @mousedown="startDragging"></div><div class="right"><div v-if="showDiv1" class="div1">查询条件</div><div class="div2"><button @click="toggleDiv1">操作按钮 div1</button></div><div class="div3" :style="{ height: div3Height + 'px' }">1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /></div><div class="div4">分页</div></div></div>
</template><script>
export default {name: "AppContainer",data() {return {isDragging: false,leftWidth: 200,showDiv1: true};},computed: {div3Height() {const totalHeight = window.innerHeight;const div2Height = 30;const div4Height = 30;const div1Height = this.showDiv1 ? 100 : 0;// 计算 div3 的高度return totalHeight - div2Height - div4Height - div1Height;}},methods: {startDragging(e) {this.isDragging = true;document.addEventListener("mousemove", this.onDrag);document.addEventListener("mouseup", this.stopDragging);},onDrag(e) {if (this.isDragging) {const minWidth = 50;const maxWidth = window.innerWidth - 50;const newLeftWidth = e.clientX;if (newLeftWidth > minWidth && newLeftWidth < maxWidth) {this.leftWidth = newLeftWidth;}}},stopDragging() {this.isDragging = false;document.removeEventListener("mousemove", this.onDrag);document.removeEventListener("mouseup", this.stopDragging);},toggleDiv1() {this.showDiv1 = !this.showDiv1;}}
};
</script><style scoped>
.app-container {display: flex;height: 100vh;overflow: hidden;
}.left {overflow-x: auto;overflow-y: auto;white-space: nowrap;min-width: 90px;
}.divider {width: 5px;cursor: ew-resize;background-color: #ccc;
}.right {display: flex;flex-direction: column;height: 100%;flex: 1; /* 自动填满剩余宽度 */
}.div1 {height: 100px;background-color: #f0f0f0;
}.div2 {height: 30px;background-color: #ddd;
}.div3 {overflow-x: auto; /* 添加横向滚动条 */overflow-y: auto; /* 添加纵向滚动条 */background-color: #f5f5f5;
}.div4 {height: 200px;background-color: #ccc;
}
</style>

vue3 语法实现

<template><div class="app-container"><div class="left" :style="{ width: leftWidth + 'px' }">左边的内容,可以很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /></div><div class="divider" @mousedown="startDragging"></div><div class="right"><div v-if="showQueryDiv" class="right-query">搜索条件</div><div class="right-button"><div class="right-button-left">操作按钮</div><div class="right-button-right"><button @click="toggleQueryDiv">隐藏/展示 搜索条件</button></div></div><div class="right-table" :style="{ height: tableHeight + 'px' }">表格内容<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /></div><div class="right-page">分页内容</div></div></div>
</template><script>
import { ref, computed, onMounted, onUnmounted } from 'vue';export default {name: "AppContainer",setup() {const isDragging = ref(false);const leftWidth = ref(200);const showQueryDiv = ref(true);const tableHeight = computed(() => {const totalHeight = window.innerHeight;const buttonHeight = 30;const pageHeight = 30;const queryHeight = showQueryDiv.value ? 100 : 0;return totalHeight - buttonHeight - pageHeight - queryHeight;});const startDragging = (e) => {isDragging.value = true;document.addEventListener("mousemove", onDrag);document.addEventListener("mouseup", stopDragging);};const onDrag = (e) => {if (isDragging.value) {const minWidth = 50;const maxWidth = window.innerWidth - 50;const newLeftWidth = e.clientX;if (newLeftWidth > minWidth && newLeftWidth < maxWidth) {leftWidth.value = newLeftWidth;}}};const stopDragging = () => {isDragging.value = false;document.removeEventListener("mousemove", onDrag);document.removeEventListener("mouseup", stopDragging);};const toggleQueryDiv = () => {showQueryDiv.value = !showQueryDiv.value;};onMounted(() => {window.addEventListener("resize", onDrag);});onUnmounted(() => {window.removeEventListener("resize", onDrag);});return {leftWidth,showQueryDiv,tableHeight,startDragging,toggleQueryDiv};}
};
</script><style scoped>
.app-container {display: flex;height: 100vh;overflow: hidden;
}.left {overflow-x: auto;overflow-y: auto;white-space: nowrap;min-width: 90px;
}.divider {width: 5px;cursor: ew-resize;background-color: #ccc;
}.right {display: flex;flex-direction: column;height: 100%;flex: 1; /* 自动填满剩余宽度 */
}.right-query {height: 100px;background-color: #f0f0f0;
}.right-button {height: 30px;display: flex;justify-content: space-between; /* 左右对齐内容 */align-items: center; /* 垂直居中对齐 */background-color: #ddd;
}.right-button-left {margin-left: 5px;text-align: left;
}.right-button-right {margin-right: 5px;text-align: right;
}.right-table {overflow-x: auto; /* 添加横向滚动条 */overflow-y: auto; /* 添加纵向滚动条 */background-color: #f5f5f5;
}.right-page {height: 200px;background-color: #ccc;
}
</style>
实现感想

这个功能,从毕业就开始思索,直到八年后的今天成熟完善,真是艰辛也是很不容易。目前市面上没有见过有人实现,很多人都是只言片语的,基本复制下来,无法达到效果。我这个一键复制到自己的项目,就能实现了,中间的坎坷不平,到了完全实现的这一刻,才觉得激动不已。

无任何坑,也没有任何额外的引入,一个普普通通,最简单的vue页面,布局建好,里面的内容就可以自己随意发挥了。

未觉池塘春草梦,阶前梧叶已秋声。记录激动时刻,也造福后来人。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【vulnhub】WebDeveloper:1靶机
  • Linux下如何使用Netcat进行网络调试
  • 网络剪枝——network-slimming 项目复现
  • 剖析HTML 元素——WEB开发系列02
  • Excutors创建线程池
  • VisionPro二次开发学习笔记11-使用 Caliper和Fixture定位Blob工具检测方块
  • 【C++】string的模拟实现
  • Python | Leetcode Python题解之第330题按要求补齐数组
  • hdu7471 最优K子段(口胡题解 二分+贪心+随机化)
  • 深入探索Webkit的Web Authentication API:安全与便捷的融合
  • Flutter简介
  • 在Ubuntu 14.04上安装Git的方法
  • CentOS 7 安装详细教程
  • JavaScript高阶笔记总结(Xmind格式):第一天
  • LLM - 使用 Ollama + OpenWebUI 在 Linux 服务器中高效部署大语言模型
  • canvas 绘制双线技巧
  • download使用浅析
  • ES6核心特性
  • exif信息对照
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java|序列化异常StreamCorruptedException的解决方法
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • node和express搭建代理服务器(源码)
  • Odoo domain写法及运用
  • PermissionScope Swift4 兼容问题
  • React-生命周期杂记
  • tab.js分享及浏览器兼容性问题汇总
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从PHP迁移至Golang - 基础篇
  • 飞驰在Mesos的涡轮引擎上
  • 分布式熔断降级平台aegis
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 简单实现一个textarea自适应高度
  • 聊聊directory traversal attack
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 树莓派 - 使用须知
  • 微信小程序开发问题汇总
  • 一文看透浏览器架构
  • 运行时添加log4j2的appender
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 正则表达式-基础知识Review
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​批处理文件中的errorlevel用法
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #mysql 8.0 踩坑日记
  • #每天一道面试题# 什么是MySQL的回表查询
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (ibm)Java 语言的 XPath API
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (备忘)Java Map 遍历
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot优课在线教学系统 毕业设计 081251