vue前端自適應(yīng)布局實(shí)現(xiàn)教程(一步到位所有自適應(yīng))
頁面展示
實(shí)現(xiàn)內(nèi)容
1,左右布局
- 左側(cè)固定寬帶,右側(cè)自適應(yīng)剩余的寬度。
- 中間一條分割線,可以拖拉,自適應(yīng)調(diào)整左右側(cè)的寬度。
- 左側(cè)的高度超長自動出現(xiàn)橫向滾動條,左側(cè)寬度超長,自動出現(xiàn)豎向滾動條。
2,上中下布局
- 最上面的 搜索條件 div 固定占用 100 px 高度,下面的 查詢條件 div 固定占用 30 px 高度,最下面的分頁固定占用高度,頁面剩下的高度自動分配給中間的表格內(nèi)容。
- 表格內(nèi)容高度超過后自動出現(xiàn)豎向滾動條,寬度超出后自動出現(xiàn)橫向滾動條。
- 點(diǎn)擊按鈕,可以 隱藏/顯示 搜索條件 div 里面的內(nèi)容。
- 當(dāng)隱藏 搜索條件 div 里面的內(nèi)容時,中間表格的高度為:整個頁面的高度—操作按鈕div的高度—分頁div的高度。
- 當(dāng)搜索條件 div 里面的內(nèi)容時,中間表格的高度為:整個頁面的高度—搜索條件div的高度—操作按鈕div的高度—分頁div的高度。
2,分辨率自適應(yīng) - 加載即動態(tài)實(shí)時計(jì)算高度,寬度
實(shí)現(xiàn)代碼
vue2 語法實(shí)現(xiàn)
<template> <div class="app-container"> <div class="left" :style="{ width: leftWidth + 'px' }"> <div class="right-center-left"> 左邊的內(nèi)容,可以很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />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; // 計(jì)算 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 語法實(shí)現(xiàn)
<template> <div class="app-container"> <div class="left" :style="{ width: leftWidth + 'px' }"> 左邊的內(nèi)容,可以很長很長很長很長很長很長很長很長很長很長很長很長很長很長很長<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />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' }"> 表格內(nèi)容<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br /> 1<br />1<br />1<br />1<br />1<br />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">分頁內(nèi)容</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; /* 左右對齊內(nèi)容 */ 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>
實(shí)現(xiàn)感想
這個功能,從畢業(yè)就開始思索,直到八年后的今天成熟完善,真是艱辛也是很不容易。目前市面上沒有見過有人實(shí)現(xiàn),很多人都是只言片語的,基本復(fù)制下來,無法達(dá)到效果。我這個一鍵復(fù)制到自己的項(xiàng)目,就能實(shí)現(xiàn)了,中間的坎坷不平,到了完全實(shí)現(xiàn)的這一刻,才覺得激動不已。
無任何坑,也沒有任何額外的引入,一個普普通通,最簡單的vue頁面,布局建好,里面的內(nèi)容就可以自己隨意發(fā)揮了。
總結(jié)
到此這篇關(guān)于vue前端自適應(yīng)布局實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)vue前端自適應(yīng)布局內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3動態(tài)使用KeepAlive組件的實(shí)現(xiàn)步驟
在 Vue 3 項(xiàng)目中,我們有時需要根據(jù)路由的 meta 信息來動態(tài)決定是否使用 KeepAlive 組件,以控制組件的緩存行為,所以本文給大家介紹了Vue3動態(tài)使用KeepAlive組件的實(shí)現(xiàn)步驟,通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-11-11Vue前端開發(fā)之實(shí)現(xiàn)交錯過渡動畫效果
這篇文章主要為大家詳細(xì)介紹了如何通過Vue實(shí)現(xiàn)交錯過渡動畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11vue3+springboot部署到Windows服務(wù)器的詳細(xì)步驟
這篇文章主要介紹了vue3+springboot部署到Windows服務(wù)器,配置Nginx時,因?yàn)楝F(xiàn)在是把vue前端交給了Nginx代理,所以這里的端口號不一定是我們在vue項(xiàng)目中設(shè)置的端口號,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-10-10